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}")
|
||||
|
||||
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)
|
||||
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
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
|
||||
@ -31,6 +31,12 @@
|
||||
#define MAYBE_UNUSED
|
||||
#endif
|
||||
|
||||
#ifdef RJP_DIAGNOSTICS
|
||||
#define DIAG_PRINT(...) fprintf(__VA_ARGS__)
|
||||
#else
|
||||
#define DIAG_PRINT(...)
|
||||
#endif
|
||||
|
||||
struct JSON_state{
|
||||
int in_array;
|
||||
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)\
|
||||
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
|
||||
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){
|
||||
if(!root)
|
||||
return NULL;
|
||||
size_t len = _rjp__object_strlen(root);
|
||||
if(!len)
|
||||
return NULL;
|
||||
char* tmp = malloc(len + 1);
|
||||
tmp[len] = 0;
|
||||
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_member* member_list = root_obj->members;
|
||||
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; //"":
|
||||
switch(member_list->value.type){
|
||||
case json_integer:
|
||||
@ -182,8 +184,11 @@ size_t _rjp__object_strlen(struct JSON_value* root){
|
||||
case json_array:
|
||||
count += _rjp__array_strlen(&member_list->value);
|
||||
break;
|
||||
case json_object:
|
||||
count += _rjp__object_strlen(&member_list->value);
|
||||
case json_object:;
|
||||
size_t new_count = _rjp__object_strlen(&member_list->value);
|
||||
if(!new_count)
|
||||
return 0;
|
||||
count += new_count;
|
||||
break;
|
||||
};
|
||||
if(member_list->next)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user