From 95b5b2cb83d718d171850a2eca64ad1cb5178e8a Mon Sep 17 00:00:00 2001 From: rexy712 Date: Mon, 6 Apr 2020 16:55:44 -0700 Subject: [PATCH] Remove some uses of sprintf to improve speed a tiny bit --- include/rjp_string.h | 2 ++ src/output.c | 24 ++++++++++++++++++------ src/rjp_string.c | 11 +++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/include/rjp_string.h b/include/rjp_string.h index 229891b..faae5e9 100644 --- a/include/rjp_string.h +++ b/include/rjp_string.h @@ -22,6 +22,8 @@ #include "rjp.h" int irjp_is_whitespace(char c); +int irjp_copy_string_quoted(char* restrict dest, const char* restrict string, RJP_index length); +int irjp_copy_string_keyed(char* restrict dest, const char* restrict string, RJP_index length); char* irjp_convert_string(const char* str, RJP_index length, RJP_index* newlen); RJP_index irjp_array_strlen(const RJP_value* arr, const int flags, int depth); RJP_index irjp_object_strlen(const RJP_value* root, const int flags, int depth); diff --git a/src/output.c b/src/output.c index c43399e..a115f20 100644 --- a/src/output.c +++ b/src/output.c @@ -162,13 +162,20 @@ static RJP_index irjp_write_value(char* dest, const RJP_value* val, const int fl ret = sprintf(dest, "%lf", val->dfloat); break; case rjp_json_boolean: - ret = sprintf(dest, val->boolean ? "true" : "false"); + if(val->boolean){ + memcpy(dest, "true", 4); + ret = 4; + }else{ + memcpy(dest, "false", 5); + ret = 5; + } break; case rjp_json_null: - ret = sprintf(dest, "null"); + memcpy(dest, "null", 4); + ret = 4; break; case rjp_json_string:; - ret = sprintf(dest, "\"%s\"", val->string.value); + ret = irjp_copy_string_quoted(dest, val->string.value, val->string.length); break; case rjp_json_array: ret = irjp_dump_array(val, dest, flags, depth); @@ -191,8 +198,10 @@ RJP_index irjp_dump_array(const RJP_value* arr, char* dest, const int flags, int RJP_value* current = rjp_array_iterator_current(&it); if(!current){ - pos += sprintf(dest, "[]"); rjp_delete_array_iterator(&it); + dest[pos++] = '['; + dest[pos++] = ']'; + dest[pos] = 0; return pos; } dest[pos++] = '['; @@ -230,8 +239,10 @@ RJP_index irjp_dump_object(const RJP_value* root, char* dest, const int flags, i RJP_index pos = 0; RJP_value* current = rjp_object_iterator_current(&it); if(!current){ - pos += sprintf(dest, "{}"); rjp_delete_object_iterator(&it); + dest[pos++] = '{'; + dest[pos++] = '}'; + dest[pos] = 0; return pos; } dest[pos++] = '{'; @@ -239,10 +250,11 @@ RJP_index irjp_dump_object(const RJP_value* root, char* dest, const int flags, i dest[pos++] = '\n'; for(;current;current = rjp_object_iterator_next(&it)){ + const RJP_string* key = rjp_member_key(current); if(flags & RJP_FORMAT_TABBED_LINES) for(int i = 0;i < (depth+1);++i) dest[pos++] = '\t'; - pos += sprintf(dest+pos, "\"%s\":", rjp_member_key(current)->value); + pos += irjp_copy_string_keyed(dest+pos, key->value, key->length); if(flags & RJP_FORMAT_KEY_SPACES) dest[pos++] = ' '; pos += irjp_write_value(dest+pos, current, flags, depth+1); diff --git a/src/rjp_string.c b/src/rjp_string.c index b88077d..d642946 100644 --- a/src/rjp_string.c +++ b/src/rjp_string.c @@ -152,6 +152,17 @@ static int codepoint_to_u8(char* dest, uint32_t codepoint){ } }*/ +int irjp_copy_string_quoted(char* restrict dest, const char* restrict string, RJP_index length){ + dest[0] = '"'; + memcpy(dest+1, string, length); + dest[length+1] = '"'; + return length+2; +} +int irjp_copy_string_keyed(char* restrict dest, const char* restrict string, RJP_index length){ + int offset = irjp_copy_string_quoted(dest, string, length); + dest[offset] = ':'; + return offset+1; +} char* irjp_convert_string(const char* str, RJP_index length, RJP_index* newlen){ char* newstring; RJP_index oldpos = 1; //ignore opening quote