summaryrefslogtreecommitdiff
path: root/stmt.c
blob: 97cbe7084aec6e03140537ee9388f5ff7142691f (plain) (blame)
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
#include "stmt.h"
#include "call.h"
#include "fn.h"
#include "parse.h"
#include "prv.h"
#include "display.h"
#include "exit.h"
#include "set.h"

void stmt_free(struct stmt *s)
{
    switch (s->type)
    {
    case DISPLAY:
        display_free(&s->u.display);
        break;
    case SET:
        set_free(&s->u.set);
        break;
    case CALL:
        call_free(&s->u.call);
        break;
    }
}

int stmt_cgen(const struct stmt *s, struct cgen *c)
{
    switch (s->type)
    {
    case DISPLAY:
        return display_cgen(&s->u.display, c);
    case SET:
        return set_cgen(&s->u.set, c);
    case CALL:
        return call_cgen(&s->u.call, c);
    }

    fprintf(stderr, "%s: unreachable\n", __func__);
    return -1;
}

struct stmt *stmt_cur(const struct prv *p)
{
    const struct fn *fn = fn_cur(p);

    return &fn->stmts[fn->nstmts - 1];
}

const struct seq stmts[] =
{
    {(const struct step[]){
        {ID, "display"}, {ANY, NULL, 1}, {ID, "etc"}, {0}}, .fn = display},
    {(const struct step[])
        {{ID, "display"}, {ANY, NULL, 1}, {0}}, .fn = display},
    {(const struct step[]){{ID, "exit"}, {0}}, .fn = s_exit},
    {(const struct step[]){{ID, "set"}, {0}}, .fn = set},
    {(const struct step[]){{ID, "call"}, {0}}, .fn = call},
    {0}
};