From d46183860c1f3f10095e95023adcb79b1896ab0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 22 Mar 2019 20:11:11 +0100 Subject: Move C and Scheme code into subdirs. --- src/graphs.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/graphs.c (limited to 'src/graphs.c') diff --git a/src/graphs.c b/src/graphs.c new file mode 100644 index 00000000..51a26117 --- /dev/null +++ b/src/graphs.c @@ -0,0 +1,144 @@ +#include "graphs.h" + +#include +#include +#include +#include "err.h" + +// #define TYPE strbuf +// #include "linked_list.h" +// #include "linked_list.inc.h" +// #undef TYPE + +int create_graph_trie (vcomponent* ev, char* filename) { + FILE* f = fopen(filename, "w"); + + fputs("digraph {\n rankdir=LR;", f); + trie_to_dot(&ev->clines, f); + fputs("}", f); + + fclose(f); + + INFO_F("Wrote '%s' to '%s'", vcomponent_get_val(ev, "X-HNH-FILENAME"), filename); + + return 0; +} + +int helper_vcomponent (vcomponent* root, FILE* f) { + fprintf(f, "subgraph \"cluster_root\" { label=File; \"%p\" [label=%s] }\n", root, root->type); + + TRIE(content_line)* trie = &root->clines; + TRIE_NODE(content_line)* n = trie->root->child; + + if (! EMPTY(TRIE(content_line))(trie)) { + fprintf(f, "subgraph \"cluster_%p\" {\n", root); + fprintf(f, "\"%p\" [label=trie fontcolor=gray, color=gray];", trie); + fprintf(f, "\"%p\" -> \"%p\" [color=red]\n", root, trie); + while (n != NULL) { + fprintf(f, "\"%p\" -> \"%p\" [color=gray]\n", + (void*) trie, + (void*) n); + fprintf(f, "subgraph \"cluster_%c_%p\" {\ncolor=red; \n", + n->c, root); + trie_to_dot_helper( n, f ); + + + fputs("}", f); + n = n->next; + } + fputs("}", f); + } + + FOR(LLIST, vcomponent, child, &root->components) { + fprintf(f, "\"%p\" -> \"%p\"\n", root, child); + helper_vcomponent(child, f); + } + return 0; +} + +int create_graph_vcomponent (vcomponent* root, char* outfile) { + FILE* f = fopen(outfile, "w"); + if (f == NULL) { + ERR_F("Error opening file %s, errno = %i", outfile, errno); + return 1; + } + vcomponent* c = root; + fputs("digraph {", f); + helper_vcomponent(c, f); + fputs("}", f); + fclose(f); + return 0; +} + +#define T content_line + +int trie_to_dot ( TRIE(T)* trie, FILE* f ) { + TRIE_NODE(T)* n = trie->root->child; + fprintf(f, "\"%p\" [label=root fontcolor=gray, color=gray];", trie); + while (n != NULL) { + fprintf(f, "\"%p\" -> \"%p\" [color=gray]\n", + (void*) trie, + (void*) n); + fprintf(f, "subgraph \"cluster_%c\" {\n", + n->c); + trie_to_dot_helper( n, f ); + fputs("}", f); + n = n->next; + } + return 0; +} + +int trie_to_dot_helper ( TRIE_NODE(T)* root, FILE* f ) { + if (L(root) == NULL) { + fprintf(f, "\"%p\"[label = \"%c\" style=filled fillcolor=white];\n", + (void*) root, root->c); + } else { + fprintf(f, "\"%p\"[label = \"%c [%i]\" style=filled fillcolor=green];\n", + (void*) root, root->c, + SIZE(LLIST(content_set))(L(root)) + ); + } + TRIE_NODE(T)* child = root->child; + + // ---------------------------------------- +#if 1 /* Toggle values */ + if (L(root) != NULL) { + + FOR(LLIST, content_set, v, L(root)) { + char buf[0x100]; + FMT(strbuf)(&v->key, buf); + fprintf(f, "\"%p\" [label=\"%s\" shape=rectangle color=darkgreen];\n", + v, buf); + /* Edge between TRIE char node and data node */ + fprintf(f, "\"%p\" -> \"%p\";\n", root, v); + + /* Parameters */ + LLIST(strbuf)* keys = KEYS(TRIE(param_set))(&v->val); + FOR(LLIST, strbuf, key, keys) { + param_set* p = GET(TRIE(param_set))(&v->val, key->mem); + + fprintf(f, "\"%p\" [label=\"%s\" color=blue];\n", + key, key->mem); + /* Edge between data node and param key node */ + fprintf(f, "\"%p\" -> \"%p\";", v, key); + + FOR(LLIST, strbuf, str, p) { + fprintf(f, "\"%p\" [label=\"%s\" color=orange];", + str, str->mem); + /* Edge between param key node and param value node */ + fprintf(f, "\"%p\" -> \"%p\";", key, str); + } + } + } + } +#endif + // ---------------------------------------- + + while (child != NULL) { + fprintf(f, "\"%p\" -> \"%p\";\n", + (void*) root, (void*) child); + trie_to_dot_helper(child, f); + child = child->next; + } + return 0; +} -- cgit v1.2.3