mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-06-01 13:41:28 +00:00
Simplify and refactor JSMN
- Always enable strict mode - Always calculate parent links and skip counts
This commit is contained in:
parent
fdfe312a2b
commit
2da23f717a
61
externals/jsmn/jsmn.c
vendored
61
externals/jsmn/jsmn.c
vendored
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
6
externals/jsmn/jsmn.h
vendored
6
externals/jsmn/jsmn.h
vendored
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue
Block a user