From 8afa976e073c7bc29c878230eead6dddfdcc08a1 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Sun, 5 Apr 2026 19:51:14 +0300 Subject: Add code --- vertex.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 vertex.c (limited to 'vertex.c') diff --git a/vertex.c b/vertex.c new file mode 100644 index 0000000..b8290b1 --- /dev/null +++ b/vertex.c @@ -0,0 +1,100 @@ +/* + * 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'); + } +} -- cgit 1.4.1