MOS Source Code
Loading...
Searching...
No Matches
decode_stream.c
Go to the documentation of this file.
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 = Person_init_zero;
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 size_t len = fread(buf, 1, count, file);
62
63 if (len == count)
64 {
65 return true;
66 }
67 else
68 {
69 stream->bytes_left = 0;
70 return false;
71 }
72}
73
74int main()
75{
76 pb_istream_t stream = {&callback, NULL, SIZE_MAX};
77 stream.state = stdin;
79
80 if (!print_person(&stream))
81 {
82 printf("Parsing failed: %s\n", PB_GET_ERROR(&stream));
83 return 1;
84 } else {
85 return 0;
86 }
87}
bool callback(pb_istream_t *stream, uint8_t *buf, size_t count)
bool print_person(pb_istream_t *stream)
int main()
size_t fread(void *__restrict ptr, size_t size, size_t nmemb, FILE *__restrict stream)
struct _FILE FILE
Definition mos_stdio.h:24
#define stdin
Definition mos_stdio.h:30
#define PB_GET_ERROR(stream)
Definition pb.h:891
bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct)
Definition pb_decode.c:1182
#define NULL
Definition pb_syshdr.h:46
unsigned char uint8_t
Definition pb_syshdr.h:20
#define SET_BINARY_MODE(file)