/* dot_dag.c Output dags to dot (graphvis). Copyright (C) 2012 Bill Currie Author: Bill Currie Date: 2012/05/08 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #include #include #include #include #include "dags.h" #include "statements.h" #include "symtab.h" #include "type.h" static int print_count; static void print_node (dstring_t *dstr, dagnode_t *node) { if (node->print_count == print_count) return; node->print_count = print_count; if (!node->a && (node->b || node->c)) { dasprintf (dstr, " \"dag_%p\" [label=\"bad node\"];\n", node); return; } if (node->a) { dasprintf (dstr, " \"dag_%p\" -> \"dag_%p\" [label=a];\n", node, node->a); print_node (dstr, node->a); } if (node->b) { dasprintf (dstr, " \"dag_%p\" -> \"dag_%p\" [label=b];\n", node, node->b); print_node (dstr, node->b); } if (node->c) { dasprintf (dstr, " \"dag_%p\" -> \"dag_%p\" [label=c];\n", node, node->c); print_node (dstr, node->c); } dasprintf (dstr, " \"dag_%p\" [%slabel=\"%s\"];\n", node, node->a ? "" : "shape=none,", daglabel_string (node->label)); if (node->identifiers) { daglabel_t *id; dasprintf (dstr, " \"dag_%p\" -> \"dagid_%p\" " "[style=dashed,dir=none];\n", node, node); dasprintf (dstr, " \"dagid_%p\" [shape=none,label=<\n", node); dasprintf (dstr, " \n"); dasprintf (dstr, " \n"); dasprintf (dstr, " "); dasprintf (dstr, " \n"); dasprintf (dstr, "
"); for (id = node->identifiers; id; id = id->next) dasprintf (dstr, "%s%s", daglabel_string(id), id->next ? " " : ""); dasprintf (dstr, "
>];\n"); } } void print_dag (dagnode_t *dag, const char *filename) { dstring_t *dstr = dstring_newstr(); print_count++; dasprintf (dstr, "digraph dag_%p {\n", dag); dasprintf (dstr, " layout=dot; rankdir=TB;\n"); print_node (dstr, dag); dasprintf (dstr, "}\n"); if (filename) { QFile *file; file = Qopen (filename, "wt"); Qwrite (file, dstr->str, dstr->size - 1); Qclose (file); } else { fputs (dstr->str, stdout); } dstring_delete (dstr); }