Fix RJP_object_iterator to actually usable state

This commit is contained in:
rexy712
2020-01-17 12:48:26 -08:00
parent ed5179c677
commit b5fdb94fd3
4 changed files with 34 additions and 18 deletions

View File

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

View File

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

View File

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

View File

@@ -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 */