Fix RJP_object_iterator to actually usable state
This commit is contained in:
@@ -77,15 +77,7 @@ typedef struct RJP_string{
|
||||
struct RJP_array_element;
|
||||
typedef struct RJP_tree_node RJP_tree_node;
|
||||
|
||||
typedef struct RJP_tree_stack{
|
||||
RJP_tree_node** data;
|
||||
int size;
|
||||
int pos;
|
||||
}RJP_tree_stack;
|
||||
typedef struct RJP_object_iterator{
|
||||
RJP_tree_stack stack;
|
||||
RJP_tree_node* current;
|
||||
}RJP_object_iterator;
|
||||
typedef struct RJP_object_iterator RJP_object_iterator;
|
||||
|
||||
//Represents a json object
|
||||
typedef struct RJP_object{
|
||||
@@ -175,8 +167,10 @@ RJP_value rjp_array(void);
|
||||
|
||||
//Access first member of a json object
|
||||
RJP_value* rjp_get_member(RJP_object_iterator* object);
|
||||
RJP_object_iterator rjp_get_object_iterator(const RJP_value* object);
|
||||
void rjp_object_iterator_next(RJP_object_iterator* it);
|
||||
RJP_object_iterator* rjp_get_object_iterator(const RJP_value* object);
|
||||
RJP_value* rjp_object_iterator_current(RJP_object_iterator* it);
|
||||
RJP_value* rjp_object_iterator_next(RJP_object_iterator* it);
|
||||
void rjp_free_object_iterator(RJP_object_iterator* it);
|
||||
//Return number of members in the object
|
||||
size_t rjp_num_members(const RJP_value* object);
|
||||
//Return the object member's key name
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
#define RJP_TREE_ERR_NOT_FOUND 2
|
||||
|
||||
typedef struct RJP_object_member{
|
||||
RJP_string name;
|
||||
RJP_value value;
|
||||
RJP_string name;
|
||||
}RJP_object_member;
|
||||
|
||||
typedef struct RJP_object_iterator RJP_object_iterator;
|
||||
@@ -21,6 +21,15 @@ struct RJP_tree_node{
|
||||
RJP_object_member data;
|
||||
unsigned color:1;
|
||||
};
|
||||
typedef struct RJP_tree_stack{
|
||||
RJP_tree_node** data;
|
||||
int size;
|
||||
int pos;
|
||||
}RJP_tree_stack;
|
||||
typedef struct RJP_object_iterator{
|
||||
RJP_tree_stack stack;
|
||||
RJP_tree_node* current;
|
||||
}RJP_object_iterator;
|
||||
|
||||
|
||||
RJP_tree_node* irjp_new_node(RJP_object_member* value);
|
||||
|
||||
23
src/rjp.c
23
src/rjp.c
@@ -135,13 +135,26 @@ RJP_value rjp_array(void){
|
||||
RJP_value* rjp_get_member(RJP_object_iterator* it){
|
||||
return &it->current->data.value;
|
||||
}
|
||||
RJP_object_iterator rjp_get_object_iterator(const RJP_value* object){
|
||||
RJP_object_iterator it;
|
||||
irjp_init_object_iterator(&it, object->object.root);
|
||||
RJP_object_iterator* rjp_get_object_iterator(const RJP_value* object){
|
||||
RJP_object_iterator* it = rjp_alloc(sizeof(RJP_object_iterator));
|
||||
irjp_init_object_iterator(it, object->object.root);
|
||||
return it;
|
||||
}
|
||||
void rjp_object_iterator_next(RJP_object_iterator* it){
|
||||
irjp_object_iterator_next(it);
|
||||
RJP_value* rjp_object_iterator_current(RJP_object_iterator* it){
|
||||
RJP_tree_node* n = irjp_object_iterator_current(it);
|
||||
if(!n)
|
||||
return NULL;
|
||||
return &n->data.value;
|
||||
}
|
||||
RJP_value* rjp_object_iterator_next(RJP_object_iterator* it){
|
||||
RJP_tree_node* n = irjp_object_iterator_next(it);
|
||||
if(!n)
|
||||
return NULL;
|
||||
return &n->data.value;
|
||||
}
|
||||
void rjp_free_object_iterator(RJP_object_iterator* it){
|
||||
irjp_delete_object_iterator(it);
|
||||
rjp_free(it);
|
||||
}
|
||||
size_t rjp_num_members(const RJP_value* object){
|
||||
return object->object.num_members;
|
||||
|
||||
@@ -182,7 +182,7 @@ static RJP_tree_node* irjp_pop_tree_stack(RJP_tree_stack* stack){
|
||||
return stack->data[--stack->pos];
|
||||
}
|
||||
static RJP_tree_node* irjp_peek_tree_stack(RJP_tree_stack* stack){
|
||||
return stack->data[stack->pos-1];
|
||||
return (stack->pos > 0) ? (stack->data[stack->pos-1]) : NULL;
|
||||
}
|
||||
|
||||
/* TREE ITERATOR */
|
||||
|
||||
Reference in New Issue
Block a user