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 */
32 const Person_PhoneType Person_PhoneNumber_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 pb_membersize(Person_PhoneNumber, number), 0, 0},
39 {2, PB_HTYPE_OPTIONAL | PB_LTYPE_VARINT,
40 pb_delta(Person_PhoneNumber, type, number),
41 pb_delta(Person_PhoneNumber, has_type, type),
42 pb_membersize(Person_PhoneNumber, type), 0,
43 &Person_PhoneNumber_type_default},
48 const pb_field_t Person_fields[] = {
49 {1, PB_HTYPE_REQUIRED | PB_LTYPE_STRING,
50 offsetof(Person, name), 0,
51 pb_membersize(Person, name), 0, 0},
53 {2, PB_HTYPE_REQUIRED | PB_LTYPE_VARINT,
54 pb_delta(Person, id, name), 0,
55 pb_membersize(Person, id), 0, 0},
57 {3, PB_HTYPE_OPTIONAL | PB_LTYPE_STRING,
58 offsetof(Person, email) - offsetof(Person, id),
59 pb_delta(Person, has_email, email),
60 pb_membersize(Person, email), 0, 0},
62 {4, PB_HTYPE_ARRAY | PB_LTYPE_SUBMESSAGE,
63 offsetof(Person, phone) - offsetof(Person, email),
64 pb_delta(Person, phone_size, phone),
65 pb_membersize(Person, phone[0]),
66 pb_arraysize(Person, phone),
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");