1 /* Same as test_decode1 but reads from stdin directly.
2 */
3
4 #include <stdio.h>
5 #include <pb_decode.h>
6 #include "person.pb.h"
7 #include "test_helpers.h"
8
9 /* This function is called once from main(), it handles
10 the decoding and printing.
11 Ugly copy-paste from test_decode1.c. */
print_person(pb_istream_t * stream)12 bool print_person(pb_istream_t *stream)
13 {
14 int i;
15 Person person = Person_init_zero;
16
17 if (!pb_decode(stream, Person_fields, &person))
18 return false;
19
20 /* Now the decoding is done, rest is just to print stuff out. */
21
22 printf("name: \"%s\"\n", person.name);
23 printf("id: %ld\n", (long)person.id);
24
25 if (person.has_email)
26 printf("email: \"%s\"\n", person.email);
27
28 for (i = 0; i < person.phone_count; i++)
29 {
30 Person_PhoneNumber *phone = &person.phone[i];
31 printf("phone {\n");
32 printf(" number: \"%s\"\n", phone->number);
33
34 if (phone->has_type)
35 {
36 switch (phone->type)
37 {
38 case Person_PhoneType_WORK:
39 printf(" type: WORK\n");
40 break;
41
42 case Person_PhoneType_HOME:
43 printf(" type: HOME\n");
44 break;
45
46 case Person_PhoneType_MOBILE:
47 printf(" type: MOBILE\n");
48 break;
49 }
50 }
51 printf("}\n");
52 }
53
54 return true;
55 }
56
57 /* This binds the pb_istream_t to stdin */
callback(pb_istream_t * stream,uint8_t * buf,size_t count)58 bool callback(pb_istream_t *stream, uint8_t *buf, size_t count)
59 {
60 FILE *file = (FILE*)stream->state;
61 size_t len = fread(buf, 1, count, file);
62
63 if (len == count)
64 {
65 return true;
66 }
67 else
68 {
69 stream->bytes_left = 0;
70 return false;
71 }
72 }
73
main()74 int main()
75 {
76 pb_istream_t stream = {&callback, NULL, SIZE_MAX};
77 stream.state = stdin;
78 SET_BINARY_MODE(stdin);
79
80 if (!print_person(&stream))
81 {
82 printf("Parsing failed: %s\n", PB_GET_ERROR(&stream));
83 return 1;
84 } else {
85 return 0;
86 }
87 }
88