aboutsummaryrefslogtreecommitdiff
path: root/lib/dtree.c
diff options
context:
space:
mode:
authorKatharina Fey <kookie@spacekookie.de>2016-12-13 02:03:04 +0100
committerKatharina Fey <kookie@spacekookie.de>2019-06-04 20:21:53 +0200
commit1662652061ed68fcddf3789bf5f20087510b101c (patch)
treeb700100b0f55b1018688500f43d26b86948bb885 /lib/dtree.c
parent69fc0d982de64a7d2fdad063fd24a44b16fcab11 (diff)
Adding support for boolean nodes as well as long long supports via compile options
Diffstat (limited to '')
-rw-r--r--lib/dtree.c61
1 files changed, 55 insertions, 6 deletions
diff --git a/lib/dtree.c b/lib/dtree.c
index cc2fa91..32adb0c 100644
--- a/lib/dtree.c
+++ b/lib/dtree.c
@@ -55,7 +55,7 @@ dt_err dtree_resettype(dtree *data)
/* Set the data type to unset */
data->type = UNSET;
- data->encset = DYNTREE_ENCODE_NONE;
+ data->encset = 0;
data->size = 0;
data->used = 0;
@@ -122,6 +122,20 @@ dt_err dtree_addnumeral(dtree *data, long numeral)
}
+dt_err dtree_addboolean(dtree *data, bool b)
+{
+ /* Make sure we are a literal or unset data object */
+ if(data->type != UNSET)
+ if(data->type != BOOLEAN) return INVALID_PAYLOAD;
+
+ data->payload.boolean = b;
+ data->type = BOOLEAN;
+ data->size = sizeof(bool);
+ data->used = sizeof(bool);
+ return SUCCESS;
+}
+
+
dt_err dtree_addlist(dtree *data, dtree *(*new_data))
{
/* Make sure we are a literal or unset data object */
@@ -286,11 +300,15 @@ dt_err dtree_copy_deep(dtree *data, dtree *(*copy))
switch(type) {
case LITERAL:
- dtree_addliteral((*copy), data->payload.literal);
+ dtree_addliteral(*copy, data->payload.literal);
break;
case NUMERIC:
- dtree_addnumeral((*copy), data->payload.numeral);
+ dtree_addnumeral(*copy, data->payload.numeral);
+ break;
+
+ case BOOLEAN:
+ dtree_addboolean(*copy, data->payload.boolean);
break;
case LIST:
@@ -302,7 +320,7 @@ dt_err dtree_copy_deep(dtree *data, dtree *(*copy))
dtree *node = data->payload.list[i];
dtree *new;
- dtree_addlist((*copy), &new);
+ dtree_addlist(*copy, &new);
dtree_copy_deep(node, &new);
}
@@ -312,7 +330,7 @@ dt_err dtree_copy_deep(dtree *data, dtree *(*copy))
case PAIR:
{
dtree *key, *val;
- dtree_addpair((*copy), &key, &val);
+ dtree_addpair(*copy, &key, &val);
dtree *orig_key = data->payload.list[0];
dtree *orig_val = data->payload.list[1];
@@ -324,7 +342,7 @@ dt_err dtree_copy_deep(dtree *data, dtree *(*copy))
}
case POINTER:
- dtree_addpointer((*copy), data->payload.pointer);
+ dtree_addpointer(*copy, data->payload.pointer);
break;
default:
@@ -348,6 +366,7 @@ dt_err dtree_parent(dtree *root, dtree *data, dtree **parent)
/* Dead-end data stores automatically return @{NODE_NOT_FOUND} */
case POINTER:
case LITERAL:
+ case BOOLEAN:
case NUMERIC:
return NODE_NOT_FOUND;
@@ -399,6 +418,10 @@ dt_err dtree_copy(dtree *data, dtree *(*copy))
err = dtree_addnumeral(*copy, data->payload.numeral);
break;
+ case BOOLEAN:
+ err = dtree_addboolean(*copy, data->payload.boolean);
+ break;
+
case LIST:
(*copy)->type = LIST;
(*copy)->payload.list = (dtree**) malloc(sizeof(dtree*) * data->size);
@@ -456,6 +479,11 @@ dt_err dtree_search_payload(dtree *data, dtree *(*found), void *payload, dt_uni_
*found = data;
break;
+ case BOOLEAN:
+ if(data->payload.boolean == (bool) payload)
+ *found = data;
+ break;
+
case POINTER:
if(data->payload.pointer == payload)
*found = data;
@@ -469,6 +497,7 @@ dt_err dtree_search_payload(dtree *data, dtree *(*found), void *payload, dt_uni_
return (*found == NULL) ? NODE_NOT_FOUND : SUCCESS;
}
+// FIXME: This is horrible. Do via context?
static int reached = 0;
dt_err dtree_search_keypayload(dtree *data, dtree *(*found), void *payload, dt_uni_t type, int depth)
{
@@ -484,15 +513,22 @@ dt_err dtree_search_keypayload(dtree *data, dtree *(*found), void *payload, dt_u
dt_uni_t tt;
int hit = -1;
+
if(strcmp(key->payload.literal, (char*) payload) == 0) {
tt = LITERAL;
hit = 0;
}
+
if(key->payload.numeral == (long) payload) {
tt = NUMERIC;
hit = 0;
}
+ if(key->payload.boolean == (bool) payload) {
+ tt = BOOLEAN;
+ hit = 0;
+ }
+
if(hit == 0) *found = data->payload.list[1];
} else if(data->type == LIST) {
@@ -531,6 +567,10 @@ dt_err dtree_search_keypayload(dtree *data, dtree *(*found), void *payload, dt_u
*found = data;
break;
+ case BOOLEAN:
+ if(data->payload.boolean == (bool) payload)
+ *found = data;
+
case POINTER:
if(data->payload.pointer == payload)
*found = data;
@@ -562,6 +602,10 @@ void list_print(dtree *data, const char *offset)
printf("%s[%lu]\n", offset, data->payload.numeral);
break;
+ case BOOLEAN:
+ printf("%s['%s']\n", offset, (data->payload.boolean) ? "TRUE" : "FALSE");
+ break;
+
case PAIR:
{
dt_uni_t k_type = data->payload.list[0]->type;
@@ -569,6 +613,7 @@ void list_print(dtree *data, const char *offset)
if(k_type == LITERAL) printf("%s['%s']", offset, data->payload.list[0]->payload.literal);
if(k_type == NUMERIC) printf("%s[%lu]", offset, data->payload.list[0]->payload.numeral);
+ if(k_type == BOOLEAN) printf("%s[%s]", offset, (data->payload.list[0]->payload.boolean) ? "TRUE" : "FALSE");
char new_offset[REAL_STRLEN(offset) + 2];
strcpy(new_offset, offset);
@@ -579,6 +624,7 @@ void list_print(dtree *data, const char *offset)
/* Print the value now */
if(v_type == LITERAL) printf(" => ['%s']\n", data->payload.list[1]->payload.literal);
if(v_type== NUMERIC) printf(" => [%lu]\n", data->payload.list[1]->payload.numeral);
+ if(k_type == BOOLEAN) printf("%s[%s]", offset, (data->payload.list[1]->payload.boolean) ? "TRUE" : "FALSE");
if(v_type == LIST || k_type == PAIR) list_print(data->payload.list[1], new_offset);
@@ -599,6 +645,7 @@ void list_print(dtree *data, const char *offset)
switch(t) {
case LITERAL:
+ case BOOLEAN:
case NUMERIC:
list_print(data->payload.list[i], new_offset);
continue;
@@ -635,6 +682,7 @@ dt_err dtree_get(dtree *data, void *(*val))
{
if(data->type == LITERAL) *val = data->payload.literal;
if(data->type == NUMERIC) *val = &data->payload.numeral;
+ if(data->type == BOOLEAN) *val = &data->payload.boolean;
if(data->type == LIST || data->type == PAIR) *val = (dtree*) data->payload.list;
return SUCCESS;
}
@@ -696,6 +744,7 @@ const char *dtree_dtype(dtree *data)
switch(data->type) {
case LITERAL: return "Literal";
case NUMERIC: return "Numeric";
+ case BOOLEAN: return "Boolean";
case LIST: return "List";
case PAIR: return "Pair";
case POINTER: return "Pointer";