From 58045e8a341b066a1957cc2472cb91b0d39b28ef Mon Sep 17 00:00:00 2001 From: Katharina Fey Date: Sat, 30 Jul 2016 23:28:36 +0200 Subject: Changing the APi slightly and adding better comments for the api functions. - Also adding the ability to store custom pointers in a node --- lib/dyn_tree.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'lib/dyn_tree.c') 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"; } } -- cgit v1.2.3