Fixed a potential segfault and added diagnostics option to cmake

This commit is contained in:
rexy712 2018-11-30 14:12:39 -08:00
parent 036c732ee8
commit 566952de5e
4 changed files with 23 additions and 3 deletions

View File

@ -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}

View File

@ -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){

View File

@ -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;

View File

@ -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)