diff options
Diffstat (limited to 'sys/cmd/rc/code.c')
-rw-r--r-- | sys/cmd/rc/code.c | 30 |
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]) ; |