aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/code.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rc/code.c')
-rw-r--r--src/cmd/rc/code.c38
1 files changed, 35 insertions, 3 deletions
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);