3 Commits

Author SHA1 Message Date
rexy712
339c3af4f4 Fix issue with setting null key (used for stealing data) 2019-07-29 15:09:56 -07:00
rexy712
25c3c018f6 Const correction 2019-07-29 14:58:00 -07:00
rexy712
f367993ad4 Finally add key modifier functions. 2019-07-29 14:48:13 -07:00
4 changed files with 42 additions and 5 deletions

View File

@@ -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);
@@ -143,7 +148,7 @@ size_t rjp_num_members(const RJP_value* object);
//Return the object member's key name
char* rjp_member_name(const RJP_value* member);
//Return the object member's key name length excluding null terminator
size_t rjp_member_name_length(RJP_value* member);
size_t rjp_member_name_length(const RJP_value* member);
//Search for an object member with given key
RJP_search_res rjp_search_member(const RJP_value* object, const char* search, size_t skip);
//Search for first occurance of multiple keys. Returns first occurance of each.

View File

@@ -16,6 +16,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#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);

View File

@@ -80,6 +80,32 @@ 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(key){
if(!keylen){
keylen = strlen(key);
}
}else{
keylen = 0;
}
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(key){
if(!keylen){
keylen = strlen(key);
}
}else{
keylen = 0;
}
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;
@@ -127,7 +153,7 @@ size_t rjp_num_members(const RJP_value* object){
char* rjp_member_name(const RJP_value* member){
return ((RJP_object_member*)member)->name.value;
}
size_t rjp_member_name_length(RJP_value* member){
size_t rjp_member_name_length(const RJP_value* member){
return ((RJP_object_member*)member)->name.length;
}

View File

@@ -16,6 +16,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#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: