code_analyzer/vec.c

140 lines
2.8 KiB
C

#include "vec.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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);
}