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:
rexy712
2020-01-13 15:19:27 -08:00
parent 6e53fe29e2
commit a646d1c4e8
7 changed files with 123 additions and 210 deletions

View File

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

View File

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

View File

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