diff --git a/rtree.h.md b/rtree.h.md new file mode 100644 index 0000000..c73df60 --- /dev/null +++ b/rtree.h.md @@ -0,0 +1,102 @@ +# Tree example + +Was written a long while ago. But it's probably ok. + +## Source code: +```c +#ifndef RTREE_H +#define RTREE_H +#include "rmalloc.h" +#include +#include +#include + +typedef struct rtree_t { + struct rtree_t *next; + struct rtree_t *children; + char c; + void *data; +} rtree_t; + +rtree_t *rtree_new() { + rtree_t *b = (rtree_t *)rmalloc(sizeof(rtree_t)); + b->next = NULL; + b->children = NULL; + b->c = 0; + b->data = NULL; + return b; +} + +rtree_t *rtree_set(rtree_t *b, char *c, void *data) { + while (b) { + if (b->c == 0) { + b->c = *c; + c++; + if (*c == 0) { + b->data = data; + // printf("SET1 %c\n", b->c); + return b; + } + } else if (b->c == *c) { + c++; + if (*c == 0) { + b->data = data; + return b; + } + if (b->children) { + b = b->children; + } else { + b->children = rtree_new(); + b = b->children; + } + } else if (b->next) { + b = b->next; + } else { + b->next = rtree_new(); + b = b->next; + b->c = *c; + c++; + if (*c == 0) { + b->data = data; + return b; + } else { + b->children = rtree_new(); + b = b->children; + } + } + } + return NULL; +} + +rtree_t *rtree_find(rtree_t *b, char *c) { + while (b) { + if (b->c == *c) { + c++; + if (*c == 0) { + return b; + } + b = b->children; + continue; + } + b = b->next; + } + return NULL; +} + +void rtree_free(rtree_t *b) { + if (!b) + return; + rtree_free(b->children); + rtree_free(b->next); + rfree(b); +} + +void *rtree_get(rtree_t *b, char *c) { + rtree_t *t = rtree_find(b, c); + if (t) { + return t->data; + } + return NULL; +} + +``` \ No newline at end of file