aboutsummaryrefslogtreecommitdiff
path: root/trie.inc.h
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2019-02-21 19:57:31 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2019-02-22 12:43:06 +0100
commit329e3092542067f3a99fda328a8118e8d024e054 (patch)
treec1ccf987b3a616a46405cd7f788b4bc78767f7bf /trie.inc.h
parentFix c++ compile warnings. (diff)
downloadcalp-329e3092542067f3a99fda328a8118e8d024e054.tar.gz
calp-329e3092542067f3a99fda328a8118e8d024e054.tar.xz
Build, but doesn't link.
Diffstat (limited to 'trie.inc.h')
-rw-r--r--trie.inc.h166
1 files changed, 0 insertions, 166 deletions
diff --git a/trie.inc.h b/trie.inc.h
deleted file mode 100644
index 5517939e..00000000
--- a/trie.inc.h
+++ /dev/null
@@ -1,166 +0,0 @@
-#ifndef TYPE
-#error "Set TYPE before including self file"
-#else
-
-#include <stdarg.h>
-
-#include "err.h"
-#include "macro.h"
-
-INIT_F ( TRIE(TYPE) ) {
- NEW(TRIE_NODE(TYPE), t, '\0');
- self->root = t;
- return 0;
-}
-
-INIT_F (TRIE_NODE(TYPE), char c) {
- self->c = c;
- self->value = NULL;
- self->next = NULL;
- self->child = NULL;
- return 0;
-}
-
-INIT_F (TRIE_NODE(TYPE),
- char c,
- TRIE_NODE(TYPE)* next,
- TRIE_NODE(TYPE)* child )
-{
- self->c = c;
- self->next = next;
- self->child = child;
- return 0;
-}
-
-int PUSH(TRIE(TYPE)) ( TRIE(TYPE)* trie, char* key, TYPE* val ) {
- TRIE_NODE(TYPE) *cur, *last;
-
- last = trie->root;
- cur = last->child;
-
- char* subkey = key;
-
- while (1) {
- if (cur == NULL) {
- /* Build direct LL for remaining subkey */
- for (char* c = subkey; c[0] != '\0'; c++) {
- NEW(TRIE_NODE(TYPE), t, *c);
- last->child = t;
- last = t;
- }
- last->value = RESOLVE(TYPE)(last->value, val);
- return 0;
- } else if (cur->c == subkey[0]) {
- /* This node belongs to the key,
- * Decend further */
- last = cur;
- cur = cur->child;
- subkey++;
- } else if (subkey[0] == '\0') {
- /* Key finished */
- last->value = RESOLVE(TYPE)(last->value, val);
- return 0;
- } else if (cur->next != NULL) {
- /* This node was not part of the set, but it's sibling might */
- cur = cur->next;
- /* `last` not set since we aren't moving down */
- } else {
- /* No node on self level was part of the set, create a new__
- * sibling and follow down that parse */
- NEW(TRIE_NODE(TYPE), t, *subkey);
- cur->next = t;
- last = cur;
- cur = t;
- }
- }
-
- return 0;
-}
-
-/*
- * TODO what happens when I give an invalid key?
- */
-TYPE* GET(TRIE(TYPE)) ( TRIE(TYPE)* trie, char* key ) {
- TRIE_NODE(TYPE)* n = trie->root->child;
- char* subkey = key;
-
- while (n != NULL) {
- if (subkey[1] == '\0') {
- return n->value;
- } else if (subkey[0] == n->c) {
- n = n->child;
- subkey++;
- } else {
- n = n->next;
- }
- }
-
- ERR("Position not found");
- return 0;
-}
-
-FREE_F(TRIE_NODE(TYPE)) {
- if (self == NULL) return 0;
- if (self->value != NULL) FFREE(TYPE, self->value);
- if (self->next != NULL) FREE(TRIE_NODE(TYPE))(self->next);
- if (self->child != NULL) FREE(TRIE_NODE(TYPE))(self->child);
- free (self);
- return 0;
-}
-
-FREE_F(TRIE(TYPE)) {
- if (self->root->c != '\0') {
- // ERR("Invalid trie");
- return 1;
- }
- return FREE(TRIE_NODE(TYPE))(self->root);
-}
-
-int EMPTY(TRIE(TYPE))(TRIE(TYPE)* self) {
- return self->root->child == NULL;
-}
-
-FMT_F(TRIE_NODE(TYPE)) {
-
- va_list ap;
- va_start(ap, buf);
- int argc = va_arg(ap, int);
- int depth = argc >= 1
- ? va_arg(ap, int)
- : 0;
- va_end(ap);
-
- int seek = 0;
-
- TRIE_NODE(TYPE)* n = self;
-
- if (n == NULL) { fmtf("\n"); }
- while (n != NULL) {
- fmtf("|");
- // FOR(int, i, depth) fmtf(" ");
- for (int i = 0; i < depth; i++) fmtf(" ");
- fmtf("%c ", n->c == '\0' ? '0' : n->c);
- if (n->value != NULL) {
- seek += FMT(TYPE)(n->value, buf + seek);
- fmtf("\n");
- }
-
- if (n->child != NULL) {
- fmtf("\n");
- seek += FMT(TRIE_NODE(TYPE))(n->child, buf + seek, depth + 1);
- }
- n = n->next;
- }
- return seek;
-
-}
-
-FMT_F(TRIE(TYPE)) {
- int seek = 0;
- fmtf("Trie: %p: {\n", self);
- seek += FMT(TRIE_NODE(TYPE))(self->root->child, buf + seek);
- fmtf("}");
- return seek;
-}
-
-#endif /* TYPE */