6 /* Structures for "Person" message */
9 Person_PhoneType_MOBILE = 0,
10 Person_PhoneType_HOME = 1,
11 Person_PhoneType_WORK = 2
17 Person_PhoneType type;
26 Person_PhoneNumber phone[5];
29 /* Field descriptions */
30 #define membersize(st, m) (sizeof ((st*)0)->m)
32 const Person_PhoneType Person_PhoneType_type_default = Person_PhoneType_HOME;
34 const pb_field_t Person_PhoneNumber_fields[] = {
35 {1, PB_HTYPE_REQUIRED | PB_LTYPE_STRING,
36 offsetof(Person_PhoneNumber, number), 0,
37 membersize(Person_PhoneNumber, number), 0, 0},
39 {2, PB_HTYPE_OPTIONAL | PB_LTYPE_VARINT,
40 offsetof(Person_PhoneNumber, type),
41 offsetof(Person_PhoneNumber, has_type),
42 membersize(Person_PhoneNumber, type), 0,
43 &Person_PhoneType_type_default},
48 const pb_field_t Person_fields[] = {
49 {1, PB_HTYPE_REQUIRED | PB_LTYPE_STRING,
50 offsetof(Person, name), 0,
51 membersize(Person, name), 0, 0},
53 {2, PB_HTYPE_REQUIRED | PB_LTYPE_VARINT,
54 offsetof(Person, id), 0,
55 membersize(Person, id), 0, 0},
57 {3, PB_HTYPE_OPTIONAL | PB_LTYPE_STRING,
58 offsetof(Person, email),
59 offsetof(Person, has_email),
60 membersize(Person, email), 0, 0},
62 {4, PB_HTYPE_ARRAY | PB_LTYPE_SUBMESSAGE,
63 offsetof(Person, phone),
64 offsetof(Person, phone_size),
65 membersize(Person, phone[0]),
66 membersize(Person, phone) / membersize(Person, phone[0]),
67 Person_PhoneNumber_fields},
72 /* And now, the actual test program */
74 bool print_person(pb_istream_t *stream)
79 if (!pb_decode(stream, Person_fields, &person))
82 printf("Person: name '%s' id '%d' email '%s'\n", person.name, person.id, person.email);
84 for (i = 0; i < person.phone_size; i++)
86 Person_PhoneNumber *phone = &person.phone[i];
87 printf("PhoneNumber: number '%s' type '%d'\n", phone->number, phone->type);
96 size_t size = fread(buffer, 1, 512, stdin);
98 pb_istream_t stream = pb_istream_from_buffer(buffer, size);
99 if (!print_person(&stream))
100 printf("Parsing failed.\n");