From 955516759cfed29122439938632964fed4f8a347 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sat, 20 Jun 2020 11:30:56 -0700 Subject: feat: file globbing in shell. added dynamic.mk --- sys/cmd/rc/code.c | 165 ++++++++++++++++++++++++------------------------------ 1 file changed, 72 insertions(+), 93 deletions(-) (limited to 'sys/cmd/rc/code.c') 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; -- cgit v1.2.1