aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/code.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/code.c')
-rw-r--r--sys/cmd/rc/code.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/cmd/rc/code.c b/sys/cmd/rc/code.c
index 38cc06a..c5b1987 100644
--- a/sys/cmd/rc/code.c
+++ b/sys/cmd/rc/code.c
@@ -43,7 +43,7 @@ void
walk(Tree *node)
{
Tree *n;
- int addr;
+ int addr1, addr2;
if(!node)
return;
@@ -104,18 +104,18 @@ walk(Tree *node)
case '&':
emitf(Xasync);
- addr = emiti(0);
+ addr1 = emiti(0);
walk(node->child[0]);
emitf(Xexit);
- storepc(addr);
+ storepc(addr1);
break;
case Tsubshell:
emitf(Xsubshell);
- addr = emiti(0);
+ addr1 = emiti(0);
walk(node->child[0]);
emitf(Xexit);
- storepc(addr);
+ storepc(addr1);
break;
case Tbang:
@@ -132,6 +132,26 @@ walk(Tree *node)
walk(node->child[0]);
break;
+ case Tpipe:
+ emitf(Xpipe);
+
+ emiti(node->redir.fd[0]);
+ emiti(node->redir.fd[1]);
+ addr1 = emiti(0);
+ addr2 = emiti(0);
+
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+
+ walk(node->child[1]);
+ emitf(Xreturn);
+ storepc(addr2);
+
+ emitf(Xpipewait);
+
+ break;
+
case '=':
for(n=node; node && node->type == '='; node = node->child[2])
;