From f367993ad4ff19466efa30e2c4162547e7a3593b Mon Sep 17 00:00:00 2001 From: rexy712 Date: Mon, 29 Jul 2019 14:48:13 -0700 Subject: [PATCH] Finally add key modifier functions. --- include/rjp.h | 5 +++++ src/output.c | 5 ++++- src/rjp.c | 16 ++++++++++++++++ src/strings.c | 7 +++++-- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/include/rjp.h b/include/rjp.h index f034a8a..303197c 100644 --- a/include/rjp.h +++ b/include/rjp.h @@ -121,6 +121,11 @@ RJP_value* rjp_add_member_no_alloc(RJP_value* dest, char* key, size_t keylen, RJ //add an element to a json array RJP_value* rjp_add_element(RJP_value* dest, RJP_value value); +//set existing object member's key +void rjp_set_key(RJP_value* dest, const char* key, size_t keylen); +//set existing object member's key without allocation. key must be allocated using rjp_alloc/rjp_calloc +void rjp_set_key_no_alloc(RJP_value* dest, char* key, size_t keylen); + //set existing value void rjp_set_value(RJP_value* dest, RJP_value value); diff --git a/src/output.c b/src/output.c index e5c2fcd..5101bcd 100644 --- a/src/output.c +++ b/src/output.c @@ -16,6 +16,9 @@ along with this program. If not, see . */ +#define __STDC_FORMAT_MACROS +#include + #include "rjp.h" #include "rjp_internal.h" #include "memory.h" @@ -37,7 +40,7 @@ static size_t _rjp__write_value(char* dest, RJP_value* val){ size_t ret; switch(val->type){ case json_integer: - ret = sprintf(dest, "%lli", val->integer); + ret = sprintf(dest, "%" PRId64, val->integer); break; case json_dfloat: ret = sprintf(dest, "%lf", val->dfloat); diff --git a/src/rjp.c b/src/rjp.c index 50275dc..928c50c 100644 --- a/src/rjp.c +++ b/src/rjp.c @@ -80,6 +80,22 @@ RJP_value* rjp_add_element(RJP_value* dest, RJP_value value){ dest->array.last->value.parent = dest; return &dest->array.last->value; } +void rjp_set_key(RJP_value* dest, const char* key, size_t keylen){ + RJP_object_member* mem = (RJP_object_member*)dest; + if(!keylen) + keylen = strlen(key); + mem->name.value = rjp_alloc(keylen + 1); + strncpy(mem->name.value, key, keylen); + mem->name.value[keylen] = 0; + mem->name.length = keylen; +} +void rjp_set_key_no_alloc(RJP_value* dest, char* key, size_t keylen){ + RJP_object_member* mem = (RJP_object_member*)dest; + if(!keylen) + keylen = strlen(key); + mem->name.value = key; + mem->name.length = keylen; +} void rjp_set_value(RJP_value* dest, RJP_value value){ struct RJP_value* p = dest->parent; *dest = value; diff --git a/src/strings.c b/src/strings.c index 46f7186..053b748 100644 --- a/src/strings.c +++ b/src/strings.c @@ -16,6 +16,9 @@ along with this program. If not, see . */ +#define __STDC_FORMAT_MACROS +#include + #include "strings.h" #include "rjp_internal.h" @@ -301,7 +304,7 @@ size_t _rjp__array_strlen(RJP_value* arr){ for(;element_list;element_list = element_list->next){ switch(element_list->value.type){ case json_integer: - count += snprintf(NULL, 0, "%lli", element_list->value.integer); + count += snprintf(NULL, 0, "%" PRId64, element_list->value.integer); break; case json_dfloat: count += snprintf(NULL, 0, "%lf", element_list->value.dfloat); @@ -350,7 +353,7 @@ size_t _rjp__object_strlen(RJP_value* root){ size_t _rjp__value_strlen(RJP_value* root){ switch(root->type){ case json_integer: - return snprintf(NULL, 0, "%lli", root->integer); + return snprintf(NULL, 0, "%" PRId64, root->integer); case json_dfloat: return snprintf(NULL, 0, "%lf", root->dfloat); case json_boolean: