xref: /aosp_15_r20/external/nanopb-c/tests/basic_buffer/decode_buffer.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
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