36 #define SPECIAL_CHARS "{}[]:,\" \n\r\t" 37 #define OPEN_CURLY '{' 38 #define CLSE_CURLY '}' 39 #define OPEN_SQUARE '[' 40 #define CLSE_SQUARE ']' 42 #define DBLE_QUOTE '\"' 44 #define MIN_AFTER_TOKEN 6 45 #define NEXT_CHAR(p, l) p++; l--; 46 #define SKIP_TO_CHAR(p, l, c) do { NEXT_CHAR(p, l) } while (*p != c && l != 0) 47 #define SKIP_DATA(pc, lt) while (lt != 0 && strchr(special_chars, *pc) == NULL) { NEXT_CHAR(pc, lt) } 48 #define SKIP_SPACES(pc, lt) while (lt != 0 && (*pc == ' ' || *pc == '\n' || *pc == '\r' || *pc == '\t')) { NEXT_CHAR(pc, lt) } 54 static const char *
const special_chars = SPECIAL_CHARS;
58 static E_JSON_STATE ParseJsonObject(
char **ppData, U32BIT *pLeft,
60 static E_JSON_STATE ParseJsonMember(
char **ppData, U32BIT *pLeft,
63 static unsigned int JsonArrayCount(
char *pData, U32BIT Left );
65 static void ParseJsonArrayObject(
char **ppData, U32BIT *pLeft,
80 char *in_data = (
char *)data;
83 return ParseJsonObject( &in_data, &left, members, usr );
92 assert( p_str != NULL );
93 STR_DataFree( p_str->zptr, p_str->zlen );
126 static E_JSON_STATE ParseJsonMember(
char **ppData, U32BIT *pLeft,
130 E_JSON_STATE state = JSON_ERROR;
131 char *pData = *ppData;
132 U32BIT left = *pLeft;
135 if (*pData == DBLE_QUOTE && left > MIN_AFTER_TOKEN)
137 NEXT_CHAR(pData, left)
139 while (pMmber->tk_len != 0 &&
140 (pData[pMmber->tk_len] != DBLE_QUOTE || memcmp(pData, pMmber->tk_str, pMmber->tk_len)))
146 SKIP_TO_CHAR( pData, left, DBLE_QUOTE);
147 NEXT_CHAR(pData, left)
148 SKIP_SPACES(pData, left)
150 if (*pData ==
':' && left > 1)
152 NEXT_CHAR(pData, left)
153 SKIP_SPACES(pData, left)
157 if (*pData >=
'0' && *pData <=
'9')
163 value += *pData -
'0';
164 NEXT_CHAR(pData, left)
166 while (*pData >=
'0' && *pData <=
'9' && left != 0);
167 if (pMmber->u.ptr != NULL)
169 switch (pMmber->type)
171 case JST_PTR_INTEGER:
172 *pMmber->u.p_uint = value;
174 case JST_CBF_INTEGER:
175 (void)(pMmber->u.cb_func)( value, NULL, usr );
184 SKIP_DATA(pData, left)
190 char *pStr = pData + 1;
193 NEXT_CHAR(pData, left)
195 while (*pData != DBLE_QUOTE && left != 0);
196 if (*pData == DBLE_QUOTE)
198 if (pMmber->u.ptr != NULL)
200 value = (
unsigned int)(pData - pStr);
201 switch (pMmber->type)
204 pMmber->u.p_str->zlen = value;
205 pMmber->u.p_str->zptr = (U8BIT *)pStr;
209 (void)(pMmber->u.cb_func)( value, pStr, usr );
212 case JST_PTR_ASTRING:
213 case JST_CBF_ASTRING:
215 U8BIT *pAstr = STR_DataAlloc( value );
218 memcpy(pAstr, pStr, value);
219 assert(pAstr[value] == 0);
220 if (pMmber->type == JST_PTR_ASTRING)
222 assert(pMmber->u.p_str->zptr == NULL);
223 pMmber->u.p_str->zlen = value;
224 pMmber->u.p_str->zptr = pAstr;
228 (void)(pMmber->u.cb_func)( value, pAstr, usr );
239 NEXT_CHAR(pData, left)
248 NEXT_CHAR(pData, left)
249 SKIP_SPACES(pData, left)
251 if (pMmber->u.ptr != NULL || pMmber->pChildren != NULL)
253 switch (pMmber->type)
255 case JST_CBF_ARRAY_OBJ:
256 ParseJsonArrayObject( &pData, &left, pMmber, usr );
258 case JST_CBF_ARRAY_INT:
259 case JST_CBF_ARRAY_STR:
264 while (*pData != CLSE_SQUARE && left != 0)
266 NEXT_CHAR(pData, left)
270 NEXT_CHAR(pData, left)
277 if (pMmber->type != JST_CBF_OBJECT ||
278 pMmber->pChildren == NULL)
284 state = ParseJsonObject( &pData, &left, pMmber->pChildren, usr );
304 static E_JSON_STATE ParseJsonObject(
char **ppData, U32BIT *pLeft,
308 char *pData = *ppData;
309 U32BIT left = *pLeft;
311 SKIP_SPACES(pData, left)
313 if (*pData == OPEN_CURLY && left > MIN_AFTER_TOKEN)
315 NEXT_CHAR(pData, left)
316 SKIP_SPACES(pData, left)
318 assert( members->type != JST_CBF_OBJECT );
320 while (left > 0 && state > JSON_OKAY)
325 if (state == JSON_MAIN)
327 state = ParseJsonMember( &pData, &left, members, usr );
337 if (state == JSON_NEXT)
340 NEXT_CHAR(pData, left)
350 if (state == JSON_NEXT)
353 NEXT_CHAR(pData, left)
366 SKIP_SPACES(pData, left)
385 static unsigned int JsonArrayCount(
char *pData, U32BIT left )
387 unsigned int count = 0;
390 while (left > 0 && *pData != CLSE_SQUARE)
397 NEXT_CHAR(pData, left)
399 while (left > 0 && *pData != DBLE_QUOTE);
406 NEXT_CHAR(pData, left)
408 while (left > 0 && *pData != CLSE_CURLY);
413 if (*pData >=
'0' && *pData <=
'9')
424 NEXT_CHAR(pData, left)
440 static void ParseJsonArrayObject(
char **ppData, U32BIT *pLeft,
444 char *pData = *ppData;
445 U32BIT left = *pLeft;
448 if (pMmber->u.cb_func != NULL)
450 usr = (pMmber->u.cb_func)( JsonArrayCount(pData, left), NULL, usr );
454 while (left > 0 && state > JSON_OKAY)
462 if (state == JSON_MAIN &&
463 ParseJsonObject( &pData, &left, (pChild->type == JST_CBF_OBJECT) ? (pChild + 1) : pChild, usr ) == JSON_OKAY)
466 if (pChild->type == JST_CBF_OBJECT && pChild->u.ptr != NULL)
468 usr = (pChild->u.cb_func)( JSON_VALUE_FINISH, NULL, usr );
475 while (*pData != CLSE_CURLY && left != 0)
477 NEXT_CHAR(pData, left)
485 if (state == JSON_NEXT)
488 NEXT_CHAR(pData, left)
498 if (state == JSON_NEXT)
514 SKIP_SPACES(pData, left)
516 if (pMmber->u.cb_func != NULL)
518 (pMmber->u.cb_func)((state == JSON_OKAY) ? JSON_VALUE_FINISH : JSON_VALUE_ERROR, NULL, usr );
void JSON_FreeStrArray(S_STRING **pp_str)
E_JSON_STATE JSON_Parse(U8BIT *data, U32BIT size, const S_JSON_MEMBERS *members, void *usr)
void JSON_FreeUintArray(U32BIT *p_uint)
Mheg5 logging and debug printing.
void JSON_FreeAstring(S_STRING *p_str)
string parsing utility functions described by the [JSON] schema