Moved rjp.c, memory.c, and strings.c over to new tree-based objects. Unfortunately, the API did need modified because C lacks the 'mutable' keyword.
This commit is contained in:
@@ -74,14 +74,23 @@ typedef struct RJP_string{
|
||||
}RJP_string;
|
||||
|
||||
//Forward declarations
|
||||
struct RJP_object_member;
|
||||
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;
|
||||
|
||||
//Represents a json object
|
||||
typedef struct RJP_object{
|
||||
struct RJP_object_member* members; //linked list of members
|
||||
struct RJP_object_member* last; //final member of linked list
|
||||
size_t num_members;
|
||||
struct RJP_tree_node* root;
|
||||
int num_members;
|
||||
}RJP_object;
|
||||
|
||||
//Represents a json array
|
||||
@@ -162,7 +171,7 @@ RJP_value rjp_object(void);
|
||||
RJP_value rjp_array(void);
|
||||
|
||||
//Access first member of a json object
|
||||
RJP_value* rjp_get_member(const RJP_value* object);
|
||||
RJP_value* rjp_get_member(RJP_object_iterator* object);
|
||||
//Access next member of a json object given the previous member
|
||||
RJP_value* rjp_next_member(const RJP_value* member);
|
||||
//Return number of members in the object
|
||||
@@ -172,13 +181,10 @@ char* rjp_member_name(const RJP_value* member);
|
||||
//Return the object member's key name length excluding null terminator
|
||||
size_t rjp_member_name_length(const RJP_value* member);
|
||||
//Search for an object member with given key
|
||||
RJP_search_res rjp_search_member(const RJP_value* object, const char* search, size_t skip);
|
||||
RJP_value* rjp_search_member(const RJP_value* object, const char* search);
|
||||
//Search for first occurance of multiple keys. Returns first occurance of each.
|
||||
//Assumes dest is large enough to hold maximum num items.
|
||||
size_t rjp_search_members(const RJP_value* object, size_t num, const char* const* searches, RJP_search_res* dest, size_t skip);
|
||||
//Search for multiple occurances of multiple keys. Returns pointer to list of matches.
|
||||
//Returned pointer must be freed using rjp_free
|
||||
RJP_search_res* rjp_search_members_multi(const RJP_value* object, size_t num, const char* const* searches, size_t* rsize, size_t skip);
|
||||
size_t rjp_search_members(const RJP_value* object, size_t num, const char* const* searches, RJP_value** dest);
|
||||
//Access first element of a json array
|
||||
RJP_value* rjp_get_element(const RJP_value* array);
|
||||
//Access next element of a json array given the previous element
|
||||
|
||||
@@ -39,15 +39,8 @@ typedef struct RJP_array_element{
|
||||
struct RJP_value value;
|
||||
struct RJP_array_element* next;
|
||||
}RJP_array_element;
|
||||
//A member of an object
|
||||
typedef struct RJP_object_member{
|
||||
struct RJP_value value;
|
||||
struct RJP_string name;
|
||||
struct RJP_object_member* next;
|
||||
}RJP_object_member;
|
||||
|
||||
void irjp_add_element(RJP_array* j);
|
||||
void irjp_add_member(RJP_object* j, const char* str, size_t len);
|
||||
void irjp_add_member_no_alloc(RJP_object* j, char* str, size_t len);
|
||||
|
||||
void irjp_delete_value(RJP_value* root);
|
||||
#endif
|
||||
|
||||
@@ -22,14 +22,15 @@ struct RJP_tree_node{
|
||||
unsigned color:1;
|
||||
};
|
||||
|
||||
RJP_tree_node* irjp_new_node(RJP_object_member value);
|
||||
RJP_tree_node* irjp_tree_insert_value(RJP_tree_node* root, RJP_object_member value, int* status);
|
||||
RJP_tree_node* irjp_tree_remove_value(RJP_tree_node* root, RJP_object_member value, int* status);
|
||||
RJP_tree_node* irjp_tree_search_value(RJP_tree_node* root, RJP_object_member value);
|
||||
RJP_tree_node* irjp_copy_tree(RJP_tree_node* root);
|
||||
|
||||
RJP_tree_node* irjp_new_node(RJP_object_member* value);
|
||||
RJP_tree_node* irjp_tree_insert_value(RJP_tree_node* root, RJP_object_member* value, int* status);
|
||||
RJP_tree_node* irjp_tree_remove_value(RJP_tree_node* root, const char* key, int* status);
|
||||
RJP_tree_node* irjp_tree_search_value(RJP_tree_node* root, const char* key);
|
||||
RJP_tree_node* irjp_copy_tree(const RJP_tree_node* root);
|
||||
void irjp_free_tree(RJP_tree_node* root);
|
||||
|
||||
int irjp_init_object_iterator(RJP_object_iterator* it, RJP_tree_node* root);
|
||||
int irjp_init_object_iterator(RJP_object_iterator* it, const RJP_tree_node* root);
|
||||
void irjp_delete_object_iterator(RJP_object_iterator* it);
|
||||
RJP_tree_node* irjp_object_iterator_next(RJP_object_iterator* it);
|
||||
RJP_tree_node* irjp_object_iterator_current(RJP_object_iterator* it);
|
||||
|
||||
Reference in New Issue
Block a user