From da77d3be2eb0785bc0c0b60c686e163d6243c744 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 21 Oct 2021 13:28:25 -0700 Subject: feat(rc): added andand and oror operators --- sys/cmd/rc/code.c | 89 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 36 deletions(-) (limited to 'sys/cmd/rc/code.c') 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; } } -- cgit v1.2.1