• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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