Skip to content

Commit 242c0aa

Browse files
committed
Explicitly set start/end for objects/arrays using JSON string positions
1 parent 0d62e60 commit 242c0aa

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

json_parser.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ static int json_add_token(json_parser_t *parser, json_token_type_t type)
231231
json_token_t *token = &parser->tokens[parser->token_count++];
232232
memset(token, 0, sizeof(*token));
233233
token->type = type;
234+
token->start = parser->pos;
235+
token->end = parser->pos;
234236
return 0;
235237
}
236238

@@ -655,19 +657,24 @@ static int json_parse_object(json_parser_t *parser)
655657
return -1;
656658
}
657659

660+
size_t start_pos = parser->pos;
658661
parser->depth++;
659662

660663
if(json_add_token(parser, JSON_TOKEN_OBJECT) < 0)
661664
{
662665
return -1;
663666
}
664667

668+
json_token_t *obj_token = &parser->tokens[parser->token_count - 1];
669+
obj_token->start = start_pos;
670+
obj_token->end = 0;
665671
parser->pos++; // Skip '{'
666672
json_skip_whitespace(parser);
667673

668674
if(parser->json[parser->pos] == '}')
669675
{
670676
parser->pos++;
677+
obj_token->end = parser->pos; // Set end after closing '}'
671678
parser->depth--;
672679
return 0;
673680
}
@@ -684,6 +691,7 @@ static int json_parse_object(json_parser_t *parser)
684691
if(parser->json[parser->pos] == '}')
685692
{
686693
parser->pos++;
694+
obj_token->end = parser->pos;
687695
parser->depth--;
688696
return 0;
689697
}
@@ -738,19 +746,24 @@ static int json_parse_array(json_parser_t *parser)
738746
return -1;
739747
}
740748

749+
size_t start_pos = parser->pos; // Position of '['
741750
parser->depth++;
742751

743752
if(json_add_token(parser, JSON_TOKEN_ARRAY) < 0)
744753
{
745754
return -1;
746755
}
747756

757+
json_token_t *arr_token = &parser->tokens[parser->token_count - 1];
758+
arr_token->start = start_pos; // Start at '['
759+
arr_token->end = 0;
748760
parser->pos++; // Skip '['
749761
json_skip_whitespace(parser);
750762

751763
if(parser->json[parser->pos] == ']')
752764
{
753765
parser->pos++;
766+
arr_token->end = parser->pos; // End after ']'
754767
parser->depth--;
755768
return 0;
756769
}
@@ -768,6 +781,7 @@ static int json_parse_array(json_parser_t *parser)
768781
if(parser->json[parser->pos] == ']')
769782
{
770783
parser->pos++;
784+
arr_token->end = parser->pos; // Set end after ']'
771785
parser->depth--;
772786
return 0;
773787
}

0 commit comments

Comments
 (0)