diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d36c51..5c1e065 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ include(GNUInstallDirs) cmake_minimum_required(VERSION 3.0.2) project(rjp) set(rjp_VERSION_MAJOR 0) -set(rjp_VERSION_MINOR 1) +set(rjp_VERSION_MINOR 2) set(INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include) configure_file( "${INCLUDE_PATH}/config.h.in" diff --git a/src/output.c b/src/output.c index eb29b4c..9be6fb1 100644 --- a/src/output.c +++ b/src/output.c @@ -50,38 +50,48 @@ struct JSON_value rjp_array(void){ } +static size_t _rjp__write_value(char* dest, struct JSON_value* val){ + size_t ret; + switch(val->type){ + case json_integer: + ret = sprintf(dest, "%li", val->integer); + break; + case json_dfloat: + ret = sprintf(dest, "%lf", val->dfloat); + break; + case json_boolean: + ret = sprintf(dest, val->boolean ? "true" : "false"); + break; + case json_null: + ret = sprintf(dest, "null"); + break; + case json_string:; + ret = sprintf(dest, "\"%s\"", val->string.value); + break; + case json_array: + ret = sprintf(dest, "["); + ret += rjp_dump_array(val, dest+ret); + ret += sprintf(dest+ret, "]"); + break; + case json_object: + ret = sprintf(dest, "{"); + ret += rjp_dump_object(val, dest+ret); + ret += sprintf(dest+ret, "}"); + break; + default: + ret = 0; + break; + }; + return ret; +} + size_t rjp_dump_array(struct JSON_value* arr, char* dest){ struct JSON_array* array = &arr->array; struct JSON_array_element* element_list = array->elements; size_t pos = 0; for(;element_list;element_list = element_list->next){ - switch(element_list->value.type){ - case json_integer: - pos += sprintf(dest+pos, "%li", element_list->value.integer); - break; - case json_dfloat: - pos += sprintf(dest+pos, "%lf", element_list->value.dfloat); - break; - case json_boolean: - pos += sprintf(dest+pos, element_list->value.boolean ? "true" : "false"); - break; - case json_null: - pos +=sprintf(dest+pos, "null"); - break; - case json_string: - pos += sprintf(dest+pos, "\"%s\"", element_list->value.string.value); - break; - case json_array: - pos += sprintf(dest+pos, "["); - pos += rjp_dump_array(&element_list->value, dest+pos); - pos += sprintf(dest+pos, "]"); - break; - case json_object: - pos += sprintf(dest+pos, "{"); - pos += rjp_dump_object(&element_list->value, dest+pos); - pos += sprintf(dest+pos, "}"); - break; - }; + pos += _rjp__write_value(dest+pos, &element_list->value); + if(element_list->next) pos += sprintf(dest+pos, ","); else @@ -96,33 +106,8 @@ size_t rjp_dump_object(struct JSON_value* root, char* dest){ size_t pos = 0; for(;member_list;member_list = member_list->next){ pos += sprintf(dest+pos, "\"%s\":", member_list->name.value); - switch(member_list->value.type){ - case json_integer: - pos += sprintf(dest+pos, "%li", member_list->value.integer); - break; - case json_dfloat: - pos += sprintf(dest+pos, "%lf", member_list->value.dfloat); - break; - case json_boolean: - pos += sprintf(dest+pos, member_list->value.boolean ? "true" : "false"); - break; - case json_null: - pos += sprintf(dest+pos, "null"); - break; - case json_string:; - pos += sprintf(dest+pos, "\"%s\"", member_list->value.string.value); - break; - case json_array: - pos += sprintf(dest+pos, "["); - pos += rjp_dump_array(&member_list->value, dest+pos); - pos += sprintf(dest+pos, "]"); - break; - case json_object: - pos += sprintf(dest+pos, "{"); - pos += rjp_dump_object(&member_list->value, dest+pos); - pos += sprintf(dest+pos, "}"); - break; - }; + pos += _rjp__write_value(dest+pos, &member_list->value); + if(member_list->next) pos += sprintf(dest+pos, ","); else