Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.8 KiB
114 lines
2.8 KiB
/* |
|
* upb - a minimalist implementation of protocol buffers. |
|
* |
|
* Copyright (c) 2009 Joshua Haberman. See LICENSE for details. |
|
*/ |
|
|
|
#ifndef UPB_H_ |
|
#define UPB_H_ |
|
|
|
#include <stdbool.h> |
|
#include <stdint.h> |
|
#include <stdio.h> /* for size_t. */ |
|
#include <string.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* Portable inlining strategy: use C99 rules except on GCC. |
|
* see: http://www.greenend.org.uk/rjk/2003/03/inline.html. */ |
|
#ifndef INLINE |
|
# if __GNUC__ && !__GNUC_STDC_INLINE__ |
|
# define INLINE extern inline |
|
# else |
|
# define INLINE inline |
|
# endif |
|
#endif |
|
|
|
/* The maximum that any submessages can be nested. Matches proto2's limit. */ |
|
#define UPB_MAX_NESTING 64 |
|
|
|
/* Represents a string or bytes. */ |
|
struct upb_string { |
|
void *data; |
|
uint32_t byte_len; |
|
}; |
|
|
|
INLINE bool upb_string_eql(struct upb_string *s1, struct upb_string *s2) { |
|
return s1->byte_len == s2->byte_len && |
|
memcmp(s1->data, s2->data, s1->byte_len) == 0; |
|
} |
|
|
|
/* A list of types as they are encoded on-the-wire. */ |
|
enum upb_wire_type { |
|
UPB_WIRE_TYPE_VARINT = 0, |
|
UPB_WIRE_TYPE_64BIT = 1, |
|
UPB_WIRE_TYPE_DELIMITED = 2, |
|
UPB_WIRE_TYPE_START_GROUP = 3, |
|
UPB_WIRE_TYPE_END_GROUP = 4, |
|
UPB_WIRE_TYPE_32BIT = 5 |
|
}; |
|
typedef uint8_t upb_wire_type_t; |
|
|
|
/* A value as it is encoded on-the-wire, except delimited, which is handled |
|
* separately. */ |
|
union upb_wire_value { |
|
uint64_t varint; |
|
uint64_t _64bit; |
|
uint32_t _32bit; |
|
}; |
|
|
|
/* Value type as defined in a .proto file. The values of this are defined by |
|
* google_protobuf_FieldDescriptorProto_Type (from descriptor.proto). |
|
* Note that descriptor.proto reserves "0" for errors, and we use it to |
|
* represent exceptional circumstances. */ |
|
typedef uint8_t upb_field_type_t; |
|
|
|
/* A value as described in a .proto file, except delimited, which is handled |
|
* separately. */ |
|
union upb_value { |
|
double _double; |
|
float _float; |
|
int32_t int32; |
|
int64_t int64; |
|
uint32_t uint32; |
|
uint64_t uint64; |
|
bool _bool; |
|
uint32_t delim_len; |
|
}; |
|
|
|
/* The number of a field, eg. "optional string foo = 3". */ |
|
typedef int32_t upb_field_number_t; |
|
|
|
/* A tag occurs before each value on-the-wire. */ |
|
struct upb_tag { |
|
upb_field_number_t field_number; |
|
upb_wire_type_t wire_type; |
|
}; |
|
|
|
/* Status codes used as a return value. */ |
|
typedef enum upb_status { |
|
UPB_STATUS_OK = 0, |
|
|
|
// A varint did not terminate before hitting 64 bits. |
|
UPB_ERROR_UNTERMINATED_VARINT = -1, |
|
|
|
// A submessage or packed array ended in the middle of data. |
|
UPB_ERROR_BAD_SUBMESSAGE_END = -2, |
|
|
|
// Input was nested more than UPB_MAX_NESTING deep. |
|
UPB_ERROR_STACK_OVERFLOW = -3, |
|
|
|
// The input data caused the pb's offset (a size_t) to overflow. |
|
UPB_ERROR_OVERFLOW = -4, |
|
|
|
// An "end group" tag was encountered in an inappropriate place. |
|
UPB_ERROR_SPURIOUS_END_GROUP = -5 |
|
} upb_status_t; |
|
|
|
#ifdef __cplusplus |
|
} /* extern "C" */ |
|
#endif |
|
|
|
#endif /* UPB_H_ */
|
|
|