xref: /aosp_15_r20/external/nanopb-c/tests/callbacks/encode_callbacks.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker /* Encoding testcase for callback fields */
2*c8d645caSAndroid Build Coastguard Worker 
3*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
4*c8d645caSAndroid Build Coastguard Worker #include <string.h>
5*c8d645caSAndroid Build Coastguard Worker #include <pb_encode.h>
6*c8d645caSAndroid Build Coastguard Worker #include "callbacks.pb.h"
7*c8d645caSAndroid Build Coastguard Worker #include "test_helpers.h"
8*c8d645caSAndroid Build Coastguard Worker 
encode_string(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)9*c8d645caSAndroid Build Coastguard Worker bool encode_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
10*c8d645caSAndroid Build Coastguard Worker {
11*c8d645caSAndroid Build Coastguard Worker     char *str = "Hello world!";
12*c8d645caSAndroid Build Coastguard Worker 
13*c8d645caSAndroid Build Coastguard Worker     if (!pb_encode_tag_for_field(stream, field))
14*c8d645caSAndroid Build Coastguard Worker         return false;
15*c8d645caSAndroid Build Coastguard Worker 
16*c8d645caSAndroid Build Coastguard Worker     return pb_encode_string(stream, (uint8_t*)str, strlen(str));
17*c8d645caSAndroid Build Coastguard Worker }
18*c8d645caSAndroid Build Coastguard Worker 
encode_int32(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)19*c8d645caSAndroid Build Coastguard Worker bool encode_int32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
20*c8d645caSAndroid Build Coastguard Worker {
21*c8d645caSAndroid Build Coastguard Worker     if (!pb_encode_tag_for_field(stream, field))
22*c8d645caSAndroid Build Coastguard Worker         return false;
23*c8d645caSAndroid Build Coastguard Worker 
24*c8d645caSAndroid Build Coastguard Worker     return pb_encode_varint(stream, 42);
25*c8d645caSAndroid Build Coastguard Worker }
26*c8d645caSAndroid Build Coastguard Worker 
encode_fixed32(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)27*c8d645caSAndroid Build Coastguard Worker bool encode_fixed32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
28*c8d645caSAndroid Build Coastguard Worker {
29*c8d645caSAndroid Build Coastguard Worker     uint32_t value = 42;
30*c8d645caSAndroid Build Coastguard Worker 
31*c8d645caSAndroid Build Coastguard Worker     if (!pb_encode_tag_for_field(stream, field))
32*c8d645caSAndroid Build Coastguard Worker         return false;
33*c8d645caSAndroid Build Coastguard Worker 
34*c8d645caSAndroid Build Coastguard Worker     return pb_encode_fixed32(stream, &value);
35*c8d645caSAndroid Build Coastguard Worker }
36*c8d645caSAndroid Build Coastguard Worker 
encode_fixed64(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)37*c8d645caSAndroid Build Coastguard Worker bool encode_fixed64(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
38*c8d645caSAndroid Build Coastguard Worker {
39*c8d645caSAndroid Build Coastguard Worker     uint64_t value = 42;
40*c8d645caSAndroid Build Coastguard Worker 
41*c8d645caSAndroid Build Coastguard Worker     if (!pb_encode_tag_for_field(stream, field))
42*c8d645caSAndroid Build Coastguard Worker         return false;
43*c8d645caSAndroid Build Coastguard Worker 
44*c8d645caSAndroid Build Coastguard Worker     return pb_encode_fixed64(stream, &value);
45*c8d645caSAndroid Build Coastguard Worker }
46*c8d645caSAndroid Build Coastguard Worker 
encode_repeatedstring(pb_ostream_t * stream,const pb_field_t * field,void * const * arg)47*c8d645caSAndroid Build Coastguard Worker bool encode_repeatedstring(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
48*c8d645caSAndroid Build Coastguard Worker {
49*c8d645caSAndroid Build Coastguard Worker     char *str[4] = {"Hello world!", "", "Test", "Test2"};
50*c8d645caSAndroid Build Coastguard Worker     int i;
51*c8d645caSAndroid Build Coastguard Worker 
52*c8d645caSAndroid Build Coastguard Worker     for (i = 0; i < 4; i++)
53*c8d645caSAndroid Build Coastguard Worker     {
54*c8d645caSAndroid Build Coastguard Worker         if (!pb_encode_tag_for_field(stream, field))
55*c8d645caSAndroid Build Coastguard Worker             return false;
56*c8d645caSAndroid Build Coastguard Worker 
57*c8d645caSAndroid Build Coastguard Worker         if (!pb_encode_string(stream, (uint8_t*)str[i], strlen(str[i])))
58*c8d645caSAndroid Build Coastguard Worker             return false;
59*c8d645caSAndroid Build Coastguard Worker     }
60*c8d645caSAndroid Build Coastguard Worker     return true;
61*c8d645caSAndroid Build Coastguard Worker }
62*c8d645caSAndroid Build Coastguard Worker 
main()63*c8d645caSAndroid Build Coastguard Worker int main()
64*c8d645caSAndroid Build Coastguard Worker {
65*c8d645caSAndroid Build Coastguard Worker     uint8_t buffer[1024];
66*c8d645caSAndroid Build Coastguard Worker     pb_ostream_t stream;
67*c8d645caSAndroid Build Coastguard Worker     TestMessage testmessage = {{{NULL}}};
68*c8d645caSAndroid Build Coastguard Worker 
69*c8d645caSAndroid Build Coastguard Worker     stream = pb_ostream_from_buffer(buffer, 1024);
70*c8d645caSAndroid Build Coastguard Worker 
71*c8d645caSAndroid Build Coastguard Worker     testmessage.stringvalue.funcs.encode = &encode_string;
72*c8d645caSAndroid Build Coastguard Worker     testmessage.int32value.funcs.encode = &encode_int32;
73*c8d645caSAndroid Build Coastguard Worker     testmessage.fixed32value.funcs.encode = &encode_fixed32;
74*c8d645caSAndroid Build Coastguard Worker     testmessage.fixed64value.funcs.encode = &encode_fixed64;
75*c8d645caSAndroid Build Coastguard Worker 
76*c8d645caSAndroid Build Coastguard Worker     testmessage.has_submsg = true;
77*c8d645caSAndroid Build Coastguard Worker     testmessage.submsg.stringvalue.funcs.encode = &encode_string;
78*c8d645caSAndroid Build Coastguard Worker     testmessage.submsg.int32value.funcs.encode = &encode_int32;
79*c8d645caSAndroid Build Coastguard Worker     testmessage.submsg.fixed32value.funcs.encode = &encode_fixed32;
80*c8d645caSAndroid Build Coastguard Worker     testmessage.submsg.fixed64value.funcs.encode = &encode_fixed64;
81*c8d645caSAndroid Build Coastguard Worker 
82*c8d645caSAndroid Build Coastguard Worker     testmessage.repeatedstring.funcs.encode = &encode_repeatedstring;
83*c8d645caSAndroid Build Coastguard Worker 
84*c8d645caSAndroid Build Coastguard Worker     if (!pb_encode(&stream, TestMessage_fields, &testmessage))
85*c8d645caSAndroid Build Coastguard Worker         return 1;
86*c8d645caSAndroid Build Coastguard Worker 
87*c8d645caSAndroid Build Coastguard Worker     SET_BINARY_MODE(stdout);
88*c8d645caSAndroid Build Coastguard Worker     if (fwrite(buffer, stream.bytes_written, 1, stdout) != 1)
89*c8d645caSAndroid Build Coastguard Worker         return 2;
90*c8d645caSAndroid Build Coastguard Worker 
91*c8d645caSAndroid Build Coastguard Worker     return 0;
92*c8d645caSAndroid Build Coastguard Worker }
93