about summary refs log tree commit diff
path: root/vertex.c
diff options
context:
space:
mode:
Diffstat (limited to 'vertex.c')
-rw-r--r--vertex.c100
1 files changed, 100 insertions, 0 deletions
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 <nakidai at disroot dot org>
+ *
+ * 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 <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/* 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');
+	}
+}