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