1*254b1274SAndroid Build Coastguard Worker #ifndef CN_CREATE_C
2*254b1274SAndroid Build Coastguard Worker #define CN_CREATE_C
3*254b1274SAndroid Build Coastguard Worker
4*254b1274SAndroid Build Coastguard Worker #ifdef __cplusplus
5*254b1274SAndroid Build Coastguard Worker extern "C" {
6*254b1274SAndroid Build Coastguard Worker #endif
7*254b1274SAndroid Build Coastguard Worker
8*254b1274SAndroid Build Coastguard Worker #include <string.h>
9*254b1274SAndroid Build Coastguard Worker #include <stdlib.h>
10*254b1274SAndroid Build Coastguard Worker
11*254b1274SAndroid Build Coastguard Worker #include "cn-cbor/cn-cbor.h"
12*254b1274SAndroid Build Coastguard Worker #include "cbor.h"
13*254b1274SAndroid Build Coastguard Worker
14*254b1274SAndroid Build Coastguard Worker #define INIT_CB(v) \
15*254b1274SAndroid Build Coastguard Worker if (errp) {errp->err = CN_CBOR_NO_ERROR;} \
16*254b1274SAndroid Build Coastguard Worker (v) = CN_CALLOC_CONTEXT(); \
17*254b1274SAndroid Build Coastguard Worker if (!(v)) { if (errp) {errp->err = CN_CBOR_ERR_OUT_OF_MEMORY;} return NULL; }
18*254b1274SAndroid Build Coastguard Worker
cn_cbor_map_create(CBOR_CONTEXT_COMMA cn_cbor_errback * errp)19*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_map_create(CBOR_CONTEXT_COMMA cn_cbor_errback *errp)
20*254b1274SAndroid Build Coastguard Worker {
21*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
22*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
23*254b1274SAndroid Build Coastguard Worker
24*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_MAP;
25*254b1274SAndroid Build Coastguard Worker ret->flags |= CN_CBOR_FL_COUNT;
26*254b1274SAndroid Build Coastguard Worker
27*254b1274SAndroid Build Coastguard Worker return ret;
28*254b1274SAndroid Build Coastguard Worker }
29*254b1274SAndroid Build Coastguard Worker
cn_cbor_data_create(const uint8_t * data,int len CBOR_CONTEXT,cn_cbor_errback * errp)30*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_data_create(const uint8_t* data, int len
31*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
32*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
33*254b1274SAndroid Build Coastguard Worker {
34*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
35*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
36*254b1274SAndroid Build Coastguard Worker
37*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_BYTES;
38*254b1274SAndroid Build Coastguard Worker ret->length = len;
39*254b1274SAndroid Build Coastguard Worker ret->v.str = (const char*) data; // TODO: add v.ustr to the union?
40*254b1274SAndroid Build Coastguard Worker
41*254b1274SAndroid Build Coastguard Worker return ret;
42*254b1274SAndroid Build Coastguard Worker }
43*254b1274SAndroid Build Coastguard Worker
cn_cbor_string_create(const char * data CBOR_CONTEXT,cn_cbor_errback * errp)44*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_string_create(const char* data
45*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
46*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
47*254b1274SAndroid Build Coastguard Worker {
48*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
49*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
50*254b1274SAndroid Build Coastguard Worker
51*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_TEXT;
52*254b1274SAndroid Build Coastguard Worker ret->length = strlen(data);
53*254b1274SAndroid Build Coastguard Worker ret->v.str = data;
54*254b1274SAndroid Build Coastguard Worker
55*254b1274SAndroid Build Coastguard Worker return ret;
56*254b1274SAndroid Build Coastguard Worker }
57*254b1274SAndroid Build Coastguard Worker
cn_cbor_int_create(int64_t value CBOR_CONTEXT,cn_cbor_errback * errp)58*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_int_create(int64_t value
59*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
60*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
61*254b1274SAndroid Build Coastguard Worker {
62*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
63*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
64*254b1274SAndroid Build Coastguard Worker
65*254b1274SAndroid Build Coastguard Worker if (value<0) {
66*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_INT;
67*254b1274SAndroid Build Coastguard Worker ret->v.sint = value;
68*254b1274SAndroid Build Coastguard Worker } else {
69*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_UINT;
70*254b1274SAndroid Build Coastguard Worker ret->v.uint = value;
71*254b1274SAndroid Build Coastguard Worker }
72*254b1274SAndroid Build Coastguard Worker
73*254b1274SAndroid Build Coastguard Worker return ret;
74*254b1274SAndroid Build Coastguard Worker }
75*254b1274SAndroid Build Coastguard Worker
76*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
cn_cbor_float_create(float value CBOR_CONTEXT,cn_cbor_errback * errp)77*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_float_create(float value
78*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
79*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
80*254b1274SAndroid Build Coastguard Worker {
81*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
82*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
83*254b1274SAndroid Build Coastguard Worker
84*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_FLOAT;
85*254b1274SAndroid Build Coastguard Worker ret->v.f = value;
86*254b1274SAndroid Build Coastguard Worker
87*254b1274SAndroid Build Coastguard Worker return ret;
88*254b1274SAndroid Build Coastguard Worker }
89*254b1274SAndroid Build Coastguard Worker
cn_cbor_double_create(double value CBOR_CONTEXT,cn_cbor_errback * errp)90*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_double_create(double value
91*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
92*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
93*254b1274SAndroid Build Coastguard Worker {
94*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
95*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
96*254b1274SAndroid Build Coastguard Worker
97*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_DOUBLE;
98*254b1274SAndroid Build Coastguard Worker ret->v.dbl = value;
99*254b1274SAndroid Build Coastguard Worker
100*254b1274SAndroid Build Coastguard Worker return ret;
101*254b1274SAndroid Build Coastguard Worker }
102*254b1274SAndroid Build Coastguard Worker #endif /* CBOR_NO_FLOAT */
103*254b1274SAndroid Build Coastguard Worker
_append_kv(cn_cbor * cb_map,cn_cbor * key,cn_cbor * val)104*254b1274SAndroid Build Coastguard Worker static bool _append_kv(cn_cbor *cb_map, cn_cbor *key, cn_cbor *val)
105*254b1274SAndroid Build Coastguard Worker {
106*254b1274SAndroid Build Coastguard Worker //Connect key and value and insert them into the map.
107*254b1274SAndroid Build Coastguard Worker key->parent = cb_map;
108*254b1274SAndroid Build Coastguard Worker key->next = val;
109*254b1274SAndroid Build Coastguard Worker val->parent = cb_map;
110*254b1274SAndroid Build Coastguard Worker val->next = NULL;
111*254b1274SAndroid Build Coastguard Worker
112*254b1274SAndroid Build Coastguard Worker if(cb_map->last_child) {
113*254b1274SAndroid Build Coastguard Worker cb_map->last_child->next = key;
114*254b1274SAndroid Build Coastguard Worker } else {
115*254b1274SAndroid Build Coastguard Worker cb_map->first_child = key;
116*254b1274SAndroid Build Coastguard Worker }
117*254b1274SAndroid Build Coastguard Worker cb_map->last_child = val;
118*254b1274SAndroid Build Coastguard Worker cb_map->length += 2;
119*254b1274SAndroid Build Coastguard Worker return true;
120*254b1274SAndroid Build Coastguard Worker }
121*254b1274SAndroid Build Coastguard Worker
cn_cbor_map_put(cn_cbor * cb_map,cn_cbor * cb_key,cn_cbor * cb_value,cn_cbor_errback * errp)122*254b1274SAndroid Build Coastguard Worker bool cn_cbor_map_put(cn_cbor* cb_map,
123*254b1274SAndroid Build Coastguard Worker cn_cbor *cb_key, cn_cbor *cb_value,
124*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
125*254b1274SAndroid Build Coastguard Worker {
126*254b1274SAndroid Build Coastguard Worker //Make sure input is a map. Otherwise
127*254b1274SAndroid Build Coastguard Worker if(!cb_map || !cb_key || !cb_value || cb_map->type != CN_CBOR_MAP)
128*254b1274SAndroid Build Coastguard Worker {
129*254b1274SAndroid Build Coastguard Worker if (errp) {errp->err = CN_CBOR_ERR_INVALID_PARAMETER;}
130*254b1274SAndroid Build Coastguard Worker return false;
131*254b1274SAndroid Build Coastguard Worker }
132*254b1274SAndroid Build Coastguard Worker
133*254b1274SAndroid Build Coastguard Worker return _append_kv(cb_map, cb_key, cb_value);
134*254b1274SAndroid Build Coastguard Worker }
135*254b1274SAndroid Build Coastguard Worker
cn_cbor_mapput_int(cn_cbor * cb_map,int64_t key,cn_cbor * cb_value CBOR_CONTEXT,cn_cbor_errback * errp)136*254b1274SAndroid Build Coastguard Worker bool cn_cbor_mapput_int(cn_cbor* cb_map,
137*254b1274SAndroid Build Coastguard Worker int64_t key, cn_cbor* cb_value
138*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
139*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
140*254b1274SAndroid Build Coastguard Worker {
141*254b1274SAndroid Build Coastguard Worker cn_cbor* cb_key;
142*254b1274SAndroid Build Coastguard Worker
143*254b1274SAndroid Build Coastguard Worker //Make sure input is a map. Otherwise
144*254b1274SAndroid Build Coastguard Worker if(!cb_map || !cb_value || cb_map->type != CN_CBOR_MAP)
145*254b1274SAndroid Build Coastguard Worker {
146*254b1274SAndroid Build Coastguard Worker if (errp) {errp->err = CN_CBOR_ERR_INVALID_PARAMETER;}
147*254b1274SAndroid Build Coastguard Worker return false;
148*254b1274SAndroid Build Coastguard Worker }
149*254b1274SAndroid Build Coastguard Worker
150*254b1274SAndroid Build Coastguard Worker cb_key = cn_cbor_int_create(key CBOR_CONTEXT_PARAM, errp);
151*254b1274SAndroid Build Coastguard Worker if (!cb_key) { return false; }
152*254b1274SAndroid Build Coastguard Worker return _append_kv(cb_map, cb_key, cb_value);
153*254b1274SAndroid Build Coastguard Worker }
154*254b1274SAndroid Build Coastguard Worker
cn_cbor_mapput_string(cn_cbor * cb_map,const char * key,cn_cbor * cb_value CBOR_CONTEXT,cn_cbor_errback * errp)155*254b1274SAndroid Build Coastguard Worker bool cn_cbor_mapput_string(cn_cbor* cb_map,
156*254b1274SAndroid Build Coastguard Worker const char* key, cn_cbor* cb_value
157*254b1274SAndroid Build Coastguard Worker CBOR_CONTEXT,
158*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
159*254b1274SAndroid Build Coastguard Worker {
160*254b1274SAndroid Build Coastguard Worker cn_cbor* cb_key;
161*254b1274SAndroid Build Coastguard Worker
162*254b1274SAndroid Build Coastguard Worker //Make sure input is a map. Otherwise
163*254b1274SAndroid Build Coastguard Worker if(!cb_map || !cb_value || cb_map->type != CN_CBOR_MAP)
164*254b1274SAndroid Build Coastguard Worker {
165*254b1274SAndroid Build Coastguard Worker if (errp) {errp->err = CN_CBOR_ERR_INVALID_PARAMETER;}
166*254b1274SAndroid Build Coastguard Worker return false;
167*254b1274SAndroid Build Coastguard Worker }
168*254b1274SAndroid Build Coastguard Worker
169*254b1274SAndroid Build Coastguard Worker cb_key = cn_cbor_string_create(key CBOR_CONTEXT_PARAM, errp);
170*254b1274SAndroid Build Coastguard Worker if (!cb_key) { return false; }
171*254b1274SAndroid Build Coastguard Worker return _append_kv(cb_map, cb_key, cb_value);
172*254b1274SAndroid Build Coastguard Worker }
173*254b1274SAndroid Build Coastguard Worker
cn_cbor_array_create(CBOR_CONTEXT_COMMA cn_cbor_errback * errp)174*254b1274SAndroid Build Coastguard Worker cn_cbor* cn_cbor_array_create(CBOR_CONTEXT_COMMA cn_cbor_errback *errp)
175*254b1274SAndroid Build Coastguard Worker {
176*254b1274SAndroid Build Coastguard Worker cn_cbor* ret;
177*254b1274SAndroid Build Coastguard Worker INIT_CB(ret);
178*254b1274SAndroid Build Coastguard Worker
179*254b1274SAndroid Build Coastguard Worker ret->type = CN_CBOR_ARRAY;
180*254b1274SAndroid Build Coastguard Worker ret->flags |= CN_CBOR_FL_COUNT;
181*254b1274SAndroid Build Coastguard Worker
182*254b1274SAndroid Build Coastguard Worker return ret;
183*254b1274SAndroid Build Coastguard Worker }
184*254b1274SAndroid Build Coastguard Worker
cn_cbor_array_append(cn_cbor * cb_array,cn_cbor * cb_value,cn_cbor_errback * errp)185*254b1274SAndroid Build Coastguard Worker bool cn_cbor_array_append(cn_cbor* cb_array,
186*254b1274SAndroid Build Coastguard Worker cn_cbor* cb_value,
187*254b1274SAndroid Build Coastguard Worker cn_cbor_errback *errp)
188*254b1274SAndroid Build Coastguard Worker {
189*254b1274SAndroid Build Coastguard Worker //Make sure input is an array.
190*254b1274SAndroid Build Coastguard Worker if(!cb_array || !cb_value || cb_array->type != CN_CBOR_ARRAY)
191*254b1274SAndroid Build Coastguard Worker {
192*254b1274SAndroid Build Coastguard Worker if (errp) {errp->err = CN_CBOR_ERR_INVALID_PARAMETER;}
193*254b1274SAndroid Build Coastguard Worker return false;
194*254b1274SAndroid Build Coastguard Worker }
195*254b1274SAndroid Build Coastguard Worker
196*254b1274SAndroid Build Coastguard Worker cb_value->parent = cb_array;
197*254b1274SAndroid Build Coastguard Worker cb_value->next = NULL;
198*254b1274SAndroid Build Coastguard Worker if(cb_array->last_child) {
199*254b1274SAndroid Build Coastguard Worker cb_array->last_child->next = cb_value;
200*254b1274SAndroid Build Coastguard Worker } else {
201*254b1274SAndroid Build Coastguard Worker cb_array->first_child = cb_value;
202*254b1274SAndroid Build Coastguard Worker }
203*254b1274SAndroid Build Coastguard Worker cb_array->last_child = cb_value;
204*254b1274SAndroid Build Coastguard Worker cb_array->length++;
205*254b1274SAndroid Build Coastguard Worker return true;
206*254b1274SAndroid Build Coastguard Worker }
207*254b1274SAndroid Build Coastguard Worker
208*254b1274SAndroid Build Coastguard Worker #ifdef __cplusplus
209*254b1274SAndroid Build Coastguard Worker }
210*254b1274SAndroid Build Coastguard Worker #endif
211*254b1274SAndroid Build Coastguard Worker
212*254b1274SAndroid Build Coastguard Worker #endif /* CN_CBOR_C */
213