diff options
author | Katharina Fey <kookie@spacekookie.de> | 2016-12-11 03:09:14 +0100 |
---|---|---|
committer | Katharina Fey <kookie@spacekookie.de> | 2019-06-04 20:21:03 +0200 |
commit | a4b6f559da2af7f1c035446a1ad8f01fd4d9dbf7 (patch) | |
tree | 7352aadae99d24f4df57c523f1f5015836f2e27f /lib/dtree.c | |
parent | e3fe9401e4593c317ca967738d4c14e638a6ccd6 (diff) |
Adding new function that gets the parent of a current node in a recursive structure
Diffstat (limited to '')
-rw-r--r-- | lib/dtree.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/dtree.c b/lib/dtree.c index 466c8c0..e45d453 100644 --- a/lib/dtree.c +++ b/lib/dtree.c @@ -335,6 +335,48 @@ dt_err dtree_copy_deep(dtree *data, dtree *(*copy)) return err; } + +dt_err dtree_parent(dtree *root, dtree *data, dtree **parent) +{ + if(root == NULL || data == NULL) return INVALID_PARAMS; + + /* Blank the search pointer for easy error checking */ + (*parent) = NULL; + + switch(data->type) { + + /* Dead-end data stores automatically return @{NODE_NOT_FOUND} */ + case POINTER: + case LITERAL: + case NUMERIC: + return NODE_NOT_FOUND; + + case PAIR: + case LIST: + { + int i; + for(i = 0; i < root->used; i++) { + + /* Check if the node we're looking at is what we're searching for */ + if(root->payload.list[i] == data) { + (*parent) = root; + return SUCCESS; + } + + dt_err err = dtree_parent(root->payload.list[i], data, parent); + if(err == SUCCESS) return SUCCESS; + } + } + break; + + default: + return INVALID_PAYLOAD; + } + + return NODE_NOT_FOUND; +} + + dt_err dtree_copy(dtree *data, dtree *(*copy)) { if(data == NULL) return INVALID_PARAMS; |