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