29#if (MODULE_MEGAWIFI != 0)
36#define JSMN_API static
38#define JSMN_API extern
58 JSMN_ERROR_NOMEM = -1,
60 JSMN_ERROR_INVAL = -2,
76#ifdef JSMN_PARENT_LINKS
94JSMN_API
void jsmn_init(jsmn_parser *parser);
101JSMN_API
int jsmn_parse(jsmn_parser *parser,
const char *js,
const unsigned int len,
102 jsmntok_t *tokens,
const unsigned int num_tokens);
108static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens,
109 const unsigned int num_tokens) {
111 if (parser->toknext >= num_tokens) {
114 tok = &tokens[parser->toknext++];
115 tok->start = tok->end = -1;
117#ifdef JSMN_PARENT_LINKS
126static void jsmn_fill_token(jsmntok_t *token,
const jsmntype_t type,
127 const int start,
const int end) {
129 token->start = start;
137static int jsmn_parse_primitive(jsmn_parser *parser,
const char *js,
138 const unsigned int len, jsmntok_t *tokens,
139 const unsigned int num_tokens) {
145 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
146 switch (js[parser->pos]) {
163 if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
165 return JSMN_ERROR_INVAL;
171 return JSMN_ERROR_PART;
175 if (tokens ==
NULL) {
179 token = jsmn_alloc_token(parser, tokens, num_tokens);
182 return JSMN_ERROR_NOMEM;
184 jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
185#ifdef JSMN_PARENT_LINKS
186 token->parent = parser->toksuper;
195static int jsmn_parse_string(jsmn_parser *parser,
const char *js,
196 const unsigned int len, jsmntok_t *tokens,
197 const unsigned int num_tokens) {
200 int start = parser->pos;
205 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
206 char c = js[parser->pos];
210 if (tokens ==
NULL) {
213 token = jsmn_alloc_token(parser, tokens, num_tokens);
216 return JSMN_ERROR_NOMEM;
218 jsmn_fill_token(token, JSMN_STRING, start + 1, parser->pos);
219#ifdef JSMN_PARENT_LINKS
220 token->parent = parser->toksuper;
226 if (c ==
'\\' && parser->pos + 1 < len) {
229 switch (js[parser->pos]) {
243 for (i = 0; i < 4 && parser->pos < len && js[parser->pos] !=
'\0';
246 if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) ||
247 (js[parser->pos] >= 65 && js[parser->pos] <= 70) ||
248 (js[parser->pos] >= 97 && js[parser->pos] <= 102))) {
250 return JSMN_ERROR_INVAL;
259 return JSMN_ERROR_INVAL;
264 return JSMN_ERROR_PART;
270JSMN_API
int jsmn_parse(jsmn_parser *parser,
const char *js,
const unsigned int len,
271 jsmntok_t *tokens,
const unsigned int num_tokens) {
275 int count = parser->toknext;
277 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
286 if (tokens ==
NULL) {
289 token = jsmn_alloc_token(parser, tokens, num_tokens);
291 return JSMN_ERROR_NOMEM;
293 if (parser->toksuper != -1) {
294 jsmntok_t *t = &tokens[parser->toksuper];
297 if (t->type == JSMN_OBJECT) {
298 return JSMN_ERROR_INVAL;
302#ifdef JSMN_PARENT_LINKS
303 token->parent = parser->toksuper;
306 token->type = (c ==
'{' ? JSMN_OBJECT : JSMN_ARRAY);
307 token->start = parser->pos;
308 parser->toksuper = parser->toknext - 1;
312 if (tokens ==
NULL) {
315 type = (c ==
'}' ? JSMN_OBJECT : JSMN_ARRAY);
316#ifdef JSMN_PARENT_LINKS
317 if (parser->toknext < 1) {
318 return JSMN_ERROR_INVAL;
320 token = &tokens[parser->toknext - 1];
322 if (token->start != -1 && token->end == -1) {
323 if (token->type != type) {
324 return JSMN_ERROR_INVAL;
326 token->end = parser->pos + 1;
327 parser->toksuper = token->parent;
330 if (token->parent == -1) {
331 if (token->type != type || parser->toksuper == -1) {
332 return JSMN_ERROR_INVAL;
336 token = &tokens[token->parent];
339 for (i = parser->toknext - 1; i >= 0; i--) {
341 if (token->start != -1 && token->end == -1) {
342 if (token->type != type) {
343 return JSMN_ERROR_INVAL;
345 parser->toksuper = -1;
346 token->end = parser->pos + 1;
352 return JSMN_ERROR_INVAL;
354 for (; i >= 0; i--) {
356 if (token->start != -1 && token->end == -1) {
357 parser->toksuper = i;
364 r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
369 if (parser->toksuper != -1 && tokens !=
NULL) {
370 tokens[parser->toksuper].size++;
379 parser->toksuper = parser->toknext - 1;
382 if (tokens !=
NULL && parser->toksuper != -1 &&
383 tokens[parser->toksuper].type != JSMN_ARRAY &&
384 tokens[parser->toksuper].type != JSMN_OBJECT) {
385#ifdef JSMN_PARENT_LINKS
386 parser->toksuper = tokens[parser->toksuper].parent;
388 for (i = parser->toknext - 1; i >= 0; i--) {
389 if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
390 if (tokens[i].start != -1 && tokens[i].end == -1) {
391 parser->toksuper = i;
416 if (tokens !=
NULL && parser->toksuper != -1) {
417 const jsmntok_t *t = &tokens[parser->toksuper];
418 if (t->type == JSMN_OBJECT ||
419 (t->type == JSMN_STRING && t->size != 0)) {
420 return JSMN_ERROR_INVAL;
427 r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
432 if (parser->toksuper != -1 && tokens !=
NULL) {
433 tokens[parser->toksuper].size++;
440 return JSMN_ERROR_INVAL;
445 if (tokens !=
NULL) {
446 for (i = parser->toknext - 1; i >= 0; i--) {
448 if (tokens[i].start != -1 && tokens[i].end == -1) {
449 return JSMN_ERROR_PART;
461JSMN_API
void jsmn_init(jsmn_parser *parser) {
464 parser->toksuper = -1;
#define NULL
NULL define (equivalent to 0).
Definition types.h:32