@@ -34,6 +34,13 @@ extern "C" {
3434#define JSON_DEFAULT_MAX_STRING 256
3535#endif
3636
37+ // ASCII optimization for whitespace skipping
38+ #ifdef JSON_USE_SIMPLE_WHITESPACE_SKIPPING
39+ #define IS_WHITESPACE (c ) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r')
40+ #else
41+ #define IS_WHITESPACE (c ) isspace(c)
42+ #endif
43+
3744typedef enum
3845{
3946 JSON_ERROR_NONE = 0 ,
@@ -46,7 +53,8 @@ typedef enum
4653 JSON_ERROR_NESTING_DEPTH ,
4754 JSON_ERROR_INVALID_NUMBER ,
4855 JSON_ERROR_TRAILING_CHARS ,
49- JSON_ERROR_ALLOCATION_FAILED
56+ JSON_ERROR_ALLOCATION_FAILED ,
57+ JSON_ERROR_EMPTY_INPUT
5058} json_error_t ;
5159
5260typedef enum
@@ -205,7 +213,7 @@ const json_token_t *json_get_tokens(const json_parser_t *parser, size_t *count)
205213
206214static void json_skip_whitespace (json_parser_t * parser )
207215{
208- while (parser -> pos < parser -> length && isspace (parser -> json [parser -> pos ]))
216+ while (parser -> pos < parser -> length && IS_WHITESPACE (parser -> json [parser -> pos ]))
209217 {
210218 parser -> pos ++ ;
211219 }
@@ -592,13 +600,17 @@ static int json_parse_literal(json_parser_t *parser, const char *literal, json_t
592600 return -1 ;
593601 }
594602
603+ size_t literal_start_pos = parser -> pos ;
595604 parser -> pos += len ;
596605
597606 if (json_add_token (parser , type ))
598607 {
599608 return -1 ;
600609 }
601610
611+ json_token_t * token = & parser -> tokens [parser -> token_count - 1 ];
612+ token -> start = literal_start_pos ;
613+ token -> end = parser -> pos ;
602614 return 0 ;
603615}
604616
@@ -674,7 +686,7 @@ static int json_parse_object(json_parser_t *parser)
674686 if (parser -> json [parser -> pos ] == '}' )
675687 {
676688 parser -> pos ++ ;
677- obj_token -> end = parser -> pos ; // Set end after closing '}'
689+ obj_token -> end = parser -> pos ;
678690 parser -> depth -- ;
679691 return 0 ;
680692 }
@@ -715,6 +727,8 @@ static int json_parse_object(json_parser_t *parser)
715727 return -1 ;
716728 }
717729
730+ json_skip_whitespace (parser );
731+
718732 if (json_parse_value (parser ))
719733 {
720734 return -1 ;
@@ -763,7 +777,7 @@ static int json_parse_array(json_parser_t *parser)
763777 if (parser -> json [parser -> pos ] == ']' )
764778 {
765779 parser -> pos ++ ;
766- arr_token -> end = parser -> pos ; // End after ']'
780+ arr_token -> end = parser -> pos ;
767781 parser -> depth -- ;
768782 return 0 ;
769783 }
@@ -777,35 +791,30 @@ static int json_parse_array(json_parser_t *parser)
777791 break ;
778792 }
779793
780- // Check for closing bracket before parsing next element
781794 if (parser -> json [parser -> pos ] == ']' )
782795 {
783796 parser -> pos ++ ;
784- arr_token -> end = parser -> pos ; // Set end after ']'
797+ arr_token -> end = parser -> pos ;
785798 parser -> depth -- ;
786799 return 0 ;
787800 }
788801
789- // Parse the array element
790802 if (json_parse_value (parser ))
791803 {
792804 return -1 ;
793805 }
794806
795807 json_skip_whitespace (parser );
796808
797- // Check for comma or closing bracket after the element
798809 if (parser -> json [parser -> pos ] == ']' )
799810 {
800- // Handle closing bracket in the next iteration
801811 continue ;
802812 }
803813 else if (parser -> json [parser -> pos ] == ',' )
804814 {
805- parser -> pos ++ ; // Consume the comma
815+ parser -> pos ++ ;
806816 json_skip_whitespace (parser );
807817
808- // Trailing comma check: if next character is ']', it's invalid
809818 if (parser -> json [parser -> pos ] == ']' )
810819 {
811820 json_set_error (parser , JSON_ERROR_UNEXPECTED_CHAR );
@@ -814,7 +823,6 @@ static int json_parse_array(json_parser_t *parser)
814823 }
815824 else
816825 {
817- // Neither comma nor closing bracket
818826 json_set_error (parser , JSON_ERROR_UNEXPECTED_CHAR );
819827 return -1 ;
820828 }
@@ -831,7 +839,15 @@ json_error_t json_parser_parse(json_parser_t *parser)
831839
832840 if (parser -> pos >= parser -> length )
833841 {
834- json_set_error (parser , JSON_ERROR_INVALID_TOKEN );
842+ if (parser -> length == 0 || parser -> pos == parser -> length )
843+ {
844+ json_set_error (parser , JSON_ERROR_EMPTY_INPUT );
845+ }
846+ else
847+ {
848+ json_set_error (parser , JSON_ERROR_INVALID_TOKEN );
849+ }
850+
835851 return parser -> error ;
836852 }
837853
0 commit comments