code_analyzer/src/matcom.c

90 lines
1.5 KiB
C

#include "matcom.h"
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
graph_mco mcgragh(void)
{
graph_mco g;
g.nbs = -1;
g.nba = -1;
g.func = malloc((g.fcap = 10) * sizeof(fix_str));
assert(g.func);
g.vec = malloc((g.vcap = 10) * sizeof(struct edge));
assert(g.vec);
return g;
}
void mcinsert_func(graph_mco *g, fix_str i)
{
++g->nbs;
if (g->nbs == g->fcap) {
g->func = reallocarray(g->func, (g->fcap += 128), sizeof(fix_str));
assert(g->func);
}
strcpy(g->func[g->nbs], i);
}
void mcinsert_edge(graph_mco *g, int dep, int arr)
{
struct edge e;
++g->nba;
if (g->nba == g->vcap) {
g->vec = reallocarray(g->vec, (g->vcap += 128), sizeof(struct edge));
assert(g->vec);
}
e.i = dep;
if (arr == -1)
e.j = g->nbs;
else
e.j = arr;
g->vec[g->nba] = e;
}
void mcdelete_graph(graph_mco *g)
{
if (g->func)
free(g->func);
if (g->vec)
free(g->vec);
g->func = NULL;
g->vec = NULL;
}
int mcis_in(graph_mco g, fix_str func)
{
int i;
if (g.nba == 0)
return -1;
for (i = 0; i <= g.nba; i++) {
if (strcmp(g.func[i], func) == 0) {
return i;
}
}
return -1;
}
static void mcprint_succ(graph_mco g, int succ)
{
printf(" Succ: %s\n", g.func[succ]);
}
void mcprint_edges(graph_mco g, int n)
{
int i;
printf("NODE %d: %s\n", n, g.func[n]);
for (i = 0; i <= g.nba; ++i) {
if (g.vec[i].i == n) {
mcprint_succ(g, g.vec[i].j);
}
}
for (i = 0; i <= g.nba; ++i) {
if (g.vec[i].i == n) {
if (g.vec[g.vec[i].j].i != -1)
mcprint_edges(g, g.vec[g.vec[i].j].i);
}
}
}