X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=pb.h;h=76980e4c33d5fc869f3c489f39b82a9c0bf48166;hb=4546bb92dc332ebbfb05a7517028f967b0657725;hp=4e64dded0dbac152c74ddf10c447bb1c29a2f417;hpb=321ca6c1d5736edf6ec2ac0b97eae58227954fad;p=apps%2Fagl-service-can-low-level.git diff --git a/pb.h b/pb.h index 4e64dded..76980e4c 100644 --- a/pb.h +++ b/pb.h @@ -116,11 +116,6 @@ /* List of possible field types. These are used in the autogenerated code. * Least-significant 4 bits tell the scalar type * Most-significant 4 bits specify repeated/required/packed etc. - * - * INT32 and UINT32 are treated the same, as are (U)INT64 and (S)FIXED* - * These types are simply casted to correct field type when they are - * assigned to the memory pointer. - * SINT* is different, though, because it is zig-zag coded. */ typedef uint8_t pb_type_t; @@ -128,32 +123,33 @@ typedef uint8_t pb_type_t; /**** Field data types ****/ /* Numeric types */ -#define PB_LTYPE_VARINT 0x00 /* int32, uint32, int64, uint64, bool, enum */ -#define PB_LTYPE_SVARINT 0x01 /* sint32, sint64 */ -#define PB_LTYPE_FIXED32 0x02 /* fixed32, sfixed32, float */ -#define PB_LTYPE_FIXED64 0x03 /* fixed64, sfixed64, double */ +#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */ +#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */ +#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */ +#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */ +#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */ /* Marker for last packable field type. */ -#define PB_LTYPE_LAST_PACKABLE 0x03 +#define PB_LTYPE_LAST_PACKABLE 0x04 /* Byte array with pre-allocated buffer. * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ -#define PB_LTYPE_BYTES 0x04 +#define PB_LTYPE_BYTES 0x05 /* String with pre-allocated buffer. * data_size is the maximum length. */ -#define PB_LTYPE_STRING 0x05 +#define PB_LTYPE_STRING 0x06 /* Submessage * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMESSAGE 0x06 +#define PB_LTYPE_SUBMESSAGE 0x07 /* Extension pseudo-field * The field contains a pointer to pb_extension_t */ -#define PB_LTYPE_EXTENSION 0x07 +#define PB_LTYPE_EXTENSION 0x08 /* Number of declared LTYPES */ -#define PB_LTYPES_COUNT 8 +#define PB_LTYPES_COUNT 9 #define PB_LTYPE_MASK 0x0F /**** Field repetition rules ****/ @@ -166,6 +162,7 @@ typedef uint8_t pb_type_t; /**** Field allocation types ****/ #define PB_ATYPE_STATIC 0x00 +#define PB_ATYPE_POINTER 0x80 #define PB_ATYPE_CALLBACK 0x40 #define PB_ATYPE_MASK 0xC0 @@ -231,9 +228,17 @@ struct _pb_bytes_array_t { size_t size; uint8_t bytes[1]; }; - typedef struct _pb_bytes_array_t pb_bytes_array_t; +/* Same, except for pointer-type fields. There is no need to variable struct + * length in this case. + */ +struct _pb_bytes_ptr_t { + size_t size; + uint8_t *bytes; +}; +typedef struct _pb_bytes_ptr_t pb_bytes_ptr_t; + /* This structure is used for giving the callback function. * It is stored in the message structure and filled in by the method that * calls pb_decode. @@ -370,6 +375,22 @@ struct _pb_extension_t { pb_membersize(st, m[0]), \ pb_arraysize(st, m), ptr} +/* Allocated fields carry the size of the actual data, not the pointer */ +#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Optional fields don't need a has_ variable, as information would be redundant */ +#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Repeated fields have a _count field and a pointer to array of pointers */ +#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \ + fd, pb_delta(st, m ## _count, m), \ + pb_membersize(st, m[0]), 0, ptr} + /* Callbacks are much like required fields except with special datatype. */ #define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \ @@ -410,8 +431,8 @@ struct _pb_extension_t { #define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT #define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT #define PB_LTYPE_MAP_STRING PB_LTYPE_STRING -#define PB_LTYPE_MAP_UINT32 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_UINT64 PB_LTYPE_VARINT +#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT #define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION /* This is the actual macro used in field descriptions.