void dot_node (node* n, FILE* out) { if (!n) { puts("called dot_node with null"); return; } if (!(n->left_sibling)) { puts("n has null for left sibling!"); return; } if (!(n->right_sibling)) { puts("n has null for right sibling!"); return; } node* curr = n; do { fprintf(out, "%s -> %s\n", curr->name, curr->right_sibling->name); fprintf(out, "%s -> %s\n", curr->name, curr->left_sibling->name); if (curr->child) { dot_node(curr->child, out); fprintf(out, "%s -> %s [color=\"red\"]\n", curr->name, curr->child->name); } if (curr->parent) fprintf(out, "%s -> %s [color=\"blue\"]\n", curr->name, curr->parent->name); curr = curr->left_sibling; } while (curr != n); }
dot_node &dot_visitor::create_node() { node_list.push_back(dot_node(node_list.size())); dot_node &node = node_list.back(); if(prev_id != dot_edge::INVALID) { edge_list.push_back(dot_edge(prev_id, node.id, next_edge_label)); next_edge_label = ""; } return node; }
void to_dot (node* n, char* filename) { FILE * out_file = fopen(filename, "w"); counter = 0; if (out_file == NULL) { fprintf(stderr, "Error, couldn't open file: %s!", filename); return; } node* curr = n; while (curr->parent != NULL) curr = curr->parent; fprintf(out_file, "digraph {\n"); node_name(curr, out_file); dot_node(curr, out_file); fprintf(out_file, "}\n"); fclose(out_file); }