Home | History | Annotate | Download | only in basic_stream
      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. */
     12 bool 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 */
     58 bool 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 
     71 int 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