aboutsummaryrefslogtreecommitdiff
path: root/lib/dyn_tree.c
diff options
context:
space:
mode:
authorKatharina Fey <kookie@spacekookie.de>2016-07-30 23:28:36 +0200
committerKatharina Fey <kookie@spacekookie.de>2016-07-30 23:28:36 +0200
commit58045e8a341b066a1957cc2472cb91b0d39b28ef (patch)
tree2b5370b30745cad72896bc02eea0371c5a95b33a /lib/dyn_tree.c
parent6715214825f7c4b555227cc48e65c8af860f4010 (diff)
Changing the APi slightly and adding better comments for the api functions.
- Also adding the ability to store custom pointers in a node
Diffstat (limited to '')
-rw-r--r--lib/dyn_tree.c55
1 files changed, 49 insertions, 6 deletions
diff --git a/lib/dyn_tree.c b/lib/dyn_tree.c
index 4665332..095d379 100644
--- a/lib/dyn_tree.c
+++ b/lib/dyn_tree.c
@@ -74,6 +74,21 @@ dt_err dtree_addliteral(dtree *data, const char *literal, size_t length)
return SUCCESS;
}
+
+dt_err dtree_addpointer(dtree *data, void *ptr)
+{
+ if(data->type != UNSET)
+ if(data->type != POINTER) return INVALID_PAYLOAD;
+
+ data->payload.pointer = ptr;
+ data->type = POINTER;
+ data->size = sizeof(ptr);
+ data->used = sizeof(*ptr);
+
+ return SUCCESS;
+}
+
+
dt_err dtree_addnumeral(dtree *data, int numeral)
{
/* Make sure we are a literal or unset data object */
@@ -130,6 +145,7 @@ dt_err dtree_addrecursive(dtree *data, dtree *(*new_data))
return SUCCESS;
}
+
dt_err dtree_addpair(dtree *data, dtree *(*key), dtree *(*value))
{
/* Make sure we are a literal or unset data object */
@@ -265,6 +281,7 @@ dt_err dtree_free(dtree *data)
if(data->type == LITERAL) {
if(data->payload.literal) free(data->payload.literal);
+
} else if(data->type == RECURSIVE || data->type == PAIR) {
int i;
dt_err err;
@@ -274,19 +291,45 @@ dt_err dtree_free(dtree *data)
}
free(data->payload.recursive);
+
+ } else if(data->type == POINTER) {
+ if(data->payload.pointer) free(data->payload.pointer);
}
free(data);
return SUCCESS;
}
-const char *dtree_dtype(dt_uni_t type)
+dt_err dtree_free_shallow(dtree *data)
{
- switch(type) {
- case LITERAL: return "Literal";
- case NUMERAL: return "Numeral";
- case RECURSIVE: return "Recursive";
- default: return "Unknown";
+ if(data == NULL) return SUCCESS;
+
+ if(data->type == LITERAL) {
+ if(data->payload.literal) free(data->payload.literal);
+ } else if(data->type == RECURSIVE || data->type == PAIR) {
+ int i;
+ dt_err err;
+ for(i = 0; i < data->size; i++) {
+ err = dtree_free(data->payload.recursive[i]);
+ if(err) return err;
+ }
+
+ free(data->payload.recursive);
+ }
+
+ free(data);
+ return SUCCESS;
+}
+
+const char *dtree_dtype(dtree *data)
+{
+ switch(data->type) {
+ case LITERAL: return "Literal";
+ case NUMERAL: return "Numeral";
+ case RECURSIVE: return "Recursive";
+ case PAIR: return "Pair";
+ case POINTER: return "Pointer";
+ default: return "Unknown";
}
}