aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/tree.c')
-rw-r--r--sys/cmd/rc/tree.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/cmd/rc/tree.c b/sys/cmd/rc/tree.c
index 0e2146f..0f7378f 100644
--- a/sys/cmd/rc/tree.c
+++ b/sys/cmd/rc/tree.c
@@ -19,7 +19,7 @@ freeparsetree(void)
Tree *t, *nt;
for(t = nodes; t; t = nt) {
nt = t->link;
- if(t->str)
+ if(t->type == Tword && t->str)
efree(t->str);
efree(t);
}
@@ -60,6 +60,28 @@ hangchild1(Tree *node, Tree *c, int i)
}
Tree*
+hangchild2(Tree *node, Tree *c1, int i1, Tree *c2, int i2)
+{
+ node->child[i1] = c1;
+ node->child[i2] = 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();