Add 'CAN-binder/libs/nanopb/' from commit '278ffb890e3d8722e4c7d824baaf221a1e375fc4'
[apps/agl-service-can-low-level.git] / CAN-binder / libs / nanopb / tests / basic_stream / decode_stream.c
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. */
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 */
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
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 }