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 <string.h> 87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdlib.h> 97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_decode.h> 107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "alltypes.pb.h" 117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "test_helpers.h" 127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define TEST(x) if (!(x)) { \ 147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen printf("Test " #x " failed (in field %d).\n", field->tag); \ 157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; \ 167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_varint(pb_istream_t *stream, const pb_field_t *field, void **arg) 197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t value; 217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_varint(stream, &value)) 227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST((int64_t)value == (long)*arg); 257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_svarint(pb_istream_t *stream, const pb_field_t *field, void **arg) 297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t value; 317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_svarint(stream, &value)) 327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(value == (long)*arg); 357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_fixed32(pb_istream_t *stream, const pb_field_t *field, void **arg) 397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t value; 417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_fixed32(stream, &value)) 427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(value == *(uint32_t*)*arg); 457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_fixed64(pb_istream_t *stream, const pb_field_t *field, void **arg) 497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t value; 517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_fixed64(stream, &value)) 527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(value == *(uint64_t*)*arg); 557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_string(pb_istream_t *stream, const pb_field_t *field, void **arg) 597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buf[16] = {0}; 617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size_t len = stream->bytes_left; 627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (len > sizeof(buf) - 1 || !pb_read(stream, buf, len)) 647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(strcmp((char*)buf, *arg) == 0); 677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_submsg(pb_istream_t *stream, const pb_field_t *field, void **arg) 717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage submsg = {""}; 737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode(stream, SubMessage_fields, &submsg)) 757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(memcmp(&submsg, *arg, sizeof(submsg))); 787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_emptymsg(pb_istream_t *stream, const pb_field_t *field, void **arg) 827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen EmptyMessage emptymsg = {0}; 847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_decode(stream, EmptyMessage_fields, &emptymsg); 857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_varint(pb_istream_t *stream, const pb_field_t *field, void **arg) 887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t** expected = (int32_t**)arg; 907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t value; 917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_varint(stream, &value)) 927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(*(*expected)++ == value); 957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_svarint(pb_istream_t *stream, const pb_field_t *field, void **arg) 997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t** expected = (int32_t**)arg; 1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t value; 1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_svarint(stream, &value)) 1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(*(*expected)++ == value); 1067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_fixed32(pb_istream_t *stream, const pb_field_t *field, void **arg) 1107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t** expected = (uint32_t**)arg; 1127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t value; 1137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_fixed32(stream, &value)) 1147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(*(*expected)++ == value); 1177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_fixed64(pb_istream_t *stream, const pb_field_t *field, void **arg) 1217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t** expected = (uint64_t**)arg; 1237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t value; 1247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode_fixed64(stream, &value)) 1257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(*(*expected)++ == value); 1287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_string(pb_istream_t *stream, const pb_field_t *field, void **arg) 1327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t*** expected = (uint8_t***)arg; 1347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buf[16] = {0}; 1357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size_t len = stream->bytes_left; 1367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (len > sizeof(buf) - 1 || !pb_read(stream, buf, len)) 1387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(strcmp((char*)*(*expected)++, (char*)buf) == 0); 1417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_repeated_submsg(pb_istream_t *stream, const pb_field_t *field, void **arg) 1457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage** expected = (SubMessage**)arg; 1477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage decoded = {""}; 1487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode(stream, SubMessage_fields, &decoded)) 1497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(memcmp((*expected)++, &decoded, sizeof(decoded)) == 0); 1527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_limits(pb_istream_t *stream, const pb_field_t *field, void **arg) 1567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen Limits decoded = {0}; 1587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!pb_decode(stream, Limits_fields, &decoded)) 1597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return false; 1607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.int32_min == INT32_MIN); 1627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.int32_max == INT32_MAX); 1637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.uint32_min == 0); 1647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.uint32_max == UINT32_MAX); 1657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.int64_min == INT64_MIN); 1667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.int64_max == INT64_MAX); 1677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.uint64_min == 0); 1687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.uint64_max == UINT64_MAX); 1697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.enum_min == HugeEnum_Negative); 1707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen TEST(decoded.enum_max == HugeEnum_Positive); 1717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return true; 1737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 1747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This function is called once from main(), it handles 1767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen the decoding and checks the fields. */ 1777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool check_alltypes(pb_istream_t *stream, int mode) 1787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 1797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Values for use from callbacks through pointers. */ 1807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t req_fixed32 = 1008; 1817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t req_sfixed32 = -1009; 1827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float req_float = 1010.0f; 1837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t req_fixed64 = 1011; 1847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t req_sfixed64 = -1012; 1857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double req_double = 1013.0; 1867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage req_submsg = {"1016", 1016}; 1877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 1887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_int32[5] = {0, 0, 0, 0, -2001}; 1897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_int64[5] = {0, 0, 0, 0, -2002}; 1907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_uint32[5] = {0, 0, 0, 0, 2003}; 1917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_uint64[5] = {0, 0, 0, 0, 2004}; 1927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_sint32[5] = {0, 0, 0, 0, -2005}; 1937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_sint64[5] = {0, 0, 0, 0, -2006}; 1947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_bool[5] = {false, false, false, false, true}; 1957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t rep_fixed32[5] = {0, 0, 0, 0, 2008}; 1967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_sfixed32[5] = {0, 0, 0, 0, -2009}; 1977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float rep_float[5] = {0, 0, 0, 0, 2010.0f}; 1987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t rep_fixed64[5] = {0, 0, 0, 0, 2011}; 1997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t rep_sfixed64[5] = {0, 0, 0, 0, -2012}; 2007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double rep_double[5] = {0, 0, 0, 0, 2013.0}; 2017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen char* rep_string[5] = {"", "", "", "", "2014"}; 2027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen char* rep_bytes[5] = {"", "", "", "", "2015"}; 2037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage rep_submsg[5] = {{"", 0, 0, 3}, 2047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {"", 0, 0, 3}, 2057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {"", 0, 0, 3}, 2067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {"", 0, 0, 3}, 2077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen {"2016", 2016, true, 2016}}; 2087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t rep_enum[5] = {0, 0, 0, 0, MyEnum_Truth}; 2097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint32_t opt_fixed32 = 3048; 2117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int32_t opt_sfixed32 = 3049; 2127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen float opt_float = 3050.0f; 2137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint64_t opt_fixed64 = 3051; 2147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int64_t opt_sfixed64 = 3052; 2157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen double opt_double = 3053.0f; 2167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SubMessage opt_submsg = {"3056", 3056}; 2177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for required fields */ 2197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen AllTypes alltypes; 2207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Fill with garbage to better detect initialization errors */ 2227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen memset(&alltypes, 0xAA, sizeof(alltypes)); 2237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int32.funcs.decode = &read_varint; 2257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int32.arg = (void*)-1001; 2267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int64.funcs.decode = &read_varint; 2287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_int64.arg = (void*)-1002; 2297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.funcs.decode = &read_varint; 2317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.arg = (void*)1003; 2327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.funcs.decode = &read_varint; 2347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint32.arg = (void*)1003; 2357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint64.funcs.decode = &read_varint; 2377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_uint64.arg = (void*)1004; 2387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint32.funcs.decode = &read_svarint; 2407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint32.arg = (void*)-1005; 2417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint64.funcs.decode = &read_svarint; 2437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sint64.arg = (void*)-1006; 2447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bool.funcs.decode = &read_varint; 2467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bool.arg = (void*)true; 2477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed32.funcs.decode = &read_fixed32; 2497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed32.arg = &req_fixed32; 2507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed32.funcs.decode = &read_fixed32; 2527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed32.arg = &req_sfixed32; 2537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_float.funcs.decode = &read_fixed32; 2557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_float.arg = &req_float; 2567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed64.funcs.decode = &read_fixed64; 2587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_fixed64.arg = &req_fixed64; 2597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed64.funcs.decode = &read_fixed64; 2617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_sfixed64.arg = &req_sfixed64; 2627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_double.funcs.decode = &read_fixed64; 2647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_double.arg = &req_double; 2657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_string.funcs.decode = &read_string; 2677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_string.arg = "1014"; 2687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bytes.funcs.decode = &read_string; 2707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_bytes.arg = "1015"; 2717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_submsg.funcs.decode = &read_submsg; 2737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_submsg.arg = &req_submsg; 2747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_enum.funcs.decode = &read_varint; 2767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_enum.arg = (void*)MyEnum_Truth; 2777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_emptymsg.funcs.decode = &read_emptymsg; 2797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for repeated fields */ 2817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int32.funcs.decode = &read_repeated_varint; 2827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int32.arg = rep_int32; 2837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int64.funcs.decode = &read_repeated_varint; 2857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_int64.arg = rep_int64; 2867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint32.funcs.decode = &read_repeated_varint; 2887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint32.arg = rep_uint32; 2897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint64.funcs.decode = &read_repeated_varint; 2917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_uint64.arg = rep_uint64; 2927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint32.funcs.decode = &read_repeated_svarint; 2947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint32.arg = rep_sint32; 2957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint64.funcs.decode = &read_repeated_svarint; 2977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sint64.arg = rep_sint64; 2987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 2997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bool.funcs.decode = &read_repeated_varint; 3007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bool.arg = rep_bool; 3017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed32.funcs.decode = &read_repeated_fixed32; 3037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed32.arg = rep_fixed32; 3047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed32.funcs.decode = &read_repeated_fixed32; 3067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed32.arg = rep_sfixed32; 3077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_float.funcs.decode = &read_repeated_fixed32; 3097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_float.arg = rep_float; 3107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed64.funcs.decode = &read_repeated_fixed64; 3127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_fixed64.arg = rep_fixed64; 3137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed64.funcs.decode = &read_repeated_fixed64; 3157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_sfixed64.arg = rep_sfixed64; 3167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_double.funcs.decode = &read_repeated_fixed64; 3187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_double.arg = rep_double; 3197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_string.funcs.decode = &read_repeated_string; 3217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_string.arg = rep_string; 3227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bytes.funcs.decode = &read_repeated_string; 3247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_bytes.arg = rep_bytes; 3257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_submsg.funcs.decode = &read_repeated_submsg; 3277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_submsg.arg = rep_submsg; 3287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_enum.funcs.decode = &read_repeated_varint; 3307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_enum.arg = rep_enum; 3317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.rep_emptymsg.funcs.decode = &read_emptymsg; 3337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.req_limits.funcs.decode = &read_limits; 3357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.end.funcs.decode = &read_varint; 3377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.end.arg = (void*)1099; 3387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Bind callbacks for optional fields */ 3407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (mode == 1) 3417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 3427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int32.funcs.decode = &read_varint; 3437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int32.arg = (void*)3041; 3447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int64.funcs.decode = &read_varint; 3467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_int64.arg = (void*)3042; 3477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint32.funcs.decode = &read_varint; 3497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint32.arg = (void*)3043; 3507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint64.funcs.decode = &read_varint; 3527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_uint64.arg = (void*)3044; 3537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint32.funcs.decode = &read_svarint; 3557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint32.arg = (void*)3045; 3567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint64.funcs.decode = &read_svarint; 3587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sint64.arg = (void*)3046; 3597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bool.funcs.decode = &read_varint; 3617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bool.arg = (void*)true; 3627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed32.funcs.decode = &read_fixed32; 3647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed32.arg = &opt_fixed32; 3657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed32.funcs.decode = &read_fixed32; 3677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed32.arg = &opt_sfixed32; 3687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_float.funcs.decode = &read_fixed32; 3707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_float.arg = &opt_float; 3717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed64.funcs.decode = &read_fixed64; 3737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_fixed64.arg = &opt_fixed64; 3747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed64.funcs.decode = &read_fixed64; 3767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_sfixed64.arg = &opt_sfixed64; 3777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_double.funcs.decode = &read_fixed64; 3797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_double.arg = &opt_double; 3807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_string.funcs.decode = &read_string; 3827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_string.arg = "3054"; 3837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bytes.funcs.decode = &read_string; 3857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_bytes.arg = "3055"; 3867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_submsg.funcs.decode = &read_submsg; 3887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_submsg.arg = &opt_submsg; 3897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_enum.funcs.decode = &read_varint; 3917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_enum.arg = (void*)MyEnum_Truth; 3927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen alltypes.opt_emptymsg.funcs.decode = &read_emptymsg; 3947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 3957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return pb_decode(stream, AllTypes_fields, &alltypes); 3977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 3987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 3997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main(int argc, char **argv) 4007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 4017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen uint8_t buffer[1024]; 4027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen size_t count; 4037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_istream_t stream; 4047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Whether to expect the optional values or the default values. */ 4067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int mode = (argc > 1) ? atoi(argv[1]) : 0; 4077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Read the data into buffer */ 4097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen SET_BINARY_MODE(stdin); 4107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen count = fread(buffer, 1, sizeof(buffer), stdin); 4117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Construct a pb_istream_t for reading from the buffer */ 4137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen stream = pb_istream_from_buffer(buffer, count); 4147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 4157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen /* Decode and print out the stuff */ 4167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (!check_alltypes(&stream, mode)) 4177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen { 4187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen printf("Parsing failed: %s\n", PB_GET_ERROR(&stream)); 4197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return 1; 4207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } else { 4217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return 0; 4227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen } 4237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 424