aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/code.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-06-20 11:30:56 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-06-20 11:30:56 -0700
commit955516759cfed29122439938632964fed4f8a347 (patch)
tree6cc0c6300e2b3d5b4e0c08103ecd9c9e939bc1c8 /sys/cmd/rc/code.c
parent91c673b37782d4cd90e5cf9a8e4491723e6c04bf (diff)
feat: file globbing in shell. added dynamic.mk
Diffstat (limited to 'sys/cmd/rc/code.c')
-rw-r--r--sys/cmd/rc/code.c165
1 files changed, 72 insertions, 93 deletions
diff --git a/sys/cmd/rc/code.c b/sys/cmd/rc/code.c
index 9aa1037..edf47cf 100644
--- a/sys/cmd/rc/code.c
+++ b/sys/cmd/rc/code.c
@@ -5,9 +5,9 @@
#define c1 t->child[1]
#define c2 t->child[2]
-#define emitf(x) ((code.ip!=code.end || morecode()), code.ip++->f = (x))
-#define emiti(x) ((code.ip!=code.end || morecode()), code.ip++->i = (x))
-#define emits(x) ((code.ip!=code.end || morecode()), code.ip++->s = (x))
+#define emitf(x) ((code.ip!=code.end || morecode()), code.ip++->f = (x), code.ip)
+#define emiti(x) ((code.ip!=code.end || morecode()), code.ip++->i = (x), code.ip)
+#define emits(x) ((code.ip!=code.end || morecode()), code.ip++->s = (x), code.ip)
static struct
{
@@ -53,15 +53,15 @@ rcc(Tree *t, int eflag)
default:
pfmt(errio, "bad type %d in rc compiler\n", t->type);
break;
- case '$':
+ case Tdol:
emitf(Xmark);
rcc(c0, eflag);
emitf(Xdol);
break;
- case '"':
+ case Tquote:
emitf(Xmark);
rcc(c0, eflag);
- emitf(Xqdol);
+ emitf(Xflatten);
break;
case Tsub:
emitf(Xmark);
@@ -70,36 +70,30 @@ rcc(Tree *t, int eflag)
rcc(c1, eflag);
emitf(Xsub);
break;
- case '&':
+ case Tand:
emitf(Xasync);
- if(havefork){
- p = emiti(0);
- rcc(c0, eflag);
- emitf(Xexit);
- stuffdot(p);
- } else
- emits(fnstr(c0));
+ p = emiti(0);
+ rcc(c0, eflag);
+ emitf(Xexit);
+ stuffdot(p);
break;
- case ';':
+ case Tsemi:
rcc(c0, eflag);
rcc(c1, eflag);
break;
- case '^':
+ case Tcarot:
emitf(Xmark);
rcc(c1, eflag);
emitf(Xmark);
rcc(c0, eflag);
- emitf(Xconc);
+ emitf(Xcat);
break;
- case '`':
- emitf(Xbackq);
- if(havefork){
- p = emiti(0);
- rcc(c0, 0);
- emitf(Xexit);
- stuffdot(p);
- } else
- emits(fnstr(c0));
+ case Ttick:
+ emitf(Xcmdsub);
+ p = emiti(0);
+ rcc(c0, 0);
+ emitf(Xexit);
+ stuffdot(p);
break;
case Tandand:
rcc(c0, 0);
@@ -114,7 +108,7 @@ rcc(Tree *t, int eflag)
break;
case Tbang:
rcc(c0, eflag);
- emitf(Xbang);
+ emitf(Xnegate);
break;
case Tparen:
case Tbrace:
@@ -129,33 +123,32 @@ rcc(Tree *t, int eflag)
emitf(Xmark);
rcc(c0, eflag);
if(c1){
- emitf(Xfn);
+ emitf(Xfunc);
p = emiti(0);
emits(fnstr(c1));
rcc(c1, eflag);
emitf(Xunlocal); /* get rid of $* */
- emitf(Xreturn);
+ emitf(Xkill);
stuffdot(p);
- }
- else
- emitf(Xdelfn);
+ } else
+ emitf(Xunfunc);
break;
case Tif:
rcc(c0, 0);
emitf(Xif);
p = emiti(0);
rcc(c1, eflag);
- emitf(Xwastrue);
- stuffdot(p);
- break;
- case Telse:
- if(!runq->iflast)
- error("`else' does not follow `if(...)'");
- emitf(Xelse);
- p = emiti(0);
- rcc(c0, eflag);
+ // emitf(Xwastrue);
stuffdot(p);
break;
+ // case Telse:
+ // if(!runq->iflast)
+ // rcerror("`else' does not follow `if(...)'");
+ // emitf(Xelse);
+ // p = emiti(0);
+ // rcc(c0, eflag);
+ // stuffdot(p);
+ // break;
case Toror:
rcc(c0, 0);
emitf(Xfalse);
@@ -163,7 +156,7 @@ rcc(Tree *t, int eflag)
rcc(c1, eflag);
stuffdot(p);
break;
- case Tparen:
+ case Tpcmd:
rcc(c0, eflag);
break;
case Tsimple:
@@ -175,13 +168,10 @@ rcc(Tree *t, int eflag)
break;
case Tsubshell:
emitf(Xsubshell);
- if(havefork){
- p = emiti(0);
- rcc(c0, eflag);
- emitf(Xexit);
- stuffdot(p);
- } else
- emits(fnstr(c0));
+ p = emiti(0);
+ rcc(c0, eflag);
+ emitf(Xexit);
+ stuffdot(p);
if(eflag)
emitf(Xeflag);
break;
@@ -197,7 +187,7 @@ rcc(Tree *t, int eflag)
if(eflag)
emitf(Xeflag);
break;
- case Kwhile:
+ case Twhile:
q = code.ip;
rcc(c0, 0);
if(q==code.ip)
@@ -206,7 +196,7 @@ rcc(Tree *t, int eflag)
p = emiti(0);
rcc(c1, eflag);
emitf(Xjump);
- emiti(q);
+ emiti(q-code.buf);
stuffdot(p);
break;
case Twords:
@@ -218,8 +208,7 @@ rcc(Tree *t, int eflag)
if(c1){
rcc(c1, eflag);
emitf(Xglob);
- }
- else{
+ } else{
emitf(Xmark);
emitf(Xword);
emits(strdup("*"));
@@ -242,35 +231,30 @@ rcc(Tree *t, int eflag)
emits(strdup(t->str));
break;
case Tdup:
- if(t->rtype==Tdupfd){
+ if(t->redir.type == Rdupfd){
emitf(Xdup);
- emiti(t->fd0);
- emiti(t->fd1);
- }
- else{
+ emiti(t->redir.fd[0]);
+ emiti(t->redir.fd[1]);
+ } else{
emitf(Xclose);
- emiti(t->fd0);
+ emiti(t->redir.fd[0]);
}
rcc(c1, eflag);
emitf(Xpopredir);
break;
case Tpipefd:
emitf(Xpipefd);
- emiti(t->rtype);
- if(havefork){
- p = emiti(0);
- rcc(c0, eflag);
- emitf(Xexit);
- stuffdot(p);
- } else {
- emits(fnstr(c0));
- }
+ emiti(t->redir.type);
+ p = emiti(0);
+ rcc(c0, eflag);
+ emitf(Xexit);
+ stuffdot(p);
break;
case Tredir:
emitf(Xmark);
rcc(c0, eflag);
emitf(Xglob);
- switch(t->rtype){
+ switch(t->redir.type){
case Rappend:
emitf(Xappend);
break;
@@ -285,15 +269,15 @@ rcc(Tree *t, int eflag)
emitf(Xrdwr);
break;
}
- emiti(t->fd0);
+ emiti(t->redir.fd[0]);
rcc(c1, eflag);
emitf(Xpopredir);
break;
- case '=':
+ case Teq:
tt = t;
- for(;t && t->type=='=';t = c2);
+ for(;t && t->type==Teq;t = c2);
if(t){
- for(t = tt;t->type=='=';t = c2){
+ for(t = tt;t->type==Teq;t = c2){
emitf(Xmark);
rcc(c1, eflag);
emitf(Xmark);
@@ -301,10 +285,9 @@ rcc(Tree *t, int eflag)
emitf(Xlocal);
}
rcc(t, eflag);
- for(t = tt; t->type=='='; t = c2)
+ for(t = tt; t->type==Teq; t = c2)
emitf(Xunlocal);
- }
- else{
+ } else{
for(t = tt;t;t = c2){
emitf(Xmark);
rcc(c1, eflag);
@@ -317,27 +300,23 @@ rcc(Tree *t, int eflag)
break;
case Tpipe:
emitf(Xpipe);
- emiti(t->fd0);
- emiti(t->fd1);
- if(havefork){
- p = emiti(0);
- q = emiti(0);
- rcc(c0, eflag);
- emitf(Xexit);
- stuffdot(p);
- } else {
- emits(fnstr(c0));
- q = emiti(0);
- }
+ emiti(t->redir.fd[0]);
+ emiti(t->redir.fd[1]);
+ p = emiti(0);
+ q = emiti(0);
+ rcc(c0, eflag);
+ emitf(Xexit);
+ stuffdot(p);
rcc(c1, eflag);
- emitf(Xreturn);
+ emitf(Xkill);
stuffdot(q);
emitf(Xpipewait);
break;
}
- if(t->type!=Telse && t->type!=';')
- runq->iflast = t->type==IF;
- else if(c0) runq->iflast = c0->type==IF;
+ if(t->type!=Telse && t->type!=Tsemi)
+ shell->iflast = t->type==Tif;
+ else if (c0)
+ shell->iflast = c0->type==Tif;
}
Code*
@@ -349,7 +328,7 @@ compile(Tree *t)
emiti(0);
rcc(t, 0);
- emitf(Xreturn);
+ emitf(Xkill);
emitf(nil);
return code.buf;