From 29138fff8643194ec49cb79304d2a878d46c378b Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 16 Nov 2021 12:08:59 -0800 Subject: Feat: added heredocs Heredocs are simply strings written to tmp files. There was minimal bug testing here. Also, various bug fixes are included --- src/cmd/rc/code.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'src/cmd/rc/code.c') diff --git a/src/cmd/rc/code.c b/src/cmd/rc/code.c index 201ecc2..dd0e99c 100644 --- a/src/cmd/rc/code.c +++ b/src/cmd/rc/code.c @@ -51,8 +51,6 @@ funcstr(Tree *node) return v; } -void yyerror(const char *msg); - static void walk(Tree *node) { @@ -250,6 +248,7 @@ walk(Tree *node) goto emitcase; donecase: storepc(addr3); + emitf(Xunmark); break; case Ttwiddle: @@ -265,6 +264,7 @@ walk(Tree *node) walk(node->child[0]); if(addr1 == interpreter.i) // empty condition => while(true) emitf(Xsettrue); + emitf(Xnewpgid); emitf(Xtrue); addr2 = emiti(0); // goto end of loop @@ -278,7 +278,7 @@ walk(Tree *node) emitf(Xmark); if(node->child[1]){ // for( x in X ) walk(node->child[1]); - // emitf(Xglob) + emitf(Xglob); }else{ // for(X) emitf(Xmark); emitf(Xword); @@ -336,6 +336,30 @@ walk(Tree *node) emitf(Xpipewait); break; + +#if 0 + case Tpipefd: +#endif + + case Tredir: + emitf(Xmark); + walk(node->child[0]); + emitf(Xglob); + switch(node->redir.type){ + case Rappend: emitf(Xappend); break; + case Rwrite: emitf(Xwrite); break; + case Rread: /* fallthrough */ + case Rhere: emitf(Xread); break; + case Rrdwr: emitf(Xrdwr); break; + default: + print(shell.err, "bad redir type %d in interpreter walk\n", node->redir.type); + fatal("crashing\n"); + break; + } + emiti(node->redir.fd[0]); + walk(node->child[1]); + emitf(Xpopredir); + break; } } @@ -357,6 +381,13 @@ copycode(Code *c) return c; } +void +emitdelhere(char *name) +{ + emitf(Xdelhere); + emits(strdup(name)); +} + int compile(Tree *node) { @@ -368,6 +399,7 @@ compile(Tree *node) walk(node); + readhere(); emitf(Xreturn); emitf(nil); -- cgit v1.2.1