cueOS  2.4
cueOS - Universal Show Control OS for ARM
json_parser.c
1/***============================================================================================================================
2 * Dependencies inclusion
3 * Necessary dependencies should be declared here. Header file should contain as little dependecies declarations as possible
4 *=============================================================================================================================*/
5
6#include <stdlib.h>
7#include <string.h>
8#include "cmsis_os.h"
9#include "json_parser.h"
10
11
12/***============================================================================================================================
13 * Private functions definitions
14 * These functions are only accessible from within the file's scope
15 *=============================================================================================================================*/
16
23static void json_parser_json_string_cat(json_parser_json_string_s *json_string, char *data){
24 uint16_t data_len = strlen(data);
25 json_string->data = pvPortRealloc(json_string->data, json_string->len + data_len);
26 memmove(json_string->data + json_string->len, data, data_len);
27 json_string->len+=data_len;
28}
29
35static void json_parser_json_string_terminate(json_parser_json_string_s *json_string){
36 json_string->data = pvPortRealloc(json_string->data, json_string->len + 1);
37 memmove(json_string->data + json_string->len, "\0", 1);
38}
39
40
41/***============================================================================================================================
42 * Public functions definitions
43 * These functions can be accessed outside of the file's scope
44 * @see json_parser.h for declarations
45 *=============================================================================================================================*/
46
56void json_parser_json_string_put_int_pair(json_parser_json_string_s *json_string, char *key, uint16_t val, uint8_t is_initial, uint8_t is_final){
57
58 char val_str[20];
59 itoa(val, val_str, 10);
60
61 if(is_initial){
62 json_parser_json_string_cat(json_string, JSON_STRING_DELIMITOR);
63 }
64
65 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
66 json_parser_json_string_cat(json_string, key);
67 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
68 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_SEPARATOR);
69 json_parser_json_string_cat(json_string, val_str);
70
71 if(is_final){
72 json_parser_json_string_cat(json_string, JSON_STRING_TERMINATOR);
73 json_parser_json_string_terminate(json_string);
74 }else{
75 json_parser_json_string_cat(json_string, JSON_STRING_PAIR_SEPARATOR);
76 }
77
78}
79
89void json_parser_json_string_put_str_pair(json_parser_json_string_s *json_string, char *key, char *val, uint8_t is_initial, uint8_t is_final){
90
91 if(is_initial){
92 json_parser_json_string_cat(json_string, JSON_STRING_DELIMITOR);
93 }
94
95 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
96 json_parser_json_string_cat(json_string, key);
97 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
98 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_SEPARATOR);
99 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
100 json_parser_json_string_cat(json_string, val);
101 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
102
103 if(is_final){
104 json_parser_json_string_cat(json_string, JSON_STRING_TERMINATOR);
105 json_parser_json_string_terminate(json_string);
106 }else{
107 json_parser_json_string_cat(json_string, JSON_STRING_PAIR_SEPARATOR);
108 }
109
110}
111
121void json_parser_json_string_nest(json_parser_json_string_s *json_string, char *key, json_parser_json_string_s *nested_json_string, uint8_t is_initial, uint8_t is_final){
122
123 if(is_initial){
124 json_parser_json_string_cat(json_string, JSON_STRING_DELIMITOR);
125 }
126
127 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
128 json_parser_json_string_cat(json_string, key);
129 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_DELIMITOR);
130 json_parser_json_string_cat(json_string, JSON_STRING_ENTRY_SEPARATOR);
131 json_parser_json_string_cat(json_string, nested_json_string->data);
132
133 if(is_final){
134 json_parser_json_string_cat(json_string, JSON_STRING_TERMINATOR);
135 json_parser_json_string_terminate(json_string);
136 }else{
137 json_parser_json_string_cat(json_string, JSON_STRING_PAIR_SEPARATOR);
138 }
139
140}
141
150void json_parser_json_string_put_array_object(json_parser_json_string_s *json_string, json_parser_json_string_s *json_object, uint8_t is_initial, uint8_t is_final){
151
152 if(is_initial){
153 json_parser_json_string_cat(json_string, JSON_ARRAY_DELIMITOR);
154 }
155
156 if(json_object!=NULL){
157 json_parser_json_string_cat(json_string, json_object->data);
158 }
159
160 if(is_final){
161 json_parser_json_string_cat(json_string, JSON_ARRAY_TERMINATOR);
162 json_parser_json_string_terminate(json_string);
163 }else{
164 json_parser_json_string_cat(json_string, JSON_STRING_PAIR_SEPARATOR);
165 }
166
167}
168
177void json_parser_json_string_put_array_int(json_parser_json_string_s *json_string, uint16_t val, uint8_t is_initial, uint8_t is_final){
178
179
180 char val_str[20];
181 itoa(val, val_str, 10);
182
183 if(is_initial){
184 json_parser_json_string_cat(json_string, JSON_ARRAY_DELIMITOR);
185 }
186
187 json_parser_json_string_cat(json_string, val_str);
188
189 if(is_final){
190 json_parser_json_string_cat(json_string, JSON_ARRAY_TERMINATOR);
191 json_parser_json_string_terminate(json_string);
192 }else{
193 json_parser_json_string_cat(json_string, JSON_STRING_PAIR_SEPARATOR);
194 }
195
196}
197
207json_parser_json_object_s *json_parser_parse(char *json_string, uint16_t json_string_len){
208
209 json_parser_json_object_s *json_object = pvPortMalloc(sizeof(json_parser_json_object_s));
210 json_object->params = pvPortMalloc(sizeof(json_parser_json_param_s));
211 json_object->param_count = 0;
212
213 char *key_start = NULL;
214 char *key_end = NULL;
215 char *val_start = NULL;
216 char *val_end = NULL;
217
218 if(json_string[0] == JSON_STRING_DELIMITOR[0] && json_string[json_string_len-1] == JSON_STRING_TERMINATOR[0] ){
219
220 json_object->param_count = 0;
221 json_string++;
222
223 do{
224
225 key_start = strnstr(json_string,JSON_STRING_ENTRY_DELIMITOR, json_string_len);
226 key_end = strnstr(key_start+1,JSON_STRING_ENTRY_DELIMITOR, json_string_len);
227 val_start = strnstr(key_end+1 ,JSON_STRING_ENTRY_DELIMITOR, json_string_len);
228 val_end = strnstr(val_start+1,JSON_STRING_ENTRY_DELIMITOR, json_string_len);
229
230 if(key_start != NULL && key_end != NULL && val_start !=NULL && val_end != NULL){
231
232 uint8_t key_len = key_end - key_start;
233 uint8_t val_len = val_end - val_start;
234
235 json_object->params = pvPortRealloc(json_object->params, sizeof(json_parser_json_param_s) * ++json_object->param_count);
236
237 json_object->params[json_object->param_count-1].key = pvPortMalloc(key_len * sizeof(char));
238 json_object->params[json_object->param_count-1].val = pvPortMalloc(val_len * sizeof(char));
239
240 memmove(json_object->params[json_object->param_count-1].key, key_start+1, key_len);
241 memmove(json_object->params[json_object->param_count-1].val, val_start+1, val_len);
242
243 json_object->params[json_object->param_count-1].key[key_len-1] = 0;
244 json_object->params[json_object->param_count-1].val[val_len-1] = 0;
245
246 json_string = val_end + 1;
247
248 }
249
250 }while(key_start != NULL && key_end != NULL && val_start !=NULL && val_end != NULL);
251 }
252
253 return json_object;
254
255}
256
257
264
265 for(uint16_t i=0; i<json_object->param_count;i++){
266 vPortFree(json_object->params[i].key);
267 vPortFree(json_object->params[i].val);
268 json_object->params[i].key = NULL;
269 json_object->params[i].val = NULL;
270 }
271
272 vPortFree(json_object->params);
273 vPortFree(json_object);
274
275}
276
283 json_parser_json_string_s *json_string = pvPortMalloc(sizeof(json_parser_json_string_s));
284 json_string->data = NULL;
285 json_string->len = 0;
286 return json_string;
287}
288
295 vPortFree(json_string->data);
296 vPortFree(json_string);
297}
void json_parser_free_json_string(json_parser_json_string_s *json_string)
Frees a json string instance.
Definition: json_parser.c:294
#define JSON_STRING_ENTRY_DELIMITOR
Definition: json_parser.h:15
void json_parser_json_string_put_str_pair(json_parser_json_string_s *json_string, char *key, char *val, uint8_t is_initial, uint8_t is_final)
Puts a JSON key/(string)value pair into a provided json string object;.
Definition: json_parser.c:89
void json_parser_json_string_nest(json_parser_json_string_s *json_string, char *key, json_parser_json_string_s *nested_json_string, uint8_t is_initial, uint8_t is_final)
Nests a child JSON string into a parent JSON string.
Definition: json_parser.c:121
#define JSON_STRING_PAIR_SEPARATOR
Definition: json_parser.h:17
void json_parser_json_string_put_array_int(json_parser_json_string_s *json_string, uint16_t val, uint8_t is_initial, uint8_t is_final)
Nests a child JSON string into a parent JSON array.
Definition: json_parser.c:177
void json_parser_json_string_put_array_object(json_parser_json_string_s *json_string, json_parser_json_string_s *json_object, uint8_t is_initial, uint8_t is_final)
Nests a child JSON string into a parent JSON array.
Definition: json_parser.c:150
void json_parser_json_string_put_int_pair(json_parser_json_string_s *json_string, char *key, uint16_t val, uint8_t is_initial, uint8_t is_final)
Puts a JSON key/(integer)value pair into a provided json string object;.
Definition: json_parser.c:56
#define JSON_ARRAY_DELIMITOR
Definition: json_parser.h:11
void json_parser_free_json_object(json_parser_json_object_s *json_object)
Frees a parsed json object.
Definition: json_parser.c:263
#define JSON_ARRAY_TERMINATOR
Definition: json_parser.h:12
#define JSON_STRING_DELIMITOR
Definition: json_parser.h:13
#define JSON_STRING_ENTRY_SEPARATOR
Definition: json_parser.h:16
json_parser_json_string_s * json_parser_json_string_new(void)
Creates and initialises a new json string instance.
Definition: json_parser.c:282
json_parser_json_object_s * json_parser_parse(char *json_string, uint16_t json_string_len)
Retrieves key/value pairs from a JSON encoded string.
Definition: json_parser.c:207
#define JSON_STRING_TERMINATOR
Definition: json_parser.h:14
JSON Objects structure object.
Definition: json_parser.h:30
json_parser_json_param_s * params
Definition: json_parser.h:31
JSON parameter structure object.
Definition: json_parser.h:22
JSON String structure object.
Definition: json_parser.h:38