X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=pb.h;h=bf07ceb1e038489a2aedacd41de2a4ce64196f0c;hb=ef741ea530e4086344ed0ad0fc90f21c224b9503;hp=dd06c69b988fd25d1860050055e473142cbc07d1;hpb=5442e690f65fd09e7a44437da02fb7e14af6fe8f;p=apps%2Fagl-service-can-low-level.git diff --git a/pb.h b/pb.h index dd06c69b..bf07ceb1 100644 --- a/pb.h +++ b/pb.h @@ -6,17 +6,40 @@ * see pb_encode.h or pb_decode.h */ -#define NANOPB_VERSION nanopb-0.2.0-dev +#define NANOPB_VERSION nanopb-0.2.1 +#ifdef PB_SYSTEM_HEADER +#include PB_SYSTEM_HEADER +#else #include #include #include +#include +#endif -#ifdef __GNUC__ -/* This just reduces memory requirements, but is not required. */ -#define pb_packed __attribute__((packed)) +/* Macro for defining packed structures (compiler dependent). + * This just reduces memory requirements, but is not required. + */ +#if defined(__GNUC__) || defined(__clang__) + /* For GCC and clang */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed __attribute__((packed)) +#elif defined(__ICCARM__) + /* For IAR ARM compiler */ +# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") +# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") +# define pb_packed +#elif defined(_MSC_VER) && (_MSC_VER >= 1500) + /* For Microsoft Visual C++ */ +# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) +# define PB_PACKED_STRUCT_END __pragma(pack(pop)) +# define pb_packed #else -#define pb_packed + /* Unknown compiler */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed #endif /* Handly macro for suppressing unreferenced-parameter compiler warnings. */ @@ -113,6 +136,7 @@ typedef uint8_t pb_type_t; * structures. Fix that by defining PB_FIELD_16BIT or * PB_FIELD_32BIT. */ +PB_PACKED_STRUCT_START typedef struct _pb_field_t pb_field_t; struct _pb_field_t { @@ -144,6 +168,7 @@ struct _pb_field_t { * If null, then field will zeroed. */ const void *ptr; } pb_packed; +PB_PACKED_STRUCT_END /* This structure is used for 'bytes' arrays. * It has the number of bytes in the beginning, and after that an array. @@ -178,10 +203,19 @@ typedef struct _pb_istream_t pb_istream_t; typedef struct _pb_ostream_t pb_ostream_t; typedef struct _pb_callback_t pb_callback_t; struct _pb_callback_t { +#ifdef PB_OLD_CALLBACK_STYLE + /* Deprecated since nanopb-0.2.1 */ union { bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg); bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg); } funcs; +#else + /* New function signature, which allows modifying arg contents in callback. */ + union { + bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); + bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); + } funcs; +#endif /* Free arg for use by callback */ void *arg; @@ -199,7 +233,7 @@ typedef enum { #define pb_membersize(st, m) (sizeof ((st*)0)->m) #define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) #define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) -#define pb_delta_end(st, m1, m2) (offsetof(st, m1) == offsetof(st, m2) \ +#define pb_delta_end(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \ ? offsetof(st, m1) \ : offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2)) #define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0}