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