77#include <stdlib.h>
88#include <string.h>
99
10+ /**
11+ * @brief Determines whether a character `ch` is whitespace
12+ */
13+ #define is_whitespace (ch ) (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')
14+
1015#ifdef JSON_SKIP_WHITESPACE
11- #define json_skip_whitespace (arg ) json_skip_whitespace_actual(arg)
16+ void json_skip_whitespace (typed (json_string ) * str_ptr ) {
17+ while (is_whitespace (* * str_ptr ))
18+ (* str_ptr )++ ;
19+ }
1220#else
1321#define json_skip_whitespace (arg )
1422#endif
1523
1624#ifdef JSON_DEBUG
1725#define log (str , ...) printf(str "\n", ##__VA_ARGS__)
26+ void json_debug_print (typed (json_string ) str , typed (size ) len ) {
27+ for (size_t i = 0 ; i < len ; i ++ ) {
28+ if (str [i ] == '\0' )
29+ break ;
30+
31+ putchar (str [i ]);
32+ }
33+ printf ("\n" );
34+ }
1835#else
1936#define log (str , ...)
2037#endif
7188 */
7289#define reallocN (ptr , type , count ) (type *)realloc(ptr, (count) * sizeof(type))
7390
74- /**
75- * @brief Determines whether a character `ch` is whitespace
76- */
77- #define is_whitespace (ch ) (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')
78-
7991/**
8092 * @brief Parses a JSON element {json_element_t} and moves the string
8193 * pointer to the end of the parsed element
@@ -217,7 +229,7 @@ static bool json_skip_boolean(typed(json_string) *);
217229/**
218230 * @brief Moves a JSON string pointer beyond any whitespace
219231 */
220- static void json_skip_whitespace_actual (typed (json_string ) * );
232+ // static void json_skip_whitespace_actual(typed(json_string) *);
221233
222234/**
223235 * @brief Moves a JSON string pointer beyond `null` literal
@@ -281,11 +293,6 @@ static result(json_string)
281293 */
282294static typed (size ) json_string_len (typed (json_string ));
283295
284- /**
285- * @brief Debug print some characters from a string
286- */
287- static void json_debug_print (typed (json_string ) str , typed (size ) len );
288-
289296result (json_element ) json_parse (typed (json_string ) json_str ) {
290297 if (json_str == NULL ) {
291298 return result_err (json_element )(JSON_ERROR_EMPTY );
@@ -423,7 +430,10 @@ result(json_element_value) json_parse_string(typed(json_string) * str_ptr) {
423430 // Skip to beyond the string
424431 (* str_ptr ) += len + 1 ;
425432
426- return result_ok (json_element_value )((typed (json_element_value ))output );
433+ typed (json_element_value ) retval = {0 };
434+ retval .as_string = output ;
435+
436+ return result_ok (json_element_value )(retval );
427437}
428438
429439result (json_element_value ) json_parse_number (typed (json_string ) * str_ptr ) {
@@ -438,28 +448,35 @@ result(json_element_value) json_parse_number(typed(json_string) * str_ptr) {
438448 temp_str ++ ;
439449 }
440450
441- typed (json_number ) number = {};
451+ typed (json_number ) number = {0 };
452+ typed (json_number_value ) val = {0 };
442453
443454 if (has_decimal ) {
444455 errno = 0 ;
445456
457+ val .as_double = strtod (* str_ptr , (char * * )str_ptr );
458+
446459 number .type = JSON_NUMBER_TYPE_DOUBLE ;
447- number .value = ( typed ( json_number_value )) strtod ( * str_ptr , ( char * * ) str_ptr ) ;
460+ number .value = val ;
448461
449462 if (errno == EINVAL || errno == ERANGE )
450463 return result_err (json_element_value )(JSON_ERROR_INVALID_VALUE );
451464 } else {
452465 errno = 0 ;
453466
467+ val .as_long = strtol (* str_ptr , (char * * )str_ptr , 10 );
468+
454469 number .type = JSON_NUMBER_TYPE_LONG ;
455- number .value =
456- (typed (json_number_value ))strtol (* str_ptr , (char * * )str_ptr , 10 );
470+ number .value = val ;
457471
458472 if (errno == EINVAL || errno == ERANGE )
459473 return result_err (json_element_value )(JSON_ERROR_INVALID_VALUE );
460474 }
461475
462- return result_ok (json_element_value )((typed (json_element_value ))number );
476+ typed (json_element_value ) retval = {0 };
477+ retval .as_number = number ;
478+
479+ return result_ok (json_element_value )(retval );
463480}
464481
465482result (json_element_value ) json_parse_object (typed (json_string ) * str_ptr ) {
@@ -552,7 +569,10 @@ result(json_element_value) json_parse_object(typed(json_string) * str_ptr) {
552569 object -> count = count ;
553570 object -> entries = entries ;
554571
555- return result_ok (json_element_value )((typed (json_element_value ))object );
572+ typed (json_element_value ) retval = {0 };
573+ retval .as_object = object ;
574+
575+ return result_ok (json_element_value )(retval );
556576}
557577
558578typed (uint64 ) json_key_hash (typed (json_string ) str ) {
@@ -623,7 +643,10 @@ result(json_element_value) json_parse_array(typed(json_string) * str_ptr) {
623643 array -> count = count ;
624644 array -> elements = elements ;
625645
626- return result_ok (json_element_value )((typed (json_element_value ))array );
646+ typed (json_element_value ) retval = {0 };
647+ retval .as_array = array ;
648+
649+ return result_ok (json_element_value )(retval );
627650}
628651
629652result (json_element_value ) json_parse_boolean (typed (json_string ) * str_ptr ) {
@@ -640,8 +663,11 @@ result(json_element_value) json_parse_boolean(typed(json_string) * str_ptr) {
640663 (* str_ptr ) += 5 ;
641664 break ;
642665 }
666+
667+ typed (json_element_value ) retval = {0 };
668+ retval .as_boolean = output ;
643669
644- return result_ok (json_element_value )(( typed ( json_element_value )) output );
670+ return result_ok (json_element_value )(retval );
645671}
646672
647673result (json_element )
@@ -817,11 +843,6 @@ bool json_skip_boolean(typed(json_string) * str_ptr) {
817843 return false;
818844}
819845
820- void json_skip_whitespace_actual (typed (json_string ) * str_ptr ) {
821- while (is_whitespace (* * str_ptr ))
822- (* str_ptr )++ ;
823- }
824-
825846void json_skip_null (typed (json_string ) * str_ptr ) { (* str_ptr ) += 4 ; }
826847
827848void json_print (typed (json_element ) * element , int indent ) {
@@ -1074,19 +1095,10 @@ result(json_string)
10741095 return result_ok (json_string )((typed (json_string ))output );
10751096}
10761097
1077- void json_debug_print (typed (json_string ) str , typed (size ) len ) {
1078- for (size_t i = 0 ; i < len ; i ++ ) {
1079- if (str [i ] == '\0' )
1080- break ;
1081-
1082- putchar (str [i ]);
1083- }
1084- printf ("\n" );
1085- }
1098+ define_result_type (json_element_type )
1099+ define_result_type (json_element_value )
1100+ define_result_type (json_element )
1101+ define_result_type (json_entry )
1102+ define_result_type (json_string )
1103+ define_result_type (size )
10861104
1087- define_result_type (json_element_type );
1088- define_result_type (json_element_value );
1089- define_result_type (json_element );
1090- define_result_type (json_entry );
1091- define_result_type (json_string );
1092- define_result_type (size );
0 commit comments