aboutsummaryrefslogtreecommitdiffstats
path: root/src/nodes.c
blob: 63e9b1f7682fdbe41fdb723d3710b037e767b4d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "nodes.h"

Node *
alloc_node(NodeType type) {
    // TODO: Use a bump allocator?
    // TODO: Free memory!
    Node *node = malloc(sizeof(Node));
    node->type = type;
    return node;
}

void
print_node(Node *node) {
    switch (node->type) {
        case NODE_NUMBER: {
            if (node->number.negative) {
                printf("-");
            }
            if (node->number.fractional != 0) {
                printf("%zu.%zu", node->number.integral, node->number.fractional);
            } else {
                printf("%zu", node->number.integral);
            }
        } break;
        case NODE_SYMBOL:
        case NODE_STRING: {
            sv_write(&node->string);
        } break;
        case NODE_BOOL: {
            if (node->boolean) {
                printf("true");
            } else {
                printf("false");
            }
        } break;
        case NODE_BUILTIN: {
            printf("({%s}", token_str[node->builtin.type]);
            size_t n_args = array_size(node->builtin.args);
            if (n_args != 0) {
                printf(" ");
            }
            for (size_t i = 0; i < n_args; ++i) {
                print_node(node->builtin.args[i]);
                if (i < n_args - 1) {
                    printf(" ");
                }
            }
            printf(")");
        } break;
        case NODE_DEF: {
            printf("(def ");
            print_node(node->def.symbol);
            printf(":");
            sv_write(&node->def.type);
            printf(" ");
            print_node(node->def.value);
            printf(")");
        } break;
        default: { printf("{#unknown#}"); } break;
    }
}