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