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