aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2019-02-26 15:12:56 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2019-02-26 15:12:56 +0100
commit23e4967fd42a6a2bee5c44213be4df61ff546b13 (patch)
tree6347cd19fae83dc6766c587911682b7bffc36d39
parentCleanup. (diff)
downloadcalp-23e4967fd42a6a2bee5c44213be4df61ff546b13.tar.gz
calp-23e4967fd42a6a2bee5c44213be4df61ff546b13.tar.xz
WIP.
-rw-r--r--graphs.c17
-rw-r--r--macro.h3
-rw-r--r--main.c14
-rw-r--r--strbuf.c6
-rw-r--r--strbuf.h4
-rw-r--r--trie.h7
-rw-r--r--trie.inc.h28
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 */