decode_stream.c revision 7ef855e462b9a18b7d330e4b40f350164a6ad9da
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