1*c8d645caSAndroid Build Coastguard Worker /* A very simple decoding test case, using person.proto.
2*c8d645caSAndroid Build Coastguard Worker * Produces output compatible with protoc --decode.
3*c8d645caSAndroid Build Coastguard Worker * Reads the encoded data from stdin and prints the values
4*c8d645caSAndroid Build Coastguard Worker * to stdout as text.
5*c8d645caSAndroid Build Coastguard Worker *
6*c8d645caSAndroid Build Coastguard Worker * Run e.g. ./test_encode1 | ./test_decode1
7*c8d645caSAndroid Build Coastguard Worker */
8*c8d645caSAndroid Build Coastguard Worker
9*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
10*c8d645caSAndroid Build Coastguard Worker #include <pb_decode.h>
11*c8d645caSAndroid Build Coastguard Worker #include "person.pb.h"
12*c8d645caSAndroid Build Coastguard Worker #include "test_helpers.h"
13*c8d645caSAndroid Build Coastguard Worker
14*c8d645caSAndroid Build Coastguard Worker /* This function is called once from main(), it handles
15*c8d645caSAndroid Build Coastguard Worker the decoding and printing. */
print_person(pb_istream_t * stream)16*c8d645caSAndroid Build Coastguard Worker bool print_person(pb_istream_t *stream)
17*c8d645caSAndroid Build Coastguard Worker {
18*c8d645caSAndroid Build Coastguard Worker int i;
19*c8d645caSAndroid Build Coastguard Worker Person person = Person_init_zero;
20*c8d645caSAndroid Build Coastguard Worker
21*c8d645caSAndroid Build Coastguard Worker if (!pb_decode(stream, Person_fields, &person))
22*c8d645caSAndroid Build Coastguard Worker return false;
23*c8d645caSAndroid Build Coastguard Worker
24*c8d645caSAndroid Build Coastguard Worker /* Now the decoding is done, rest is just to print stuff out. */
25*c8d645caSAndroid Build Coastguard Worker
26*c8d645caSAndroid Build Coastguard Worker printf("name: \"%s\"\n", person.name);
27*c8d645caSAndroid Build Coastguard Worker printf("id: %ld\n", (long)person.id);
28*c8d645caSAndroid Build Coastguard Worker
29*c8d645caSAndroid Build Coastguard Worker if (person.has_email)
30*c8d645caSAndroid Build Coastguard Worker printf("email: \"%s\"\n", person.email);
31*c8d645caSAndroid Build Coastguard Worker
32*c8d645caSAndroid Build Coastguard Worker for (i = 0; i < person.phone_count; i++)
33*c8d645caSAndroid Build Coastguard Worker {
34*c8d645caSAndroid Build Coastguard Worker Person_PhoneNumber *phone = &person.phone[i];
35*c8d645caSAndroid Build Coastguard Worker printf("phone {\n");
36*c8d645caSAndroid Build Coastguard Worker printf(" number: \"%s\"\n", phone->number);
37*c8d645caSAndroid Build Coastguard Worker
38*c8d645caSAndroid Build Coastguard Worker if (phone->has_type)
39*c8d645caSAndroid Build Coastguard Worker {
40*c8d645caSAndroid Build Coastguard Worker switch (phone->type)
41*c8d645caSAndroid Build Coastguard Worker {
42*c8d645caSAndroid Build Coastguard Worker case Person_PhoneType_WORK:
43*c8d645caSAndroid Build Coastguard Worker printf(" type: WORK\n");
44*c8d645caSAndroid Build Coastguard Worker break;
45*c8d645caSAndroid Build Coastguard Worker
46*c8d645caSAndroid Build Coastguard Worker case Person_PhoneType_HOME:
47*c8d645caSAndroid Build Coastguard Worker printf(" type: HOME\n");
48*c8d645caSAndroid Build Coastguard Worker break;
49*c8d645caSAndroid Build Coastguard Worker
50*c8d645caSAndroid Build Coastguard Worker case Person_PhoneType_MOBILE:
51*c8d645caSAndroid Build Coastguard Worker printf(" type: MOBILE\n");
52*c8d645caSAndroid Build Coastguard Worker break;
53*c8d645caSAndroid Build Coastguard Worker }
54*c8d645caSAndroid Build Coastguard Worker }
55*c8d645caSAndroid Build Coastguard Worker printf("}\n");
56*c8d645caSAndroid Build Coastguard Worker }
57*c8d645caSAndroid Build Coastguard Worker
58*c8d645caSAndroid Build Coastguard Worker return true;
59*c8d645caSAndroid Build Coastguard Worker }
60*c8d645caSAndroid Build Coastguard Worker
main()61*c8d645caSAndroid Build Coastguard Worker int main()
62*c8d645caSAndroid Build Coastguard Worker {
63*c8d645caSAndroid Build Coastguard Worker uint8_t buffer[Person_size];
64*c8d645caSAndroid Build Coastguard Worker pb_istream_t stream;
65*c8d645caSAndroid Build Coastguard Worker size_t count;
66*c8d645caSAndroid Build Coastguard Worker
67*c8d645caSAndroid Build Coastguard Worker /* Read the data into buffer */
68*c8d645caSAndroid Build Coastguard Worker SET_BINARY_MODE(stdin);
69*c8d645caSAndroid Build Coastguard Worker count = fread(buffer, 1, sizeof(buffer), stdin);
70*c8d645caSAndroid Build Coastguard Worker
71*c8d645caSAndroid Build Coastguard Worker if (!feof(stdin))
72*c8d645caSAndroid Build Coastguard Worker {
73*c8d645caSAndroid Build Coastguard Worker printf("Message does not fit in buffer\n");
74*c8d645caSAndroid Build Coastguard Worker return 1;
75*c8d645caSAndroid Build Coastguard Worker }
76*c8d645caSAndroid Build Coastguard Worker
77*c8d645caSAndroid Build Coastguard Worker /* Construct a pb_istream_t for reading from the buffer */
78*c8d645caSAndroid Build Coastguard Worker stream = pb_istream_from_buffer(buffer, count);
79*c8d645caSAndroid Build Coastguard Worker
80*c8d645caSAndroid Build Coastguard Worker /* Decode and print out the stuff */
81*c8d645caSAndroid Build Coastguard Worker if (!print_person(&stream))
82*c8d645caSAndroid Build Coastguard Worker {
83*c8d645caSAndroid Build Coastguard Worker printf("Parsing failed: %s\n", PB_GET_ERROR(&stream));
84*c8d645caSAndroid Build Coastguard Worker return 1;
85*c8d645caSAndroid Build Coastguard Worker } else {
86*c8d645caSAndroid Build Coastguard Worker return 0;
87*c8d645caSAndroid Build Coastguard Worker }
88*c8d645caSAndroid Build Coastguard Worker }
89