grpcdef.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #ifndef GRPC_DEF_H_
  2. #define GRPC_DEF_H_
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. // Length-Prefixed-Message
  7. // flags:1byte + length:4bytes = 5bytes
  8. #define GRPC_MESSAGE_HDLEN 5
  9. typedef struct {
  10. unsigned char flags;
  11. int length;
  12. } grpc_message_hd;
  13. typedef struct {
  14. unsigned char flags;
  15. int length;
  16. unsigned char* message;
  17. } grpc_message;
  18. static inline void grpc_message_hd_pack(const grpc_message_hd* hd, unsigned char* buf) {
  19. // hton
  20. int length = hd->length;
  21. unsigned char* p = buf;
  22. *p++ = hd->flags;
  23. *p++ = (length >> 24) & 0xFF;
  24. *p++ = (length >> 16) & 0xFF;
  25. *p++ = (length >> 8) & 0xFF;
  26. *p++ = length & 0xFF;
  27. }
  28. static inline void grpc_message_hd_unpack(const unsigned char* buf, grpc_message_hd* hd) {
  29. // ntoh
  30. const unsigned char* p = buf;
  31. hd->flags = *p++;
  32. hd->length = *p++ << 24;
  33. hd->length += *p++ << 16;
  34. hd->length += *p++ << 8;
  35. hd->length += *p++;
  36. }
  37. // protobuf
  38. // tag = field_num << 3 | wire_type
  39. // varint(tag) [+ varint(length_delimited)] + value;
  40. typedef enum {
  41. WIRE_TYPE_VARINT = 0,
  42. WIRE_TYPE_FIXED64 = 1,
  43. WIRE_TYPE_LENGTH_DELIMITED = 2,
  44. WIRE_TYPE_START_GROUP = 3,
  45. WIRE_TYPE_END_GROUP = 4,
  46. WIRE_TYPE_FIXED32 = 5,
  47. } wire_type;
  48. typedef enum {
  49. FIELD_TYPE_DOUBLE = 1,
  50. FIELD_TYPE_FLOAT = 2,
  51. FIELD_TYPE_INT64 = 3,
  52. FIELD_TYPE_UINT64 = 4,
  53. FIELD_TYPE_INT32 = 5,
  54. FIELD_TYPE_FIXED64 = 6,
  55. FIELD_TYPE_FIXED32 = 7,
  56. FIELD_TYPE_BOOL = 8,
  57. FIELD_TYPE_STRING = 9,
  58. FIELD_TYPE_GROUP = 10,
  59. FIELD_TYPE_MESSAGE = 11,
  60. FIELD_TYPE_BYTES = 12,
  61. FIELD_TYPE_UINT32 = 13,
  62. FIELD_TYPE_ENUM = 14,
  63. FIELD_TYPE_SFIXED32 = 15,
  64. FIELD_TYPE_SFIXED64 = 16,
  65. FIELD_TYPE_SINT32 = 17,
  66. FIELD_TYPE_SINT64 = 18,
  67. MAX_FIELD_TYPE = 18,
  68. } field_type;
  69. #define PROTOBUF_MAKE_TAG(field_number, wire_type) ((field_number) << 3 | (wire_type))
  70. #define PROTOBUF_FILED_NUMBER(tag) ((tag) >> 3)
  71. #define PROTOBUF_WIRE_TYPE(tag) ((tag) & 0x07)
  72. // varint little-endian
  73. // MSB
  74. static inline int varint_encode(long long value, unsigned char* buf) {
  75. unsigned char ch;
  76. unsigned char *p = buf;
  77. int bytes = 0;
  78. do {
  79. ch = value & 0x7F;
  80. value >>= 7;
  81. *p++ = value == 0 ? ch : (ch | 0x80);
  82. ++bytes;
  83. } while (value);
  84. return bytes;
  85. }
  86. // @param[IN|OUT] len: in=>buflen, out=>varint bytesize
  87. static inline long long varint_decode(const unsigned char* buf, int* len) {
  88. long long ret = 0;
  89. int bytes = 0;
  90. int bits = 0;
  91. const unsigned char *p = buf;
  92. unsigned char ch;
  93. do {
  94. if (len && *len && bytes == *len) {
  95. break;
  96. }
  97. ch = *p & 0x7F;
  98. ret |= (ch << bits);
  99. bits += 7;
  100. ++bytes;
  101. if (!(*p & 0x80)) break;
  102. ++p;
  103. } while(bytes < 10);
  104. *len = bytes;
  105. return ret;
  106. }
  107. #ifdef __cplusplus
  108. }
  109. #endif
  110. #endif // GRPC_DEF_H_