From b5fdb94fd36119e0c7e79aa87077a452da87d4de Mon Sep 17 00:00:00 2001 From: rexy712 Date: Fri, 17 Jan 2020 12:48:26 -0800 Subject: [PATCH] Fix RJP_object_iterator to actually usable state --- include/rjp.h | 16 +++++----------- include/tree.h | 11 ++++++++++- src/rjp.c | 23 ++++++++++++++++++----- src/tree.c | 2 +- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/include/rjp.h b/include/rjp.h index 110bd4d..da40178 100644 --- a/include/rjp.h +++ b/include/rjp.h @@ -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 diff --git a/include/tree.h b/include/tree.h index 7529317..3944fb5 100644 --- a/include/tree.h +++ b/include/tree.h @@ -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); diff --git a/src/rjp.c b/src/rjp.c index 6335df1..07299bd 100644 --- a/src/rjp.c +++ b/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; diff --git a/src/tree.c b/src/tree.c index e69e6cd..03ff0ac 100644 --- a/src/tree.c +++ b/src/tree.c @@ -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 */