diff options
| author | Nakidai <nakidai@disroot.org> | 2026-04-05 19:51:14 +0300 |
|---|---|---|
| committer | Nakidai <nakidai@disroot.org> | 2026-04-05 20:01:32 +0300 |
| commit | 8afa976e073c7bc29c878230eead6dddfdcc08a1 (patch) | |
| tree | 044b8ddf87b9a3c8b5a229b27e84e870468fb950 /vertex.c | |
| download | thac-8afa976e073c7bc29c878230eead6dddfdcc08a1.tar.gz thac-8afa976e073c7bc29c878230eead6dddfdcc08a1.zip | |
Add code v0.1.0
Diffstat (limited to 'vertex.c')
| -rw-r--r-- | vertex.c | 100 |
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'); + } +} |