Fixed a potential segfault and added diagnostics option to cmake
This commit is contained in:
parent
036c732ee8
commit
566952de5e
@ -12,8 +12,13 @@ configure_file(
|
|||||||
)
|
)
|
||||||
include_directories("${INCLUDE_PATH}")
|
include_directories("${INCLUDE_PATH}")
|
||||||
|
|
||||||
|
option(ENABLE_DIAGNOSTICS "Print diagnostic messages when parsing json to help identify issues" ON)
|
||||||
|
|
||||||
add_library (rjp STATIC src/input.c src/output.c src/strings.c)
|
add_library (rjp STATIC src/input.c src/output.c src/strings.c)
|
||||||
set_target_properties(rjp PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.h)
|
set_target_properties(rjp PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.h)
|
||||||
|
if(ENABLE_DIAGNOSTICS)
|
||||||
|
target_compile_definitions(rjp PRIVATE RJP_DIAGNOSTICS)
|
||||||
|
endif()
|
||||||
|
|
||||||
install(TARGETS rjp
|
install(TARGETS rjp
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
|||||||
@ -31,6 +31,12 @@
|
|||||||
#define MAYBE_UNUSED
|
#define MAYBE_UNUSED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RJP_DIAGNOSTICS
|
||||||
|
#define DIAG_PRINT(...) fprintf(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define DIAG_PRINT(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
struct JSON_state{
|
struct JSON_state{
|
||||||
int in_array;
|
int in_array;
|
||||||
int search_target;
|
int search_target;
|
||||||
@ -205,7 +211,7 @@ MAYBE_UNUSED static int _rjp__is_array_empty(struct JSON_value* curr){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define syntax_error(msg, row, column)\
|
#define syntax_error(msg, row, column)\
|
||||||
do{fprintf(stderr, "Syntax error! %s (%i:%i)\n", msg, row, column);rjp_free(root);return NULL;}while(0)
|
do{DIAG_PRINT(stderr, "Syntax error! %s (%i:%i)\n", msg, row, column);rjp_free(root);return NULL;}while(0)
|
||||||
|
|
||||||
#define MAX_DEPTH 16
|
#define MAX_DEPTH 16
|
||||||
struct JSON_value* rjp_parse(const char* str){
|
struct JSON_value* rjp_parse(const char* str){
|
||||||
|
|||||||
@ -117,7 +117,11 @@ size_t rjp_dump_object(struct JSON_value* root, char* dest){
|
|||||||
}
|
}
|
||||||
|
|
||||||
char* rjp_to_json(struct JSON_value* root){
|
char* rjp_to_json(struct JSON_value* root){
|
||||||
|
if(!root)
|
||||||
|
return NULL;
|
||||||
size_t len = _rjp__object_strlen(root);
|
size_t len = _rjp__object_strlen(root);
|
||||||
|
if(!len)
|
||||||
|
return NULL;
|
||||||
char* tmp = malloc(len + 1);
|
char* tmp = malloc(len + 1);
|
||||||
tmp[len] = 0;
|
tmp[len] = 0;
|
||||||
size_t pos = 1;
|
size_t pos = 1;
|
||||||
|
|||||||
@ -162,6 +162,8 @@ size_t _rjp__object_strlen(struct JSON_value* root){
|
|||||||
struct JSON_object* root_obj = &root->object;
|
struct JSON_object* root_obj = &root->object;
|
||||||
struct JSON_object_member* member_list = root_obj->members;
|
struct JSON_object_member* member_list = root_obj->members;
|
||||||
for(;member_list;member_list = member_list->next){
|
for(;member_list;member_list = member_list->next){
|
||||||
|
if(member_list->name.length == 0 || member_list->name.value[0] == 0)
|
||||||
|
return 0;
|
||||||
count += member_list->name.length + 3; //"":
|
count += member_list->name.length + 3; //"":
|
||||||
switch(member_list->value.type){
|
switch(member_list->value.type){
|
||||||
case json_integer:
|
case json_integer:
|
||||||
@ -182,8 +184,11 @@ size_t _rjp__object_strlen(struct JSON_value* root){
|
|||||||
case json_array:
|
case json_array:
|
||||||
count += _rjp__array_strlen(&member_list->value);
|
count += _rjp__array_strlen(&member_list->value);
|
||||||
break;
|
break;
|
||||||
case json_object:
|
case json_object:;
|
||||||
count += _rjp__object_strlen(&member_list->value);
|
size_t new_count = _rjp__object_strlen(&member_list->value);
|
||||||
|
if(!new_count)
|
||||||
|
return 0;
|
||||||
|
count += new_count;
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
if(member_list->next)
|
if(member_list->next)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user