aboutsummaryrefslogtreecommitdiffstats
path: root/src/nodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nodes.c')
-rw-r--r--src/nodes.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/nodes.c b/src/nodes.c
new file mode 100644
index 0000000..63e9b1f
--- /dev/null
+++ b/src/nodes.c
@@ -0,0 +1,61 @@
1#include "nodes.h"
2
3Node *
4alloc_node(NodeType type) {
5 // TODO: Use a bump allocator?
6 // TODO: Free memory!
7 Node *node = malloc(sizeof(Node));
8 node->type = type;
9 return node;
10}
11
12void
13print_node(Node *node) {
14 switch (node->type) {
15 case NODE_NUMBER: {
16 if (node->number.negative) {
17 printf("-");
18 }
19 if (node->number.fractional != 0) {
20 printf("%zu.%zu", node->number.integral, node->number.fractional);
21 } else {
22 printf("%zu", node->number.integral);
23 }
24 } break;
25 case NODE_SYMBOL:
26 case NODE_STRING: {
27 sv_write(&node->string);
28 } break;
29 case NODE_BOOL: {
30 if (node->boolean) {
31 printf("true");
32 } else {
33 printf("false");
34 }
35 } break;
36 case NODE_BUILTIN: {
37 printf("({%s}", token_str[node->builtin.type]);
38 size_t n_args = array_size(node->builtin.args);
39 if (n_args != 0) {
40 printf(" ");
41 }
42 for (size_t i = 0; i < n_args; ++i) {
43 print_node(node->builtin.args[i]);
44 if (i < n_args - 1) {
45 printf(" ");
46 }
47 }
48 printf(")");
49 } break;
50 case NODE_DEF: {
51 printf("(def ");
52 print_node(node->def.symbol);
53 printf(":");
54 sv_write(&node->def.type);
55 printf(" ");
56 print_node(node->def.value);
57 printf(")");
58 } break;
59 default: { printf("{#unknown#}"); } break;
60 }
61}