Skip to content

Commit

Permalink
jsmn: add support for recording source line numbers
Browse files Browse the repository at this point in the history
Signed-off-by: Steve Bennett <steveb@workware.net.au>
  • Loading branch information
msteveb committed Aug 28, 2024
1 parent e1161b9 commit c7bc39c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
20 changes: 14 additions & 6 deletions jsmn/jsmn.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
tok = &tokens[parser->toknext++];
tok->start = tok->end = -1;
tok->size = 0;
tok->line = 0;
#ifdef JSMN_PARENT_LINKS
tok->parent = -1;
#endif
Expand All @@ -28,11 +29,12 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
* Fills token type and boundaries.
*/
static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
int start, int end) {
int start, int end, int line) {
token->type = type;
token->start = start;
token->end = end;
token->size = 0;
token->line = line;
}

/**
Expand All @@ -47,11 +49,13 @@ 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]) {
case '\n' :
parser->line++;
/* fall-thru */
#ifndef JSMN_STRICT
/* In strict mode primitive must be followed by "," or "}" or "]" */
case ':':
#endif
case '\t' : case '\r' : case '\n' : case ' ' :
case '\t' : case '\r' : case ' ' :
case ',' : case ']' : case '}' :
goto found;
}
Expand All @@ -76,7 +80,7 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
parser->pos = start;
return JSMN_ERROR_NOMEM;
}
jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos, parser->line);
#ifdef JSMN_PARENT_LINKS
token->parent = parser->toksuper;
#endif
Expand Down Expand Up @@ -109,7 +113,7 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
parser->pos = start;
return JSMN_ERROR_NOMEM;
}
jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos, parser->line);
#ifdef JSMN_PARENT_LINKS
token->parent = parser->toksuper;
#endif
Expand Down Expand Up @@ -242,7 +246,10 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
if (parser->toksuper != -1 && tokens != NULL)
tokens[parser->toksuper].size++;
break;
case '\t' : case '\r' : case '\n' : case ' ':
case '\n' :
parser->line++;
/* fall-thru */
case '\t' : case '\r' : case ' ':
break;
case ':':
parser->toksuper = parser->toknext - 1;
Expand Down Expand Up @@ -322,5 +329,6 @@ void jsmn_init(jsmn_parser *parser) {
parser->toknext = 0;
parser->toksuper = -1;
parser->count = 0;
parser->line = 1;
}

2 changes: 2 additions & 0 deletions jsmn/jsmn.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ typedef struct {
int start;
int end;
int size;
int line;
#ifdef JSMN_PARENT_LINKS
int parent;
#endif
Expand All @@ -56,6 +57,7 @@ typedef struct {
unsigned int toknext; /* next token to allocate */
unsigned int count; /* number of tokens parsed */
int toksuper; /* superior token node, e.g parent object or array */
int line; /* current line number */
} jsmn_parser;

/**
Expand Down

0 comments on commit c7bc39c

Please sign in to comment.