#include "vec.h" #include #include #include #include nodept new_node(int num) { struct node *n = malloc(sizeof(nodept)); assert(n); // n->succ = malloc((n->cap = 8) * sizeof(nodept)); // assert(n->succ); n->num = num; n->nbs = 0; return n; } void delete_node(struct node *n) { int i; // for (i = 0; i < n->nbs; i++) { // free(n->succ[i]); // } // free(n->succ); } void insert_succ(graph_vec *g, int i, int i1, fix_str str) { if (g->node[i]->nbs == g->node[i]->cap) g->node[i]->succ = reallocarray(g->node[i]->succ, (g->node[i]->cap += 5), sizeof(nodept)); struct node *n = malloc(sizeof(struct node)); n->num = i; n->nbs = 0; strcpy(n->func, str); g->node[i]->succ[i1] = n; g->node[i]->nbs++; } graph_vec new_graph(int cap) { graph_vec g; g.n = -1; g.cap = cap; // g.func = calloc(cap, sizeof(fix_str)); // g.node = calloc(cap, sizeof(nodept)); return g; } void insert_node(graph_vec *g, fix_str str) { ++g->n; struct node *n = malloc(sizeof(struct node)); n->num = g->n; n->nbs = 0; n->cap = 5; n->succ = malloc(5 * sizeof(nodept)); strcpy(n->func, str); g->node[g->n] = n; } void delete_graph(graph_vec *g) { int i, j; for (i = 0; i <= g->n; ++i) { if (g->node[i]) { if (g->node[i]->succ) { free(g->node[i]->succ); g->node[i]->succ = NULL; } free(g->node[i]); g->node[i] = NULL; } } } int is_in(graph_vec g, fix_str func) { int i; for (i = 0; i < g.n; ++i) { if (strcmp(g.node[i]->func, func) == 0) return i; } return 0; } void print_node(nodept node) { int i; printf("NODE: %s\n", node->func); for (i = 0; i < node->nbs; ++i) { printf("SUCC: %s\n", node->succ[i]->func); } for (i = 0; i < node->nbs; ++i) { if (node->succ[i] != node && node->succ[i]->nbs != 0) print_node(node->succ[i]); } } // fprintf(fp, "\t%s -> %s;\n", node->func, node->succ[i]->func); void write_node_dot(FILE *fp, nodept node) { int i; for (i = 0; i < node->nbs; ++i) { fprintf(fp, "\t%s -> %s;\n", node->func, node->succ[i]->func); } for (i = 0; i < node->nbs; ++i) { if (node->succ[i] != node && node->succ[i]->nbs != 0) write_node_dot(fp, node->succ[i]); } } void dot_graph(nodept node) { FILE *fp; int i; fp = fopen("graph.dot", "w"); fprintf(fp, "digraph main {\n"); write_node_dot(fp, node); // for (i = 0; i < node->nbs; ++i) { // fprintf(fp, "\t%s -> %s;\n", node->func, node->succ[i]->func); // } // for (i = 0; i < node->nbs; ++i) { // if (node->succ[i] != node && node->succ[i]->nbs != 0) { // write_node_dot(fp, node->succ[i]); // fprintf(fp, "\n\t%s ", node->succ[i]->func); // // for (int j = 0; j < node->succ[i]->nbs; ++j) { // fprintf(fp, "-> %s ", node->succ[i]->succ[j]->func); // } // // fprintf(fp, ";\n"); // } // } fprintf(fp, "}"); fclose(fp); }