From f2efbb46ef89c7c1693400f7209113c50c959f02 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 13 Oct 2021 10:51:54 -0700 Subject: Feat(rc): working(ish) version of rc shell Removed compile commands --- sys/cmd/rc/exec.c | 137 +++++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 69 deletions(-) (limited to 'sys/cmd/rc/exec.c') diff --git a/sys/cmd/rc/exec.c b/sys/cmd/rc/exec.c index 15d1cdf..fdb63cf 100644 --- a/sys/cmd/rc/exec.c +++ b/sys/cmd/rc/exec.c @@ -12,21 +12,20 @@ int lastc; int kidpid; int mypid; -thread *runq; -code *codebuf; /* compiler output */ -int ntrap; /* number of outstanding traps */ -int trap[NSIG]; /* number of outstanding traps per type */ - -int eflagok; /* kludge flag so that -e doesn't exit in startup */ +Thread *runq; +Code *codebuf; /* compiler output */ +int ntrap; /* number of outstanding traps */ +int trap[NSIG]; /* number of outstanding traps per type */ +int eflagok; /* kludge flag so that -e doesn't exit in startup */ char **argp; char **args; -int nerror; /* number of errors encountered during compilation */ +int nerror; /* number of errors encountered during compilation */ void -start(code *c, int pc, var *local) +start(Code *c, int pc, Var *local) { - struct thread *p = new(struct thread); + struct Thread *p = new(struct Thread); p->code = codecopy(c); p->pc = pc; @@ -42,10 +41,10 @@ start(code *c, int pc, var *local) runq = p; } -word* -newword(char *wd, word *next) +Word* +newword(char *wd, Word *next) { - word *p = new(word); + Word *p = new(Word); p->word = strdup(wd); p->next = next; return p; @@ -62,7 +61,7 @@ pushword(char *wd) void popword(void) { - word *p; + Word *p; if(runq->argv==0) panic("popword but no argv!", 0); p = runq->argv->words; @@ -74,9 +73,9 @@ popword(void) } void -freelist(word *w) +freelist(Word *w) { - word *nw; + Word *nw; while(w){ nw = w->next; efree(w->word); @@ -88,7 +87,7 @@ freelist(word *w) void pushlist(void) { - list *p = new(list); + Words *p = new(Words); p->next = runq->argv; p->words = 0; runq->argv = p; @@ -97,7 +96,7 @@ pushlist(void) void poplist(void) { - list *p = runq->argv; + Words *p = runq->argv; if(p==0) panic("poplist but no argv", 0); freelist(p->words); @@ -106,7 +105,7 @@ poplist(void) } int -count(word *w) +count(Word *w) { int n; for(n = 0;w;n++) w = w->next; @@ -116,7 +115,7 @@ count(word *w) void pushredir(int type, int from, int to) { - redir * rp = new(redir); + Redir * rp = new(Redir); rp->type = type; rp->from = from; rp->to = to; @@ -124,10 +123,10 @@ pushredir(int type, int from, int to) runq->redir = rp; } -var* -newvar(char *name, var *next) +Var* +newvar(char *name, Var *next) { - var *v = new(var); + Var *v = new(Var); v->name = name; v->val = 0; v->fn = 0; @@ -147,7 +146,7 @@ newvar(char *name, var *next) int main(int argc, char *argv[]) { - code bootstrap[32]; + Code bootstrap[32]; char num[12], *rcmain; int i; @@ -166,10 +165,10 @@ main(int argc, char *argv[]) Vinit(); inttoascii(num, mypid = getpid()); pathinit(); - setvar("pid", newword(num, (word *)0)); - setvar("cflag", flag['c']?newword(flag['c'][0], (word *)0) - :(word *)0); - setvar("rcname", newword(argv[0], (word *)0)); + setvar("pid", newword(num, (Word *)0)); + setvar("cflag", flag['c']?newword(flag['c'][0], (Word *)0) + :(Word *)0); + setvar("rcname", newword(argv[0], (Word *)0)); i = 0; memset(bootstrap, 0, sizeof bootstrap); bootstrap[i++].i = 1; @@ -189,7 +188,7 @@ main(int argc, char *argv[]) bootstrap[i++].f = Xsimple; bootstrap[i++].f = Xexit; bootstrap[i].i = 0; - start(bootstrap, 1, (var *)0); + start(bootstrap, 1, (Var *)0); /* prime bootstrap argv */ pushlist(); argv0 = strdup(argv[0]); @@ -313,8 +312,8 @@ Xeflag(void) void Xexit(void) { - struct var *trapreq; - struct word *starval; + struct Var *trapreq; + struct Word *starval; static int beenhere = 0; if(getpid()==mypid && !beenhere){ trapreq = vlook("sigexit"); @@ -322,9 +321,9 @@ Xexit(void) beenhere = 1; --runq->pc; starval = vlook("*")->val; - start(trapreq->fn, trapreq->pc, (struct var *)0); + start(trapreq->fn, trapreq->pc, (struct Var *)0); runq->local = newvar(strdup("*"), runq->local); - runq->local->val = copywords(starval, (struct word *)0); + runq->local->val = copywords(starval, (struct Word *)0); runq->local->changed = 1; runq->redir = runq->startredir = 0; return; @@ -431,7 +430,7 @@ turfredir(void) void Xpopredir(void) { - struct redir *rp = runq->redir; + struct Redir *rp = runq->redir; if(rp==0) panic("turfredir null!", 0); runq->redir = rp->next; @@ -443,7 +442,7 @@ Xpopredir(void) void Xreturn(void) { - struct thread *p = runq; + struct Thread *p = runq; turfredir(); while(p->argv) poplist(); codefree(p->code); @@ -507,11 +506,11 @@ Xwrite(void) } char* -list2str(word *words) +list2str(Word *words) { char *value, *s, *t; int len = 0; - word *ap; + Word *ap; for(ap = words;ap;ap = ap->next) len+=1+strlen(ap->word); value = emalloc(len+1); @@ -529,7 +528,7 @@ list2str(word *words) void Xmatch(void) { - word *p; + Word *p; char *subject; subject = list2str(runq->argv->words); setstatus("no match"); @@ -546,7 +545,7 @@ Xmatch(void) void Xcase(void) { - word *p; + Word *p; char *s; int ok = 0; s = list2str(runq->argv->next->words); @@ -564,11 +563,11 @@ Xcase(void) poplist(); } -word* -conclist(word *lp, word *rp, word *tail) +Word* +conclist(Word *lp, Word *rp, Word *tail) { char *buf; - word *v; + Word *v; if(lp->next || rp->next) tail = conclist(lp->next==0?lp:lp->next, rp->next==0?rp:rp->next, tail); @@ -583,9 +582,9 @@ conclist(word *lp, word *rp, word *tail) void Xconc(void) { - word *lp = runq->argv->words; - word *rp = runq->argv->next->words; - word *vp = runq->argv->next->next->words; + Word *lp = runq->argv->words; + Word *rp = runq->argv->next->words; + Word *vp = runq->argv->next->next->words; int lc = count(lp), rc = count(rp); if(lc!=0 || rc!=0){ if(lc==0 || rc==0){ @@ -606,7 +605,7 @@ Xconc(void) void Xassign(void) { - var *v; + Var *v; if(count(runq->argv->words)!=1){ Xerror1("variable name not singleton!"); return; @@ -627,10 +626,10 @@ Xassign(void) * copy arglist a, adding the copy to the front of tail */ -word* -copywords(word *a, word *tail) +Word* +copywords(Word *a, Word *tail) { - word *v = 0, **end; + Word *v = 0, **end; for(end=&v;a;a = a->next,end=&(*end)->next) *end = newword(a->word, 0); *end = tail; @@ -640,7 +639,7 @@ copywords(word *a, word *tail) void Xdol(void) { - word *a, *star; + Word *a, *star; char *s, *t; int n; if(count(runq->argv->words)!=1){ @@ -668,7 +667,7 @@ Xdol(void) void Xqdol(void) { - word *a, *p; + Word *a, *p; char *s; int n; if(count(runq->argv->words)!=1){ @@ -699,10 +698,10 @@ Xqdol(void) efree(s); } -word* -copynwords(word *a, word *tail, int n) +Word* +copynwords(Word *a, Word *tail, int n) { - word *v, **end; + Word *v, **end; v = 0; end = &v; @@ -715,8 +714,8 @@ copynwords(word *a, word *tail, int n) return v; } -word* -subwords(word *val, int len, word *sub, word *a) +Word* +subwords(Word *val, int len, Word *sub, Word *a) { int n, m; char *s; @@ -750,7 +749,7 @@ subwords(word *val, int len, word *sub, word *a) void Xsub(void) { - word *a, *v; + Word *a, *v; char *s; if(count(runq->argv->next->words)!=1){ Xerror1("variable name not singleton!"); @@ -769,7 +768,7 @@ Xsub(void) void Xcount(void) { - word *a; + Word *a; char *s, *t; int n; char num[12]; @@ -802,7 +801,7 @@ Xlocal(void) } deglob(runq->argv->words->word); runq->local = newvar(strdup(runq->argv->words->word), runq->local); - runq->local->val = copywords(runq->argv->next->words, (word *)0); + runq->local->val = copywords(runq->argv->next->words, (Word *)0); runq->local->changed = 1; poplist(); poplist(); @@ -811,7 +810,7 @@ Xlocal(void) void Xunlocal(void) { - var *v = runq->local, *hid; + Var *v = runq->local, *hid; if(v==0) panic("Xunlocal: no locals!", 0); runq->local = v->next; @@ -823,9 +822,9 @@ Xunlocal(void) } void -freewords(word *w) +freewords(Word *w) { - word *nw; + Word *nw; while(w){ efree(w->word); nw = w->next; @@ -837,8 +836,8 @@ freewords(word *w) void Xfn(void) { - var *v; - word *a; + Var *v; + Word *a; int end; end = runq->code[runq->pc].i; for(a = runq->argv->words;a;a = a->next){ @@ -856,8 +855,8 @@ Xfn(void) void Xdelfn(void) { - var *v; - word *a; + Var *v; + Word *a; for(a = runq->argv->words;a;a = a->next){ v = gvlook(a->word); if(v->fn) @@ -900,8 +899,8 @@ Xpipewait(void) void Xrdcmds(void) { - struct thread *p = runq; - word *prompt; + struct Thread *p = runq; + Word *prompt; flush(err); nerror = 0; if(flag['s'] && !truestatus()) @@ -964,13 +963,13 @@ Xerror1(char *s) void setstatus(char *s) { - setvar("status", newword(s, (word *)0)); + setvar("status", newword(s, (Word *)0)); } char* getstatus(void) { - var *status = vlook("status"); + Var *status = vlook("status"); return status->val?status->val->word:""; } -- cgit v1.2.1