added accessor interface

This commit is contained in:
rexy712 2018-12-01 08:21:06 -08:00
parent 566952de5e
commit b27031876b
3 changed files with 71 additions and 28 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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){