encode_alltypes_callback.c revision 7ef855e462b9a18b7d330e4b40f350164a6ad9da
17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Attempts to test all the datatypes supported by ProtoBuf when used as callback fields. 27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Note that normally there would be no reason to use callback fields for this, 37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * because each encoder defined here only gives a single field. 47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdio.h> 77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdlib.h> 87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h> 97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_encode.h> 107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "alltypes.pb.h" 117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "test_helpers.h" 127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_varint(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, (long)*arg); 177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_svarint(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, (long)*arg); 237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_fixed32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, *arg); 297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_fixed64(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, *arg); 357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, *arg, strlen(*arg)); 417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_submsg(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, *arg); 487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_emptymsg(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen EmptyMessage emptymsg = {0}; 537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg); 557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_varint(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 0) && 617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 0) && 637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 0) && 657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 0) && 677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, (long)*arg); 697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_svarint(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, 0) && 757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, 0) && 777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, 0) && 797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, 0) && 817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_svarint(stream, (long)*arg); 837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_fixed32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t dummy = 0; 887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Make it a packed field */ 907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag(stream, PB_WT_STRING, field->tag) && 917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 5 * 4) && /* Number of bytes */ 927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, &dummy) && 937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, &dummy) && 947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, &dummy) && 957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, &dummy) && 967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed32(stream, *arg); 977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_fixed64(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t dummy = 0; 1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Make it a packed field */ 1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag(stream, PB_WT_STRING, field->tag) && 1057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_varint(stream, 5 * 8) && /* Number of bytes */ 1067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, &dummy) && 1077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, &dummy) && 1087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, &dummy) && 1097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, &dummy) && 1107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_fixed64(stream, *arg); 1117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 1147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 1167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, 0, 0) && 1177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, 0, 0) && 1197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, 0, 0) && 1217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, 0, 0) && 1237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_string(stream, *arg, strlen(*arg)); 1257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_submsg(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 1287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage dummy = {""}; 1307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 1327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, &dummy) && 1337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, &dummy) && 1357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, &dummy) && 1377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, &dummy) && 1397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, SubMessage_fields, *arg); 1417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_limits(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 1447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen Limits limits = {0}; 1467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.int32_min = INT32_MIN; 1477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.int32_max = INT32_MAX; 1487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.uint32_min = 0; 1497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.uint32_max = UINT32_MAX; 1507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.int64_min = INT64_MIN; 1517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.int64_max = INT64_MAX; 1527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.uint64_min = 0; 1537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.uint64_max = UINT64_MAX; 1547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.enum_min = HugeEnum_Negative; 1557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen limits.enum_max = HugeEnum_Positive; 1567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 1587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, Limits_fields, &limits); 1597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_repeated_emptymsg(pb_ostream_t *stream, const pb_field_t *field, void * const *arg) 1627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen EmptyMessage emptymsg = {0}; 1647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_encode_tag_for_field(stream, field) && 1657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg) && 1667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg) && 1687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg) && 1707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg) && 1727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_tag_for_field(stream, field) && 1737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_encode_submessage(stream, EmptyMessage_fields, &emptymsg); 1747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main(int argc, char **argv) 1777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int mode = (argc > 1) ? atoi(argv[1]) : 0; 1797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Values for use from callbacks through pointers. */ 1817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t req_fixed32 = 1008; 1827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t req_sfixed32 = -1009; 1837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float req_float = 1010.0f; 1847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t req_fixed64 = 1011; 1857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t req_sfixed64 = -1012; 1867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double req_double = 1013.0; 1877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage req_submsg = {"1016", 1016}; 1887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t rep_fixed32 = 2008; 1907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_sfixed32 = -2009; 1917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float rep_float = 2010.0f; 1927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t rep_fixed64 = 2011; 1937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t rep_sfixed64 = -2012; 1947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double rep_double = 2013.0; 1957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage rep_submsg = {"2016", 2016, true, 2016}; 1967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t opt_fixed32 = 3048; 1987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t opt_sfixed32 = 3049; 1997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float opt_float = 3050.0f; 2007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t opt_fixed64 = 3051; 2017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t opt_sfixed64 = 3052; 2027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double opt_double = 3053.0f; 2037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage opt_submsg = {"3056", 3056}; 2047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for required fields */ 2067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen AllTypes alltypes = {{{0}}}; 2077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int32.funcs.encode = &write_varint; 2097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int32.arg = (void*)-1001; 2107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int64.funcs.encode = &write_varint; 2127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int64.arg = (void*)-1002; 2137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.funcs.encode = &write_varint; 2157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.arg = (void*)1003; 2167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.funcs.encode = &write_varint; 2187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.arg = (void*)1003; 2197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint64.funcs.encode = &write_varint; 2217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint64.arg = (void*)1004; 2227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint32.funcs.encode = &write_svarint; 2247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint32.arg = (void*)-1005; 2257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint64.funcs.encode = &write_svarint; 2277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint64.arg = (void*)-1006; 2287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bool.funcs.encode = &write_varint; 2307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bool.arg = (void*)true; 2317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed32.funcs.encode = &write_fixed32; 2337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed32.arg = &req_fixed32; 2347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed32.funcs.encode = &write_fixed32; 2367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed32.arg = &req_sfixed32; 2377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_float.funcs.encode = &write_fixed32; 2397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_float.arg = &req_float; 2407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed64.funcs.encode = &write_fixed64; 2427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed64.arg = &req_fixed64; 2437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed64.funcs.encode = &write_fixed64; 2457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed64.arg = &req_sfixed64; 2467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_double.funcs.encode = &write_fixed64; 2487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_double.arg = &req_double; 2497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_string.funcs.encode = &write_string; 2517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_string.arg = "1014"; 2527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bytes.funcs.encode = &write_string; 2547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bytes.arg = "1015"; 2557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_submsg.funcs.encode = &write_submsg; 2577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_submsg.arg = &req_submsg; 2587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_enum.funcs.encode = &write_varint; 2607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_enum.arg = (void*)MyEnum_Truth; 2617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_emptymsg.funcs.encode = &write_emptymsg; 2637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for repeated fields */ 2657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int32.funcs.encode = &write_repeated_varint; 2667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int32.arg = (void*)-2001; 2677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int64.funcs.encode = &write_repeated_varint; 2697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int64.arg = (void*)-2002; 2707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint32.funcs.encode = &write_repeated_varint; 2727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint32.arg = (void*)2003; 2737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint64.funcs.encode = &write_repeated_varint; 2757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint64.arg = (void*)2004; 2767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint32.funcs.encode = &write_repeated_svarint; 2787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint32.arg = (void*)-2005; 2797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint64.funcs.encode = &write_repeated_svarint; 2817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint64.arg = (void*)-2006; 2827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bool.funcs.encode = &write_repeated_varint; 2847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bool.arg = (void*)true; 2857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed32.funcs.encode = &write_repeated_fixed32; 2877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed32.arg = &rep_fixed32; 2887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed32.funcs.encode = &write_repeated_fixed32; 2907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed32.arg = &rep_sfixed32; 2917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_float.funcs.encode = &write_repeated_fixed32; 2937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_float.arg = &rep_float; 2947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed64.funcs.encode = &write_repeated_fixed64; 2967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed64.arg = &rep_fixed64; 2977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed64.funcs.encode = &write_repeated_fixed64; 2997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed64.arg = &rep_sfixed64; 3007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_double.funcs.encode = &write_repeated_fixed64; 3027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_double.arg = &rep_double; 3037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_string.funcs.encode = &write_repeated_string; 3057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_string.arg = "2014"; 3067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bytes.funcs.encode = &write_repeated_string; 3087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bytes.arg = "2015"; 3097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_submsg.funcs.encode = &write_repeated_submsg; 3117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_submsg.arg = &rep_submsg; 3127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_enum.funcs.encode = &write_repeated_varint; 3147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_enum.arg = (void*)MyEnum_Truth; 3157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_emptymsg.funcs.encode = &write_repeated_emptymsg; 3177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_limits.funcs.encode = &write_limits; 3197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for optional fields */ 3217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (mode != 0) 3227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int32.funcs.encode = &write_varint; 3247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int32.arg = (void*)3041; 3257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int64.funcs.encode = &write_varint; 3277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int64.arg = (void*)3042; 3287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint32.funcs.encode = &write_varint; 3307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint32.arg = (void*)3043; 3317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint64.funcs.encode = &write_varint; 3337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint64.arg = (void*)3044; 3347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint32.funcs.encode = &write_svarint; 3367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint32.arg = (void*)3045; 3377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint64.funcs.encode = &write_svarint; 3397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint64.arg = (void*)3046; 3407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bool.funcs.encode = &write_varint; 3427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bool.arg = (void*)true; 3437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed32.funcs.encode = &write_fixed32; 3457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed32.arg = &opt_fixed32; 3467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed32.funcs.encode = &write_fixed32; 3487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed32.arg = &opt_sfixed32; 3497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_float.funcs.encode = &write_fixed32; 3517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_float.arg = &opt_float; 3527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed64.funcs.encode = &write_fixed64; 3547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed64.arg = &opt_fixed64; 3557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed64.funcs.encode = &write_fixed64; 3577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed64.arg = &opt_sfixed64; 3587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_double.funcs.encode = &write_fixed64; 3607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_double.arg = &opt_double; 3617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_string.funcs.encode = &write_string; 3637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_string.arg = "3054"; 3647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bytes.funcs.encode = &write_string; 3667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bytes.arg = "3055"; 3677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_submsg.funcs.encode = &write_submsg; 3697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_submsg.arg = &opt_submsg; 3707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_enum.funcs.encode = &write_varint; 3727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_enum.arg = (void*)MyEnum_Truth; 3737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_emptymsg.funcs.encode = &write_emptymsg; 3757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.end.funcs.encode = &write_varint; 3787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.end.arg = (void*)1099; 3797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[2048]; 3827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); 3837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Now encode it and check if we succeeded. */ 3857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (pb_encode(&stream, AllTypes_fields, &alltypes)) 3867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SET_BINARY_MODE(stdout); 3887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fwrite(buffer, 1, stream.bytes_written, stdout); 3897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return 0; /* Success */ 3907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen else 3927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen fprintf(stderr, "Encoding failed: %s\n", PB_GET_ERROR(&stream)); 3947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return 1; /* Failure */ 3957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 398