From b27031876b63a29c8185fd4922449f16bbbdc4fc Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sat, 1 Dec 2018 08:21:06 -0800 Subject: [PATCH] added accessor interface --- include/rjp.h | 35 ++++++++++++++++++++++++++--------- src/input.c | 19 ------------------- src/output.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 28 deletions(-) diff --git a/include/rjp.h b/include/rjp.h index 3d5ce5b..164355b 100644 --- a/include/rjp.h +++ b/include/rjp.h @@ -84,8 +84,8 @@ struct JSON_array_element{ //A member of an object struct JSON_object_member{ - struct JSON_string name; struct JSON_value value; + struct JSON_string name; struct JSON_object_member* next; }; @@ -96,14 +96,6 @@ struct JSON_value* rjp_parse(const char* str); void rjp_free_json(char* json); void rjp_free(struct JSON_value* root); -struct JSON_object_member* rjp_get_members(struct JSON_object* j); -struct JSON_object_member* rjp_next_member(struct JSON_object_member* j); -struct JSON_object* rjp_member_parent(struct JSON_object_member* j); -struct JSON_value* rjp_get_member_value(struct JSON_object_member* j); -enum JSON_type rjp_get_member_type(struct JSON_object_member* j); -enum JSON_type rjp_get_value_type(struct JSON_value* j); - - //initialize an empty json handle (outputting to string would result in '{}') struct JSON_value* rjp_init_json(void); @@ -112,6 +104,7 @@ struct JSON_value* rjp_add_member(struct JSON_value* dest, int alloc_key, char* //add an element to a json array struct JSON_value* rjp_add_element(struct JSON_value* dest, struct JSON_value value); +//initialize a JSON_value to the requested type and value struct JSON_value rjp_integer(long i); struct JSON_value rjp_boolean(char b); struct JSON_value rjp_dfloat(double d); @@ -120,7 +113,31 @@ struct JSON_value rjp_null(void); struct JSON_value rjp_object(void); struct JSON_value rjp_array(void); +//access members/elements +struct JSON_value* rjp_get_member(struct JSON_value* object); +struct JSON_value* rjp_next_member(struct JSON_value* member); +struct JSON_value* rjp_get_element(struct JSON_value* array); +struct JSON_value* rjp_next_element(struct JSON_value* element); + +//member metadata +char* rjp_member_name(struct JSON_value* member); +size_t rjp_member_name_length(struct JSON_value* member); + +//value metadata +struct JSON_value* rjp_value_parent(struct JSON_value* element); +enum JSON_type rjp_value_type(struct JSON_value* value); + +//value accessors +double rjp_value_dfloat(struct JSON_value* value); +int rjp_value_integer(struct JSON_value* value); +char rjp_value_boolean(struct JSON_value* value); +char* rjp_value_string(struct JSON_value* value); +size_t rjp_value_string_length(struct JSON_value* value); + + +//copy input string and add json escape sequences size_t rjp_escape_strcpy(char* dest, const char* src); +//length of string including escape sequences size_t rjp_escape_strlen(const char* str); size_t rjp_dump_object(struct JSON_value* root, char* dest); diff --git a/src/input.c b/src/input.c index 2d536fe..d71d6a0 100644 --- a/src/input.c +++ b/src/input.c @@ -413,22 +413,3 @@ struct JSON_value* rjp_parse(const char* str){ #undef syntax_error -//TODO -struct JSON_object_member* rjp_get_members(struct JSON_object* j){ - return j->members; -} -struct JSON_object_member* rjp_next_member(struct JSON_object_member* j){ - return j->next; -} -struct JSON_object* rjp_member_parent(struct JSON_object_member* j){ - return &j->value.parent->object; -} -struct JSON_value* rjp_get_member_value(struct JSON_object_member* j){ - return &j->value; -} -enum JSON_type rjp_get_member_type(struct JSON_object_member* j){ - return j->value.type; -} -enum JSON_type rjp_get_value_type(struct JSON_value* j){ - return j->type; -} diff --git a/src/output.c b/src/output.c index 1f75204..e3a2b48 100644 --- a/src/output.c +++ b/src/output.c @@ -50,6 +50,51 @@ struct JSON_value rjp_array(void){ } + +struct JSON_value* rjp_get_member(struct JSON_value* object){ + return &object->object.members->value; +} +struct JSON_value* rjp_next_member(struct JSON_value* member){ + //polymorphism + return (struct JSON_value*)(((struct JSON_object_member*)member)->next); +} +struct JSON_value* rjp_get_element(struct JSON_value* array){ + return &array->array.elements->value; +} +struct JSON_value* rjp_next_element(struct JSON_value* element){ + return (struct JSON_value*)(((struct JSON_array_element*)element)->next); +} + +char* rjp_member_name(struct JSON_value* member){ + return ((struct JSON_object_member*)member)->name.value; +} +size_t rjp_member_name_length(struct JSON_value* member){ + return ((struct JSON_object_member*)member)->name.length; +} + +struct JSON_value* rjp_value_parent(struct JSON_value* value){ + return value->parent; +} +enum JSON_type rjp_value_type(struct JSON_value* value){ + return value->type; +} +double rjp_value_dfloat(struct JSON_value* value){ + return value->dfloat; +} +int rjp_value_integer(struct JSON_value* value){ + return value->integer; +} +char rjp_value_boolean(struct JSON_value* value){ + return value->boolean; +} +char* rjp_value_string(struct JSON_value* value){ + return value->string.value; +} +size_t rjp_value_string_length(struct JSON_value* value){ + return value->string.length; +} + + static size_t _rjp__write_value(char* dest, struct JSON_value* val){ size_t ret; switch(val->type){