Organize allocation logic in generator, add pb_bytes_ptr_t.
[apps/agl-service-can-low-level.git] / tests / alltypes_pointer / encode_alltypes_pointer.c
1 /* Attempts to test all the datatypes supported by ProtoBuf.
2  */
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <pb_encode.h>
8 #include "alltypes.pb.h"
9 #include "test_helpers.h"
10
11 int main(int argc, char **argv)
12 {
13     int mode = (argc > 1) ? atoi(argv[1]) : 0;
14     
15     /* Initialize values to encode */
16     int32_t value_int32 = -1000;
17     int64_t value_int64 = -10000000000;
18
19     uint32_t value_uint32 = 1000;
20     uint64_t value_uint64 = 10000000000;
21
22     bool value_bool = true;
23     float value_float = 1000.0f;
24     double value_double = 1000.0f;
25
26     char *value_string = "1000";
27     
28     pb_bytes_ptr_t value_bytes = {4, (uint8_t*)"1000"};
29
30     SubMessage value_submessage = {0};
31     MyEnum value_enum = MyEnum_Truth;
32     EmptyMessage value_empty_message = {0};
33
34     /* Initialize the structure with constants */
35     AllTypes alltypes = {0};
36
37     alltypes.req_int32         = &value_int32;
38     alltypes.req_int64         = &value_int64;
39     alltypes.req_uint32        = &value_uint32;
40     alltypes.req_uint64        = &value_uint64;
41     alltypes.req_sint32        = &value_int32;
42     alltypes.req_sint64        = &value_int64;
43     alltypes.req_bool          = &value_bool;
44     
45     alltypes.req_fixed32       = &value_uint32;
46     alltypes.req_sfixed32      = &value_int32;
47     alltypes.req_float         = &value_float;
48     
49     alltypes.req_fixed64       = &value_uint64;
50     alltypes.req_sfixed64      = &value_int64;
51     alltypes.req_double        = &value_double;
52
53     alltypes.req_string        = value_string;
54     
55     alltypes.req_bytes         = &value_bytes;
56
57     value_submessage.substuff1 = value_string;
58     value_submessage.substuff2 = &value_int32;
59
60     alltypes.req_submsg        = &value_submessage;
61     alltypes.req_enum          = &value_enum;
62     alltypes.req_emptymsg      = &value_empty_message;
63     
64     alltypes.rep_int32_count = 1; alltypes.rep_int32 = &value_int32;
65     alltypes.rep_int64_count = 1; alltypes.rep_int64 = &value_int64;
66     alltypes.rep_uint32_count = 1; alltypes.rep_uint32 = &value_uint32;
67     alltypes.rep_uint64_count = 1; alltypes.rep_uint64 = &value_uint64;
68     alltypes.rep_sint32_count = 1; alltypes.rep_sint32 = &value_int32;
69     alltypes.rep_sint64_count = 1; alltypes.rep_sint64 = &value_int64;
70     alltypes.rep_bool_count = 1; alltypes.rep_bool = &value_bool;
71     
72     alltypes.rep_fixed32_count = 1; alltypes.rep_fixed32 = &value_uint32;
73     alltypes.rep_sfixed32_count = 1; alltypes.rep_sfixed32 = &value_int32;
74     alltypes.rep_float_count = 1; alltypes.rep_float = &value_float;
75     
76     alltypes.rep_fixed64_count = 1; alltypes.rep_fixed64 = &value_uint64;
77     alltypes.rep_sfixed64_count = 1; alltypes.rep_sfixed64 = &value_int64;
78     alltypes.rep_double_count = 1; alltypes.rep_double = &value_double;
79
80     alltypes.rep_string_count = 1; alltypes.rep_string = (char **)&value_string;
81     alltypes.rep_bytes_count = 1; alltypes.rep_bytes = &value_bytes;
82
83     alltypes.rep_submsg_count = 1; alltypes.rep_submsg = &value_submessage;
84     alltypes.rep_enum_count = 1; alltypes.rep_enum = &value_enum;
85     alltypes.rep_emptymsg_count = 1; alltypes.rep_emptymsg = &value_empty_message;
86     
87     if (mode != 0)
88     {
89         /* Fill in values for optional fields */
90       alltypes.opt_int32         = &value_int32;
91       alltypes.opt_int64         = &value_int64;
92       alltypes.opt_uint32        = &value_uint32;
93       alltypes.opt_uint64        = &value_uint64;
94       alltypes.opt_sint32        = &value_int32;
95       alltypes.opt_sint64        = &value_int64;
96       alltypes.opt_bool          = &value_bool;
97     
98       alltypes.opt_fixed32       = &value_uint32;
99       alltypes.opt_sfixed32      = &value_int32;
100       alltypes.opt_float         = &value_float;
101     
102       alltypes.opt_fixed64       = &value_uint64;
103       alltypes.opt_sfixed64      = &value_int64;
104       alltypes.opt_double        = &value_double;
105     
106       alltypes.opt_string        = value_string;
107       
108       alltypes.opt_bytes         = &value_bytes;
109
110       alltypes.opt_submsg        = &value_submessage;
111       alltypes.opt_enum          = &value_enum;
112       alltypes.opt_emptymsg      = &value_empty_message;
113     }
114     
115     alltypes.end = &value_int32;
116     
117     {
118         uint8_t buffer[4096];
119         pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
120         
121         /* Now encode it and check if we succeeded. */
122         if (pb_encode(&stream, AllTypes_fields, &alltypes))
123         {
124             /*SET_BINARY_MODE(stdout);
125             fwrite(buffer, 1, stream.bytes_written, stdout);*/     /* TODO: use this to validate decoding, when implemented */
126             return 0; /* Success */
127         }
128         else
129         {
130             fprintf(stderr, "Encoding failed: %s\n", PB_GET_ERROR(&stream));
131             return 1; /* Failure */
132         }
133     }
134 }