From 23e4967fd42a6a2bee5c44213be4df61ff546b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Tue, 26 Feb 2019 15:12:56 +0100 Subject: WIP. --- graphs.c | 17 +++++++++-------- macro.h | 3 +++ main.c | 14 ++++++++++++++ strbuf.c | 6 ++++++ strbuf.h | 4 ++++ trie.h | 7 ++++++- trie.inc.h | 28 ++++++++++++++++++++++++++++ 7 files changed, 70 insertions(+), 9 deletions(-) diff --git a/graphs.c b/graphs.c index 8051b226..10d9cf98 100644 --- a/graphs.c +++ b/graphs.c @@ -117,21 +117,22 @@ int trie_to_dot_helper ( TRIE_NODE(T)* root, FILE* f ) { /* Parameters */ // TODO reenable this, but currently v->val is a TRIE, // which I currently can't itterate over -#if 0 - FOR(LLIST, param_set, p, &v->val) { - strbuf* param_key = &p->key; + LLIST(strbuf)* keys = KEYS(TRIE(param_set))(&v->val); + // FOR(TRIE, param_set, p, &v->val) { + FOR(LLIST, strbuf, key, keys) { + param_set* p = GET(TRIE(param_set))(&v->val, key->mem); + // strbuf* param_key = &p->key; fprintf(f, "\"%p\" [label=\"%s\" color=blue];\n", - param_key, param_key->mem); - fprintf(f, "\"%p\" -> \"%p\";", p, param_key); + key, key->mem); + fprintf(f, "\"%p\" -> \"%p\";", p, key); - FOR(LLIST, strbuf, str, &p->val) { + FOR(LLIST, strbuf, str, p) { fprintf(f, "\"%p\" [label=\"%s\" color=orange];", str, str->mem); - fprintf(f, "\"%p\" -> \"%p\";", param_key, str); + fprintf(f, "\"%p\" -> \"%p\";", key, str); } } -#endif } } #endif diff --git a/macro.h b/macro.h index 6421b2fd..7b620f83 100644 --- a/macro.h +++ b/macro.h @@ -80,6 +80,8 @@ /* generate reusable internal symbol */ #define __INTER(s) TP3(__, s, __internal) +#define __INTER2(s) __INTER(__INTER(s)) +#define __INTER3(s) __INTER(__INTER(__INTER(s))) /* Iterator macros. */ #define FOR(CONT_T, T, var, set) \ @@ -111,6 +113,7 @@ #define POP(T) TEMPL(pop , T) #define GET(T) TEMPL(get , T) #define RESET(T) TEMPL(reset , T) +#define KEYS(T) TEMPL(keys , T) /* * Formatting macros. diff --git a/main.c b/main.c index 3e0d005e..40c0e03f 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,11 @@ #include "graphs.h" #include "err.h" +#define TYPE content_line +// #include "hash.inc" +#include "trie.inc.h" +#undef TYPE + typedef struct { int argc; char** argv; @@ -53,6 +58,15 @@ int main (int argc, char** argv) { for (size_t j = 0; j < cal->components.length; j++) { vcomponent* ev = GET(VECT(vcomponent))(&cal->components, j); + LLIST(strbuf)* keys = KEYS(TRIE(content_line))(&ev->clines); + FOR(LLIST, strbuf, k, keys) { + char* mem = k->mem; + char buf[10000]; + buf[0] = '\0'; + FMT(content_line)(GET(TRIE(content_line))(&ev->clines, mem), buf); + printf("%s := %s\n", mem, buf); + } + if (strcmp(ev->type, "VEVENT") != 0) continue; printf("%3lu : %3lu | %s | %s\n", diff --git a/strbuf.c b/strbuf.c index 2d101164..9160e02a 100644 --- a/strbuf.c +++ b/strbuf.c @@ -56,6 +56,12 @@ int strbuf_append(strbuf* s, char c) { return retval; } +char strbuf_pop(strbuf* s) { + char ret = s->mem[--s->len]; + s->mem[s->len + 1] = '\0'; + return ret; +} + int strbuf_cap(strbuf* s) { /* * TODO check memmory usage diff --git a/strbuf.h b/strbuf.h index 850b0dd5..57946cc8 100644 --- a/strbuf.h +++ b/strbuf.h @@ -52,9 +52,13 @@ int DEEP_COPY(strbuf)(strbuf*, strbuf*); /* * Append char to end of strbuf, determined by s->len. + * + * TODO rename this PUSH(strbuf)? */ int strbuf_append(strbuf* s, char c); +char strbuf_pop(strbuf*); + /* * Calls strbuf_append with NULL. */ diff --git a/trie.h b/trie.h index 9de60771..9de38be3 100644 --- a/trie.h +++ b/trie.h @@ -11,6 +11,9 @@ #endif /* TRIE_H */ #ifdef TYPE +#include "linked_list.h" +#include "strbuf.h" + typedef struct TRIE_NODE(TYPE) { char c; TYPE* value; @@ -27,7 +30,7 @@ INIT_F ( TRIE(TYPE) ); INIT_F (TRIE_NODE(TYPE), char c); -INIT_F (TRIE_NODE(TYPE), +INIT_F (TRIE_NODE(TYPE), char c, TRIE_NODE(TYPE)* next, TRIE_NODE(TYPE)* child ); int PUSH(TRIE(TYPE)) ( TRIE(TYPE)* trie, char* key, TYPE* val ); @@ -46,4 +49,6 @@ FMT_F(TRIE(TYPE)); int DEEP_COPY(TRIE_NODE(TYPE)) (TRIE_NODE(TYPE)* dest, TRIE_NODE(TYPE)* src); int DEEP_COPY(TRIE(TYPE)) (TRIE(TYPE)* dest, TRIE(TYPE)* src); +LLIST(strbuf)* KEYS(TRIE(TYPE)) (TRIE(TYPE)*); + #endif /* TYPE */ diff --git a/trie.inc.h b/trie.inc.h index afa6656a..3481dec2 100644 --- a/trie.inc.h +++ b/trie.inc.h @@ -6,6 +6,8 @@ #include "err.h" #include "macro.h" +#include "linked_list.inc.h" +#include "strbuf.h" INIT_F ( TRIE(TYPE) ) { NEW(TRIE_NODE(TYPE), t, '\0'); @@ -187,4 +189,30 @@ int DEEP_COPY(TRIE(TYPE)) (TRIE(TYPE)* dest, TRIE(TYPE)* src) { return DEEP_COPY(TRIE_NODE(TYPE))(dest->root, src->root); } +void KEYS(TRIE_NODE(TYPE)) (TRIE_NODE(TYPE)* node, LLIST(strbuf)* list, strbuf* path) { + if (node == NULL) return; + + + if (node->value != NULL) { + strbuf_append(path, node->c); + PUSH(LLIST(strbuf))(list, path); + strbuf_pop(path); + } + if (node->next != NULL) { + KEYS(TRIE_NODE(TYPE)) (node->next, list, path); + } + if (node->child != NULL) { + strbuf_append(path, node->c); + KEYS(TRIE_NODE(TYPE)) (node->child, list, path); + strbuf_pop(path); + } +} + +LLIST(strbuf)* KEYS(TRIE(TYPE)) (TRIE(TYPE)* trie) { + NEW(LLIST(strbuf), retlist); + SNEW(strbuf, key); + KEYS(TRIE_NODE(TYPE)) (trie->root, retlist, &key); + return retlist; +} + #endif /* TYPE */ -- cgit v1.2.3