17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Common parts of the nanopb library. Most of these are quite low-level 27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. 37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef _PB_H_ 67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define _PB_H_ 77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/***************************************************************** 97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Nanopb compilation time options. You can change these here by * 107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * uncommenting the lines, or on the compiler command line. * 117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen *****************************************************************/ 127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Enable support for dynamically allocated fields */ 147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_ENABLE_MALLOC 1 */ 157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Define this if your CPU architecture is big endian, i.e. it 177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * stores the most-significant byte first. */ 187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define __BIG_ENDIAN__ 1 */ 197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Increase the number of required fields that are tracked. 217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * A compiler warning will tell if you need this. */ 227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_MAX_REQUIRED_FIELDS 256 */ 237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Add support for tag numbers > 255 and fields larger than 255 bytes. */ 257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_FIELD_16BIT 1 */ 267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ 287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_FIELD_32BIT 1 */ 297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Disable support for error messages in order to save some code space. */ 317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_NO_ERRMSG 1 */ 327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Disable support for custom streams (support only memory buffers). */ 347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_BUFFER_ONLY 1 */ 357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Switch back to the old-style callback function signature. 377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * This was the default until nanopb-0.2.1. */ 387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* #define PB_OLD_CALLBACK_STYLE */ 397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/****************************************************************** 427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * You usually don't need to change anything below this line. * 437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Feel free to look around and use the defined macros, though. * 447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen ******************************************************************/ 457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Version of the nanopb library. Just in case you want to check it in 487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * your own program. */ 497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define NANOPB_VERSION nanopb-0.2.8-dev 507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Include all the system headers needed by nanopb. You will need the 527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * definitions of the following: 537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - strlen, memcpy, memset functions 547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - [u]int8_t, [u]int16_t, [u]int32_t, [u]int64_t 557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - size_t 567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - bool 577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you don't have the standard header files, you can instead provide 597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * a custom header that defines or includes all this. In that case, 607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * define PB_SYSTEM_HEADER to the path of this file. 617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_SYSTEM_HEADER 637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include PB_SYSTEM_HEADER 647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else 657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdint.h> 667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stddef.h> 677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdbool.h> 687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h> 697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_ENABLE_MALLOC 717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdlib.h> 727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Macro for defining packed structures (compiler dependent). 767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * This just reduces memory requirements, but is not required. 777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#if defined(__GNUC__) || defined(__clang__) 797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* For GCC and clang */ 807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_START 817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_END 827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_packed __attribute__((packed)) 837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#elif defined(__ICCARM__) 847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* For IAR ARM compiler */ 857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") 867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") 877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_packed 887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#elif defined(_MSC_VER) && (_MSC_VER >= 1500) 897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* For Microsoft Visual C++ */ 907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) 917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_END __pragma(pack(pop)) 927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_packed 937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else 947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Unknown compiler */ 957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_START 967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define PB_PACKED_STRUCT_END 977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_packed 987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ 1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef UNUSED 1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define UNUSED(x) (void)(x) 1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Compile-time assertion, used for checking compatible compilation options. 1067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If this does not work properly on your compiler, use #define STATIC_ASSERT 1077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * to disable it. 1087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 1097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * But before doing that, check carefully the error message / place where it 1107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * comes from to see if the error has a real cause. Unfortunately the error 1117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * message is not always very clear to read, but you can see the reason better 1127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * in the place where the STATIC_ASSERT macro was called. 1137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 1147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef STATIC_ASSERT 1157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define STATIC_ASSERT(COND,MSG) typedef char STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; 1167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define STATIC_ASSERT_MSG(MSG, LINE, COUNTER) STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) 1177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) static_assertion_##MSG##LINE##COUNTER 1187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 1197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Number of required fields to keep track of. */ 1217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef PB_MAX_REQUIRED_FIELDS 1227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_MAX_REQUIRED_FIELDS 64 1237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 1247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#if PB_MAX_REQUIRED_FIELDS < 64 1267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). 1277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 1287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* List of possible field types. These are used in the autogenerated code. 1307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Least-significant 4 bits tell the scalar type 1317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Most-significant 4 bits specify repeated/required/packed etc. 1327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 1337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef uint8_t pb_type_t; 1357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/**** Field data types ****/ 1377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Numeric types */ 1397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */ 1407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */ 1417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */ 1427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */ 1437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */ 1447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Marker for last packable field type. */ 1467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_LAST_PACKABLE 0x04 1477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Byte array with pre-allocated buffer. 1497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ 1507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_BYTES 0x05 1517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* String with pre-allocated buffer. 1537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * data_size is the maximum length. */ 1547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_STRING 0x06 1557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Submessage 1577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * submsg_fields is pointer to field descriptions */ 1587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_SUBMESSAGE 0x07 1597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Extension pseudo-field 1617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The field contains a pointer to pb_extension_t */ 1627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_EXTENSION 0x08 1637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Number of declared LTYPES */ 1657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPES_COUNT 9 1667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MASK 0x0F 1677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/**** Field repetition rules ****/ 1697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_HTYPE_REQUIRED 0x00 1717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_HTYPE_OPTIONAL 0x10 1727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_HTYPE_REPEATED 0x20 1737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_HTYPE_MASK 0x30 1747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/**** Field allocation types ****/ 1767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_ATYPE_STATIC 0x00 1787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_ATYPE_POINTER 0x80 1797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_ATYPE_CALLBACK 0x40 1807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_ATYPE_MASK 0xC0 1817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) 1837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) 1847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) 1857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Data type used for storing sizes of struct fields 1877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * and array counts. 1887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 1897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#if defined(PB_FIELD_32BIT) 1907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef uint32_t pb_size_t; 1917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef int32_t pb_ssize_t; 1927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#elif defined(PB_FIELD_16BIT) 1937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef uint16_t pb_size_t; 1947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef int16_t pb_ssize_t; 1957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else 1967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef uint8_t pb_size_t; 1977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen typedef int8_t pb_ssize_t; 1987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 1997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This structure is used in auto-generated constants 2017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * to specify struct fields. 2027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * You can change field sizes if you need structures 2037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * larger than 256 bytes or field tags larger than 256. 2047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The compiler should complain if your .proto has such 2057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * structures. Fix that by defining PB_FIELD_16BIT or 2067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * PB_FIELD_32BIT. 2077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 2087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenPB_PACKED_STRUCT_START 2097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_field_t pb_field_t; 2107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstruct _pb_field_t { 2117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_size_t tag; 2127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_type_t type; 2137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_size_t data_offset; /* Offset of field data, relative to previous field. */ 2147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */ 2157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_size_t data_size; /* Data size in bytes for a single item */ 2167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_size_t array_size; /* Maximum number of entries in array */ 2177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Field definitions for submessage 2197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * OR default value for all other non-array, non-callback types 2207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If null, then field will zeroed. */ 2217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen const void *ptr; 2227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} pb_packed; 2237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenPB_PACKED_STRUCT_END 2247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Make sure that the standard integer types are of the expected sizes. 2267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * All kinds of things may break otherwise.. atleast all fixed* types. 2277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 2287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you get errors here, it probably means that your stdint.h is not 2297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * correct for your platform. 2307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 2317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(int8_t) == 1, INT8_T_WRONG_SIZE) 2327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(uint8_t) == 1, UINT8_T_WRONG_SIZE) 2337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(int16_t) == 2, INT16_T_WRONG_SIZE) 2347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(uint16_t) == 2, UINT16_T_WRONG_SIZE) 2357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(int32_t) == 4, INT32_T_WRONG_SIZE) 2367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(uint32_t) == 4, UINT32_T_WRONG_SIZE) 2377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(int64_t) == 8, INT64_T_WRONG_SIZE) 2387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan CohenSTATIC_ASSERT(sizeof(uint64_t) == 8, UINT64_T_WRONG_SIZE) 2397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This structure is used for 'bytes' arrays. 2417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * It has the number of bytes in the beginning, and after that an array. 2427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Note that actual structs used will have a different length of bytes array. 2437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 2447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_BYTES_ARRAY_T(n) struct { size_t size; uint8_t bytes[n]; } 2457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) 2467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstruct _pb_bytes_array_t { 2487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size_t size; 2497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t bytes[1]; 2507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}; 2517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_bytes_array_t pb_bytes_array_t; 2527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This structure is used for giving the callback function. 2547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * It is stored in the message structure and filled in by the method that 2557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * calls pb_decode. 2567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 2577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The decoding callback will be given a limited-length stream 2587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If the wire type was string, the length is the length of the string. 2597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If the wire type was a varint/fixed32/fixed64, the length is the length 2607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * of the actual value. 2617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The function may be called multiple times (especially for repeated types, 2627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * but also otherwise if the message happens to contain the field multiple 2637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * times.) 2647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 2657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The encoding callback will receive the actual output stream. 2667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * It should write all the data in one call, including the field tag and 2677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * wire type. It can write multiple fields. 2687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 2697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * The callback can be null if you want to skip a field. 2707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 2717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_istream_t pb_istream_t; 2727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_ostream_t pb_ostream_t; 2737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_callback_t pb_callback_t; 2747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstruct _pb_callback_t { 2757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_OLD_CALLBACK_STYLE 2767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Deprecated since nanopb-0.2.1 */ 2777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen union { 2787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg); 2797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg); 2807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } funcs; 2817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else 2827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* New function signature, which allows modifying arg contents in callback. */ 2837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen union { 2847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); 2857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); 2867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } funcs; 2877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 2887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Free arg for use by callback */ 2907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen void *arg; 2917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}; 2927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Wire types. Library user needs these only in encoder callbacks. */ 2947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef enum { 2957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_WT_VARINT = 0, 2967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_WT_64BIT = 1, 2977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_WT_STRING = 2, 2987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_WT_32BIT = 5 2997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} pb_wire_type_t; 3007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Structure for defining the handling of unknown/extension fields. 3027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Usually the pb_extension_type_t structure is automatically generated, 3037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * while the pb_extension_t structure is created by the user. However, 3047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * if you want to catch all unknown fields, you can also create a custom 3057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * pb_extension_type_t with your own callback. 3067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 3077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_extension_type_t pb_extension_type_t; 3087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef struct _pb_extension_t pb_extension_t; 3097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstruct _pb_extension_type_t { 3107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Called for each unknown field in the message. 3117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you handle the field, read off all of its data and return true. 3127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you do not handle the field, do not read anything and return true. 3137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you run into an error, return false. 3147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Set to NULL for default handler. 3157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 3167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, 3177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t tag, pb_wire_type_t wire_type); 3187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Called once after all regular fields have been encoded. 3207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you have something to write, do so and return true. 3217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you do not have anything to write, just return true. 3227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If you run into an error, return false. 3237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Set to NULL for default handler. 3247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 3257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); 3267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Free field for use by the callback. */ 3287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen const void *arg; 3297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}; 3307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstruct _pb_extension_t { 3327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Type describing the extension field. Usually you'll initialize 3337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * this to a pointer to the automatically generated structure. */ 3347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen const pb_extension_type_t *type; 3357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Destination for the decoded data. This must match the datatype 3377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * of the extension field. */ 3387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen void *dest; 3397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Pointer to the next extension handler, or NULL. 3417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * If this extension does not match a field, the next handler is 3427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * automatically called. */ 3437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_extension_t *next; 3447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* The decoder sets this to true if the extension was found. 3467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Ignored for encoding. */ 3477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen bool found; 3487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}; 3497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Memory allocation functions to use. You can define pb_realloc and 3517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * pb_free to custom functions if you want. */ 3527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_ENABLE_MALLOC 3537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# ifndef pb_realloc 3547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_realloc(ptr, size) realloc(ptr, size) 3557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# endif 3567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# ifndef pb_free 3577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# define pb_free(ptr) free(ptr) 3587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen# endif 3597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 3607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* These macros are used to declare pb_field_t's in the constant array. */ 3627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Size of a structure member, in bytes. */ 3637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define pb_membersize(st, m) (sizeof ((st*)0)->m) 3647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Number of entries in an array. */ 3657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) 3667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Delta from start of one member to the start of another member. */ 3677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) 3687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Marks the end of the field list */ 3697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0} 3707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Macros for filling in the data_offset field */ 3727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* data_offset for first field in a message */ 3737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1)) 3747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* data_offset for subsequent fields */ 3757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2)) 3767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */ 3777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \ 3787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen ? PB_DATAOFFSET_FIRST(st, m1, m2) \ 3797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen : PB_DATAOFFSET_OTHER(st, m1, m2)) 3807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Required fields are the simplest. They just have delta (padding) from 3827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * previous field end, and the size of the field. Pointer is used for 3837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * submessages and default values. 3847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 3857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \ 3867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ 3877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m), 0, ptr} 3887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Optional fields add the delta to the has_ variable. */ 3907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \ 3917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ 3927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, \ 3937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_delta(st, has_ ## m, m), \ 3947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_membersize(st, m), 0, ptr} 3957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Repeated fields have a _count field and also the maximum number of entries. */ 3977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \ 3987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \ 3997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, \ 4007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_delta(st, m ## _count, m), \ 4017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_membersize(st, m[0]), \ 4027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_arraysize(st, m), ptr} 4037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Allocated fields carry the size of the actual data, not the pointer */ 4057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \ 4067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \ 4077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m[0]), 0, ptr} 4087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Optional fields don't need a has_ variable, as information would be redundant */ 4107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \ 4117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ 4127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m[0]), 0, ptr} 4137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Repeated fields have a _count field and a pointer to array of pointers */ 4157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \ 4167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \ 4177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, pb_delta(st, m ## _count, m), \ 4187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_membersize(st, m[0]), 0, ptr} 4197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Callbacks are much like required fields except with special datatype. */ 4217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \ 4227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \ 4237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m), 0, ptr} 4247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \ 4267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ 4277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m), 0, ptr} 4287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \ 4307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \ 4317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fd, 0, pb_membersize(st, m), 0, ptr} 4327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Optional extensions don't have the has_ field, as that would be redundant. */ 4347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \ 4357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ 4367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 0, \ 4377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 0, \ 4387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_membersize(st, m), 0, ptr} 4397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \ 4417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ 4427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 0, 0, pb_membersize(st, m), 0, ptr} 4437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* The mapping from protobuf types to LTYPEs is done using these macros. */ 4457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT 4467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES 4477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 4487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT 4497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 4507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 4517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 4527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT 4537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT 4547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE 4557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 4567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 4577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT 4587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT 4597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING 4607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT 4617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT 4627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION 4637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This is the actual macro used in field descriptions. 4657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * It takes these arguments: 4667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Field tag number 4677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Field type: BOOL, BYTES, DOUBLE, ENUM, FIXED32, FIXED64, 4687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64 4697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION 4707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Field rules: REQUIRED, OPTIONAL or REPEATED 4717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Allocation: STATIC or CALLBACK 4727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Message name 4737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Field name 4747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Previous field name (or field name again for first field) 4757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Pointer to default value or submsg fields. 4767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 4777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_FIELD(tag, type, rules, allocation, message, field, prevfield, ptr) \ 4797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_ ## rules ## _ ## allocation(tag, message, field, \ 4807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_DATAOFFSET_CHOOSE(message, field, prevfield), \ 4817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_LTYPE_MAP_ ## type, ptr) 4827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This is a new version of the macro used by nanopb generator from 4847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * version 0.2.3 onwards. It avoids the use of a ternary expression in 4857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * the initialization, which confused some compilers. 4867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 4877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * - Placement: FIRST or OTHER, depending on if this is the first field in structure. 4887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * 4897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 4907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_FIELD2(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ 4917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_ ## rules ## _ ## allocation(tag, message, field, \ 4927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_DATAOFFSET_ ## placement(message, field, prevfield), \ 4937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen PB_LTYPE_MAP_ ## type, ptr) 4947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* These macros are used for giving out error messages. 4977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * They are mostly a debugging aid; the main error information 4987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * is the true/false return value from functions. 4997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Some code space can be saved by disabling the error 5007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * messages if not used. 5017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 5027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_NO_ERRMSG 5037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_RETURN_ERROR(stream,msg) \ 5047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen do {\ 5057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen UNUSED(stream); \ 5067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; \ 5077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } while(0) 5087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_GET_ERROR(stream) "(errmsg disabled)" 5097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else 5107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_RETURN_ERROR(stream,msg) \ 5117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen do {\ 5127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if ((stream)->errmsg == NULL) \ 5137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen (stream)->errmsg = (msg); \ 5147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; \ 5157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } while(0) 5167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") 5177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 5187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 5197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif 520