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.
145 lines
3.7 KiB
145 lines
3.7 KiB
/* |
|
* upb - a minimalist implementation of protocol buffers. |
|
|
|
* Copyright (c) 2009 Joshua Haberman. See LICENSE for details. |
|
* |
|
* This file contains shared definitions that are widely used across upb. |
|
*/ |
|
|
|
#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 |
|
|
|
/* Branch prediction hints for GCC. */ |
|
#ifdef __GNUC__ |
|
#define likely(x) __builtin_expect((x),1) |
|
#define unlikely(x) __builtin_expect((x),0) |
|
#else |
|
#define likely(x) (x) |
|
#define unlikely(x) (x) |
|
#endif |
|
|
|
/* inline if possible, emit standalone code if required. */ |
|
#ifndef INLINE |
|
#define INLINE static inline |
|
#endif |
|
|
|
/* The maximum that any submessages can be nested. Matches proto2's limit. */ |
|
#define UPB_MAX_NESTING 64 |
|
|
|
/* The maximum number of fields that any one .proto type can have. */ |
|
#define UPB_MAX_FIELDS (1<<16) |
|
|
|
/* Nested type names are separated by periods. */ |
|
#define UPB_SYMBOL_SEPARATOR '.' |
|
#define UPB_SYMBOL_MAX_LENGTH 256 |
|
|
|
#define UPB_INDEX(base, i, m) (void*)((char*)(base) + ((i)*(m))) |
|
|
|
INLINE uint32_t max(uint32_t a, uint32_t b) { return a > b ? a : b; } |
|
|
|
/* 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; |
|
|
|
/* Label (optional, repeated, required) as defined in a .proto file. The values |
|
* of this are defined by google.protobuf.FieldDescriptorProto.Label (from |
|
* descriptor.proto). */ |
|
typedef uint8_t upb_label_t; |
|
|
|
struct upb_type_info { |
|
uint8_t align; |
|
uint8_t size; |
|
uint8_t expected_wire_type; |
|
}; |
|
|
|
/* Contains information for all .proto types. Indexed by upb_field_type_t. */ |
|
extern struct upb_type_info upb_type_info[]; |
|
|
|
/* A pointer to a .proto value. The owner must have an out-of-band way of |
|
* knowing the type, so it knows which union member to use. */ |
|
union upb_value { |
|
double _double; |
|
float _float; |
|
int32_t int32; |
|
int64_t int64; |
|
uint32_t uint32; |
|
uint64_t uint64; |
|
bool _bool; |
|
struct upb_string **string; |
|
struct upb_array **array; |
|
void *message; |
|
}; |
|
|
|
union upb_value_ptr { |
|
double *_double; |
|
float *_float; |
|
int32_t *int32; |
|
int64_t *int64; |
|
uint32_t *uint32; |
|
uint64_t *uint64; |
|
bool *_bool; |
|
struct upb_string **string; |
|
struct upb_array **array; |
|
void **message; |
|
void *_void; |
|
}; |
|
|
|
union upb_symbol_ref { |
|
struct upb_msg *msg; |
|
struct upb_enum *_enum; |
|
struct upb_svc *svc; |
|
}; |
|
|
|
/* The number of a field, eg. "optional string foo = 3". */ |
|
typedef int32_t upb_field_number_t; |
|
|
|
/* Status codes used as a return value. Codes >0 are not fatal and can be |
|
* resumed. */ |
|
typedef enum upb_status { |
|
UPB_STATUS_OK = 0, |
|
|
|
// The input byte stream ended in the middle of a record. |
|
UPB_STATUS_NEED_MORE_DATA = 1, |
|
|
|
// The user value callback opted to stop parsing. |
|
UPB_STATUS_USER_CANCELLED = 2, |
|
|
|
// 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_ERROR_ILLEGAL = -6 |
|
} upb_status_t; |
|
|
|
#define UPB_CHECK(func) do { \ |
|
upb_status_t status = func; \ |
|
if(status != UPB_STATUS_OK) return status; \ |
|
} while (0) |
|
|
|
#ifdef __cplusplus |
|
} /* extern "C" */ |
|
#endif |
|
|
|
#endif /* UPB_H_ */
|
|
|