/* * Copyright (c) 2026 Nakidai Perumenei * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Unfortunately, the name "node" is already taken by the parser, so in * this compiler language nodes are called vertices */ #include "thac.h" #include #include #include /* TODO: add cap and increase like in lex.c */ static struct vertex *verts; static ulong len; ulong mkvert(void) { static struct vertex vert = {{NULL, 0}, {NULL, 0}}; verts = realloc(verts, sizeof(*verts) * ++len); if (!verts) dieno(1, "realloc()"); verts[len - 1] = vert; return len - 1; } void addprop(ulong i, vlong prop) { if (i < 0 || i >= len) complain(1, "addprop: how would you want this? (0<=%lld<%lld)", i, len); verts[i].props.arr = realloc( verts[i].props.arr, sizeof(*verts[i].props.arr) * ++verts[i].props.len ); if (!verts[i].props.arr) dieno(1, "realloc()"); verts[i].props.arr[verts[i].props.len - 1] = prop; } void addedge(ulong from, ulong to) { ulong i; if (from < 0 || from >= len) complain(1, "addedge: how would you want this? (0<=%lld<%lld)", from, len); if (to < 0 || to >= len) complain(1, "addedge: how would you want this? (0<=%lld<%lld)", from, len); for (i = 0; i < verts[from].nbrs.len; ++i) if (verts[from].nbrs.arr[i] == to) return; verts[from].nbrs.arr = realloc( verts[from].nbrs.arr, sizeof(*verts[from].nbrs.arr) * ++verts[from].nbrs.len ); if (!verts[from].nbrs.arr) dieno(1, "realloc()"); verts[from].nbrs.arr[verts[from].nbrs.len - 1] = to; } void showverts(void) { ulong i, j; for (i = 0; i < len; ++i) { for (j = 0; j < verts[i].props.len; ++j) printf("%lld ", verts[i].props.arr[j]); putchar('|'); for (j = 0; j < verts[i].nbrs.len; ++j) printf(" %lu", verts[i].nbrs.arr[j]); putchar('\n'); } }