diff --git a/include/rjp.h b/include/rjp.h index 61707c1..0b9e9a0 100644 --- a/include/rjp.h +++ b/include/rjp.h @@ -99,10 +99,14 @@ void* rjp_calloc(size_t num, size_t nbytes); void rjp_free(void* dest); //add a member to a json object -RJP_value* rjp_add_member(RJP_value* dest, int alloc_key, char* key, size_t keylen, RJP_value value); +RJP_value* rjp_add_member(RJP_value* dest, const char* key, size_t keylen, RJP_value value); +RJP_value* rjp_add_member_no_alloc(RJP_value* dest, char* key, size_t keylen, RJP_value value); //add an element to a json array RJP_value* rjp_add_element(RJP_value* dest, RJP_value value); +//set existing value +void rjp_set_value(RJP_value* dest, RJP_value value); + //initialize a RJP_value to the requested type and value RJP_value rjp_integer(long i); RJP_value rjp_boolean(char b); diff --git a/include/rjp_internal.h b/include/rjp_internal.h index 7fc4ff8..a358cdf 100644 --- a/include/rjp_internal.h +++ b/include/rjp_internal.h @@ -23,7 +23,7 @@ char* _rjp__parse_string(RJP_value* root, const char* str, int* len, int* row, int* column); size_t _rjp__object_strlen(RJP_value* root); -void _rjp__add_member(RJP_object* j, char* str, size_t len); +void _rjp__add_member(RJP_object* j, const char* str, size_t len); void _rjp__add_member_no_alloc(RJP_object* j, char* str, size_t len); void _rjp__add_element(RJP_array* j); size_t _rjp__object_strlen(RJP_value* root); diff --git a/src/input.c b/src/input.c index 1ccda5e..dbe1299 100644 --- a/src/input.c +++ b/src/input.c @@ -61,7 +61,7 @@ void _rjp__add_element(RJP_array* j){ } } //create member of the object as a linked list member and assign a name with name allocation -void _rjp__add_member(RJP_object* j, char* str, size_t len){ +void _rjp__add_member(RJP_object* j, const char* str, size_t len){ ++j->num_members; if(!j->members){ j->members = rjp_calloc(1, sizeof(RJP_object_member)); diff --git a/src/output.c b/src/output.c index c7050b4..584ef11 100644 --- a/src/output.c +++ b/src/output.c @@ -36,13 +36,18 @@ void* rjp_calloc(size_t num, size_t nbytes){ void rjp_free(void* data){ free(data); } -RJP_value* rjp_add_member(RJP_value* dest, int alloc_key, char* key, size_t keylen, RJP_value value){ +RJP_value* rjp_add_member(RJP_value* dest, const char* key, size_t keylen, RJP_value value){ if(!keylen) keylen = strlen(key); - if(alloc_key) - _rjp__add_member(&dest->object, key, keylen); - else - _rjp__add_member_no_alloc(&dest->object, key, keylen); + _rjp__add_member(&dest->object, key, keylen); + dest->object.last->value = value; + dest->object.last->value.parent = dest; + return &dest->object.last->value; +} +RJP_value* rjp_add_member_no_alloc(RJP_value* dest, char* key, size_t keylen, RJP_value value){ + if(!keylen) + keylen = strlen(key); + _rjp__add_member_no_alloc(&dest->object, key, keylen); dest->object.last->value = value; dest->object.last->value.parent = dest; return &dest->object.last->value; @@ -53,6 +58,11 @@ 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_value(RJP_value* dest, RJP_value value){ + struct RJP_value* p = dest->parent; + *dest = value; + dest->parent = p; +} RJP_value rjp_integer(long i){ return (RJP_value){.integer = i, .type = json_integer}; }