diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-10-21 13:28:25 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-10-21 13:28:25 -0700 |
commit | da77d3be2eb0785bc0c0b60c686e163d6243c744 (patch) | |
tree | 75f15d89c1517bf0ba82128753fd0f6c4d3d2447 /sys/cmd/rc/code.c | |
parent | 65193a54609c558e473118dba323edc001bdb585 (diff) |
feat(rc): added andand and oror operators
Diffstat (limited to 'sys/cmd/rc/code.c')
-rw-r--r-- | sys/cmd/rc/code.c | 89 |
1 files changed, 53 insertions, 36 deletions
diff --git a/sys/cmd/rc/code.c b/sys/cmd/rc/code.c index 46873ef..bcc3d38 100644 --- a/sys/cmd/rc/code.c +++ b/sys/cmd/rc/code.c @@ -85,35 +85,35 @@ walk(Tree *node) emitf(Xconcatenate); break; - case Targs: - walk(node->child[1]); + case Tandand: walk(node->child[0]); + emitf(Xtrue); + addr1 = emiti(0); + walk(node->child[1]); + storepc(addr1); break; - case Tparen: case Tblock: + case Toror: walk(node->child[0]); + emitf(Xfalse); + addr1 = emiti(0); + walk(node->child[1]); + storepc(addr1); break; - case Tbasic: - emitf(Xmark); + case Targs: + walk(node->child[1]); walk(node->child[0]); - emitf(Xbasic); break; - case '&': - emitf(Xasync); - addr1 = emiti(0); + case Tparen: case Tblock: walk(node->child[0]); - emitf(Xexit); - storepc(addr1); break; - case Tsubshell: - emitf(Xsubshell); - addr1 = emiti(0); + case Tbasic: + emitf(Xmark); walk(node->child[0]); - emitf(Xexit); - storepc(addr1); + emitf(Xbasic); break; case Tbang: @@ -130,26 +130,6 @@ 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]) ; @@ -175,6 +155,43 @@ walk(Tree *node) } node = n; break; + + /* forks */ + case '&': + emitf(Xasync); + addr1 = emiti(0); + walk(node->child[0]); + emitf(Xexit); + storepc(addr1); + break; + + case Tsubshell: + emitf(Xsubshell); + addr1 = emiti(0); + walk(node->child[0]); + emitf(Xexit); + storepc(addr1); + 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; } } |