Simplify and refactor JSMN

- Always enable strict mode
    - Always calculate parent links and skip counts
This commit is contained in:
Aaron Culliney 2016-03-22 21:51:45 -07:00
parent fdfe312a2b
commit 2da23f717a
2 changed files with 0 additions and 67 deletions

61
externals/jsmn/jsmn.c vendored
View File

@ -12,10 +12,8 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
tok = &tokens[parser->toknext++];
tok->start = tok->end = -1;
tok->size = 0;
#ifdef JSMN_PARENT_LINKS
tok->skip = 1;
tok->parent = -1;
#endif
return tok;
}
@ -42,10 +40,6 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
switch (js[parser->pos]) {
#ifndef JSMN_STRICT
/* In strict mode primitive must be followed by "," or "}" or "]" */
case ':':
#endif
case '\t' : case '\r' : case '\n' : case ' ' :
case ',' : case ']' : case '}' :
goto found;
@ -55,11 +49,9 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
return JSMN_ERROR_INVAL;
}
}
#ifdef JSMN_STRICT
/* In strict mode primitive must be followed by a comma/object/array */
parser->pos = start;
return JSMN_ERROR_PART;
#endif
found:
if (tokens == NULL) {
@ -72,9 +64,7 @@ found:
return JSMN_ERROR_NOMEM;
}
jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
#ifdef JSMN_PARENT_LINKS
token->parent = parser->toksuper;
#endif
parser->pos--;
return 0;
}
@ -105,9 +95,7 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
return JSMN_ERROR_NOMEM;
}
jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
#ifdef JSMN_PARENT_LINKS
token->parent = parser->toksuper;
#endif
return 0;
}
@ -146,7 +134,6 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
return JSMN_ERROR_PART;
}
#ifdef JSMN_PARENT_LINKS
static void jsmn_percolate_skip_counts(jsmntok_t *tokens, int parent) {
jsmntok_t *token;
@ -160,7 +147,6 @@ static void jsmn_percolate_skip_counts(jsmntok_t *tokens, int parent) {
token->skip++;
}
}
#endif
/**
* Parse JSON string and fill tokens.
@ -188,10 +174,8 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
return JSMN_ERROR_NOMEM;
if (parser->toksuper != -1) {
tokens[parser->toksuper].size++;
#ifdef JSMN_PARENT_LINKS
token->parent = parser->toksuper;
jsmn_percolate_skip_counts(tokens, parser->toksuper);
#endif
}
token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
token->start = parser->pos;
@ -201,7 +185,6 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
if (tokens == NULL)
break;
type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
#ifdef JSMN_PARENT_LINKS
if (parser->toknext < 1) {
return JSMN_ERROR_INVAL;
}
@ -220,28 +203,6 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
}
token = &tokens[token->parent];
}
#else
for (i = parser->toknext - 1; i >= 0; i--) {
token = &tokens[i];
if (token->start != -1 && token->end == -1) {
if (token->type != type) {
return JSMN_ERROR_INVAL;
}
parser->toksuper = -1;
token->end = parser->pos + 1;
break;
}
}
/* Error if unmatched closing bracket */
if (i == -1) return JSMN_ERROR_INVAL;
for (; i >= 0; i--) {
token = &tokens[i];
if (token->start != -1 && token->end == -1) {
parser->toksuper = i;
break;
}
}
#endif
break;
case '\"':
r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
@ -249,9 +210,7 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
count++;
if (parser->toksuper != -1 && tokens != NULL) {
tokens[parser->toksuper].size++;
#ifdef JSMN_PARENT_LINKS
jsmn_percolate_skip_counts(tokens, parser->toksuper);
#endif
}
break;
case '\t' : case '\r' : case '\n' : case ' ':
@ -263,21 +222,9 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
if (tokens != NULL && parser->toksuper != -1 &&
tokens[parser->toksuper].type != JSMN_ARRAY &&
tokens[parser->toksuper].type != JSMN_OBJECT) {
#ifdef JSMN_PARENT_LINKS
parser->toksuper = tokens[parser->toksuper].parent;
#else
for (i = parser->toknext - 1; i >= 0; i--) {
if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
if (tokens[i].start != -1 && tokens[i].end == -1) {
parser->toksuper = i;
break;
}
}
}
#endif
}
break;
#ifdef JSMN_STRICT
/* In strict mode primitives are: numbers and booleans */
case '-': case '0': case '1' : case '2': case '3' : case '4':
case '5': case '6': case '7' : case '8': case '9':
@ -290,26 +237,18 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
return JSMN_ERROR_INVAL;
}
}
#else
/* In non-strict mode every unquoted value is a primitive */
default:
#endif
r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
if (r < 0) return r;
count++;
if (parser->toksuper != -1 && tokens != NULL) {
tokens[parser->toksuper].size++;
#ifdef JSMN_PARENT_LINKS
jsmn_percolate_skip_counts(tokens, parser->toksuper);
#endif
}
break;
#ifdef JSMN_STRICT
/* Unexpected char in strict mode */
default:
return JSMN_ERROR_INVAL;
#endif
}
}

View File

@ -3,10 +3,6 @@
#include <stddef.h>
// APPLE2IX : define these ...
#define JSMN_PARENT_LINKS 1
#define JSMN_STRICT 1
#ifdef __cplusplus
extern "C" {
#endif
@ -46,10 +42,8 @@ typedef struct {
int start;
int end;
int size;
#ifdef JSMN_PARENT_LINKS
int skip;
int parent;
#endif
} jsmntok_t;
/**