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;
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 bool status;
62
63 status = (fread(buf, 1, count, file) == count);
64
65 if (feof(file))
66 stream->bytes_left = 0;
67
68 return status;
69 }
70
main()71 int main()
72 {
73 pb_istream_t stream = {&callback, NULL, SIZE_MAX};
74 stream.state = stdin;
75 SET_BINARY_MODE(stdin);
76
77 if (!print_person(&stream))
78 {
79 printf("Parsing failed: %s\n", PB_GET_ERROR(&stream));
80 return 1;
81 } else {
82 return 0;
83 }
84 }
85