diff options
author | Nicholas <nbnoll@eml.cc> | 2021-11-12 09:22:01 -0800 |
---|---|---|
committer | Nicholas <nbnoll@eml.cc> | 2021-11-12 09:22:01 -0800 |
commit | ce05175372a9ddca1a225db0765ace1127a39293 (patch) | |
tree | 5988b4d4f6b402e4953945886fc90aae11203df6 /src/cmd/rc/tree.c | |
parent | b375f3cdedb5b0e08745d100b40e38d2f8396a58 (diff) |
chore: simplified organizational structurelaptop
Diffstat (limited to 'src/cmd/rc/tree.c')
-rw-r--r-- | src/cmd/rc/tree.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/cmd/rc/tree.c b/src/cmd/rc/tree.c new file mode 100644 index 0000000..2c65041 --- /dev/null +++ b/src/cmd/rc/tree.c @@ -0,0 +1,111 @@ +#include "rc.h" +#include "parse.h" + +static Tree *nodes; + +Tree* +maketree(void) +{ + Tree *node = emalloc(sizeof(*node)); + + node->link = nodes; + nodes = node; + return node; +} + +void +freeparsetree(void) +{ + Tree *t, *nt; + for(t = nodes; t; t = nt) { + nt = t->link; + if(t->type == Tword && t->str) + efree(t->str); + efree(t); + } + nodes = nil; +} + +Tree* +maketree1(int type, Tree *c0) +{ + return maketree2(type, c0, nil); +} + +Tree* +maketree2(int type, Tree *c0, Tree *c1) +{ + return maketree3(type, c0, c1, nil); +} + +Tree* +maketree3(int type, Tree *c0, Tree *c1, Tree *c2) +{ + Tree *node = maketree(); + + node->type = type; + node->child[0] = c0; + node->child[1] = c1; + node->child[2] = c2; + + return node; +} + +Tree* +hangchild1(Tree *node, Tree *c, int i) +{ + node->child[i] = c; + + return node; +} + +Tree* +hangchild2(Tree *node, Tree *c1, int i1, Tree *c2, int i2) +{ + node->child[i1] = c1; + node->child[i2] = c2; + + return node; +} + +Tree* +hangchild3(Tree *node, Tree *c0, Tree *c1, Tree *c2) +{ + node->child[0] = c0; + node->child[1] = c1; + node->child[2] = c2; + + return node; +} + +Tree* +hangepilog(Tree *cmd, Tree *epi) +{ + Tree *p; + if(!epi) + return cmd; + for(p = epi; p->child[1]; p = p->child[1]) + ; + + p->child[1] = cmd; + return epi; +} + +Tree* +token(int type, char *s) +{ + Tree *node = maketree(); + + node->type = type; + node->str = strdup(s); + + return node; +} + +/* +Tree* +basic(Tree *node) +{ + return maketree1(Tbasic, node); +} +*/ |