diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 1192 |
1 files changed, 593 insertions, 599 deletions
diff --git a/shell/ash.c b/shell/ash.c index bfaf04f..a4ce3ff 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -342,120 +342,120 @@ struct backcmd { /* result of evalbackcmd */ struct ncmd { - int type; - union node *assign; - union node *args; - union node *redirect; + int type; + union node *assign; + union node *args; + union node *redirect; }; struct npipe { - int type; - int backgnd; - struct nodelist *cmdlist; + int type; + int backgnd; + struct nodelist *cmdlist; }; struct nredir { - int type; - union node *n; - union node *redirect; + int type; + union node *n; + union node *redirect; }; struct nbinary { - int type; - union node *ch1; - union node *ch2; + int type; + union node *ch1; + union node *ch2; }; struct nif { - int type; - union node *test; - union node *ifpart; - union node *elsepart; + int type; + union node *test; + union node *ifpart; + union node *elsepart; }; struct nfor { - int type; - union node *args; - union node *body; - char *var; + int type; + union node *args; + union node *body; + char *var; }; struct ncase { - int type; - union node *expr; - union node *cases; + int type; + union node *expr; + union node *cases; }; struct nclist { - int type; - union node *next; - union node *pattern; - union node *body; + int type; + union node *next; + union node *pattern; + union node *body; }; struct narg { - int type; - union node *next; - char *text; - struct nodelist *backquote; + int type; + union node *next; + char *text; + struct nodelist *backquote; }; struct nfile { - int type; - union node *next; - int fd; - union node *fname; - char *expfname; + int type; + union node *next; + int fd; + union node *fname; + char *expfname; }; struct ndup { - int type; - union node *next; - int fd; - int dupfd; - union node *vname; + int type; + union node *next; + int fd; + int dupfd; + union node *vname; }; struct nhere { - int type; - union node *next; - int fd; - union node *doc; + int type; + union node *next; + int fd; + union node *doc; }; struct nnot { - int type; - union node *com; + int type; + union node *com; }; union node { - int type; - struct ncmd ncmd; - struct npipe npipe; - struct nredir nredir; - struct nbinary nbinary; - struct nif nif; - struct nfor nfor; - struct ncase ncase; - struct nclist nclist; - struct narg narg; - struct nfile nfile; - struct ndup ndup; - struct nhere nhere; - struct nnot nnot; + int type; + struct ncmd ncmd; + struct npipe npipe; + struct nredir nredir; + struct nbinary nbinary; + struct nif nif; + struct nfor nfor; + struct ncase ncase; + struct nclist nclist; + struct narg narg; + struct nfile nfile; + struct ndup ndup; + struct nhere nhere; + struct nnot nnot; }; @@ -732,7 +732,7 @@ static const char *tokname(int tok) * (assuming ascii char codes, as the original implementation did) */ #define is_special(c) \ - ( (((unsigned int)c) - 33 < 32) \ + ( (((unsigned int)c) - 33 < 32) \ && ((0xc1ff920dUL >> (((unsigned int)c) - 33)) & 1)) #define digit_val(c) ((c) - '0') @@ -1154,32 +1154,32 @@ static pointer funcblock; /* block to allocate function from */ static char *funcstring; /* block to allocate strings from */ static const short nodesize[26] = { - SHELL_ALIGN(sizeof (struct ncmd)), - SHELL_ALIGN(sizeof (struct npipe)), - SHELL_ALIGN(sizeof (struct nredir)), - SHELL_ALIGN(sizeof (struct nredir)), - SHELL_ALIGN(sizeof (struct nredir)), - SHELL_ALIGN(sizeof (struct nbinary)), - SHELL_ALIGN(sizeof (struct nbinary)), - SHELL_ALIGN(sizeof (struct nbinary)), - SHELL_ALIGN(sizeof (struct nif)), - SHELL_ALIGN(sizeof (struct nbinary)), - SHELL_ALIGN(sizeof (struct nbinary)), - SHELL_ALIGN(sizeof (struct nfor)), - SHELL_ALIGN(sizeof (struct ncase)), - SHELL_ALIGN(sizeof (struct nclist)), - SHELL_ALIGN(sizeof (struct narg)), - SHELL_ALIGN(sizeof (struct narg)), - SHELL_ALIGN(sizeof (struct nfile)), - SHELL_ALIGN(sizeof (struct nfile)), - SHELL_ALIGN(sizeof (struct nfile)), - SHELL_ALIGN(sizeof (struct nfile)), - SHELL_ALIGN(sizeof (struct nfile)), - SHELL_ALIGN(sizeof (struct ndup)), - SHELL_ALIGN(sizeof (struct ndup)), - SHELL_ALIGN(sizeof (struct nhere)), - SHELL_ALIGN(sizeof (struct nhere)), - SHELL_ALIGN(sizeof (struct nnot)), + SHELL_ALIGN(sizeof(struct ncmd)), + SHELL_ALIGN(sizeof(struct npipe)), + SHELL_ALIGN(sizeof(struct nredir)), + SHELL_ALIGN(sizeof(struct nredir)), + SHELL_ALIGN(sizeof(struct nredir)), + SHELL_ALIGN(sizeof(struct nbinary)), + SHELL_ALIGN(sizeof(struct nbinary)), + SHELL_ALIGN(sizeof(struct nbinary)), + SHELL_ALIGN(sizeof(struct nif)), + SHELL_ALIGN(sizeof(struct nbinary)), + SHELL_ALIGN(sizeof(struct nbinary)), + SHELL_ALIGN(sizeof(struct nfor)), + SHELL_ALIGN(sizeof(struct ncase)), + SHELL_ALIGN(sizeof(struct nclist)), + SHELL_ALIGN(sizeof(struct narg)), + SHELL_ALIGN(sizeof(struct narg)), + SHELL_ALIGN(sizeof(struct nfile)), + SHELL_ALIGN(sizeof(struct nfile)), + SHELL_ALIGN(sizeof(struct nfile)), + SHELL_ALIGN(sizeof(struct nfile)), + SHELL_ALIGN(sizeof(struct nfile)), + SHELL_ALIGN(sizeof(struct ndup)), + SHELL_ALIGN(sizeof(struct ndup)), + SHELL_ALIGN(sizeof(struct nhere)), + SHELL_ALIGN(sizeof(struct nhere)), + SHELL_ALIGN(sizeof(struct nnot)), }; @@ -1402,8 +1402,7 @@ struct cmdentry { static const char *pathopt; /* set by padvance */ -static void shellexec(char **, const char *, int) - ATTRIBUTE_NORETURN; +static void shellexec(char **, const char *, int) ATTRIBUTE_NORETURN; static char *padvance(const char **, const char *); static void find_command(char *, struct cmdentry *, int, const char *); static struct builtincmd *find_builtin(const char *); @@ -1619,9 +1618,9 @@ static void outcslow(int, FILE *); static void flushall(void); static void flusherr(void); static int out1fmt(const char *, ...) - __attribute__((__format__(__printf__,1,2))); + __attribute__((__format__(__printf__,1,2))); static int fmtstr(char *, size_t, const char *, ...) - __attribute__((__format__(__printf__,3,4))); + __attribute__((__format__(__printf__,3,4))); static int preverrout_fd; /* save fd2 before print debug if xflag is set. */ @@ -1672,40 +1671,40 @@ static void initvar(void) static void init(void) { - /* from input.c: */ - { - basepf.nextc = basepf.buf = basebuf; - } + /* from input.c: */ + { + basepf.nextc = basepf.buf = basebuf; + } - /* from trap.c: */ - { - signal(SIGCHLD, SIG_DFL); - } + /* from trap.c: */ + { + signal(SIGCHLD, SIG_DFL); + } - /* from var.c: */ - { - char **envp; - char ppid[32]; - const char *p; - struct stat st1, st2; + /* from var.c: */ + { + char **envp; + char ppid[32]; + const char *p; + struct stat st1, st2; - initvar(); - for (envp = environ ; envp && *envp ; envp++) { - if (strchr(*envp, '=')) { - setvareq(*envp, VEXPORT|VTEXTFIXED); - } - } + initvar(); + for (envp = environ ; envp && *envp ; envp++) { + if (strchr(*envp, '=')) { + setvareq(*envp, VEXPORT|VTEXTFIXED); + } + } - snprintf(ppid, sizeof(ppid), "%d", (int) getppid()); - setvar("PPID", ppid, 0); + snprintf(ppid, sizeof(ppid), "%d", (int) getppid()); + setvar("PPID", ppid, 0); - p = lookupvar("PWD"); - if (p) - if (*p != '/' || stat(p, &st1) || stat(".", &st2) || - st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) - p = 0; - setpwd(p, 0); - } + p = lookupvar("PWD"); + if (p) + if (*p != '/' || stat(p, &st1) || stat(".", &st2) + || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) + p = 0; + setpwd(p, 0); + } } /* PEOF (the end of file marker) */ @@ -2070,29 +2069,28 @@ static int is_safe_applet(char *name) static void reset(void) { - /* from eval.c: */ - { - evalskip = 0; - loopnest = 0; - } - - /* from input.c: */ - { - parselleft = parsenleft = 0; /* clear input buffer */ - popallfiles(); - } + /* from eval.c: */ + { + evalskip = 0; + loopnest = 0; + } - /* from parser.c: */ - { - tokpushback = 0; - checkkwd = 0; - } + /* from input.c: */ + { + parselleft = parsenleft = 0; /* clear input buffer */ + popallfiles(); + } - /* from redir.c: */ - { - clearredir(0); - } + /* from parser.c: */ + { + tokpushback = 0; + checkkwd = 0; + } + /* from redir.c: */ + { + clearredir(0); + } } #ifdef CONFIG_ASH_ALIAS @@ -2118,7 +2116,7 @@ setalias(const char *name, const char *val) ap->flag &= ~ALIASDEAD; } else { /* not found */ - ap = ckmalloc(sizeof (struct alias)); + ap = ckmalloc(sizeof(struct alias)); ap->name = savestr(name); ap->val = savestr(val); ap->flag = 0; @@ -2534,8 +2532,7 @@ setpwd(const char *val, int setold) -static void exverror(int, const char *, va_list) - ATTRIBUTE_NORETURN; +static void exverror(int, const char *, va_list) ATTRIBUTE_NORETURN; /* * Called to raise an exception. Since C doesn't include exceptions, we @@ -2670,7 +2667,7 @@ sh_warnx(const char *fmt, ...) static const char * errmsg(int e, const char *em) { - if(e == ENOENT || e == ENOTDIR) { + if (e == ENOENT || e == ENOTDIR) { return em; } @@ -2792,7 +2789,7 @@ evaltree(union node *n, int flags) goto out; } TRACE(("pid %d, evaltree(%p: %d, %d) called\n", - getpid(), n, n->type, flags)); + getpid(), n, n->type, flags)); switch (n->type) { default: #if DEBUG @@ -3297,7 +3294,7 @@ evalcommand(union node *cmd, int flags) argc++; } - argv = nargv = stalloc(sizeof (char *) * (argc + 1)); + argv = nargv = stalloc(sizeof(char *) * (argc + 1)); for (sp = arglist.list ; sp ; sp = sp->next) { TRACE(("evalcommand arg: %s\n", sp->text)); *nargv++ = sp->text; @@ -3338,11 +3335,11 @@ evalcommand(union node *cmd, int flags) dprintf(preverrout_fd, p, expandstr(ps4val())); sp = varlist.list; - for(n = 0; n < 2; n++) { + for (n = 0; n < 2; n++) { while (sp) { dprintf(preverrout_fd, p, sp->text); sp = sp->next; - if(*p == '%') { + if (*p == '%') { p--; } } @@ -3563,10 +3560,8 @@ prehash(union node *n) { struct cmdentry entry; - if (n->type == NCMD && n->ncmd.args) - if (goodname(n->ncmd.args->narg.text)) - find_command(n->ncmd.args->narg.text, &entry, 0, - pathval()); + if (n->type == NCMD && n->ncmd.args && goodname(n->ncmd.args->narg.text)) + find_command(n->ncmd.args->narg.text, &entry, 0, pathval()); } @@ -4211,7 +4206,8 @@ clearcmdentry(int firstchange) if ((cmdp->cmdtype == CMDNORMAL && cmdp->param.index >= firstchange) || (cmdp->cmdtype == CMDBUILTIN && - builtinloc >= firstchange)) { + builtinloc >= firstchange) + ) { *pp = cmdp->next; ckfree(cmdp); } else { @@ -4257,7 +4253,7 @@ cmdlookup(const char *name, int add) pp = &cmdp->next; } if (add && cmdp == NULL) { - cmdp = *pp = ckmalloc(sizeof (struct tblentry) - ARB + cmdp = *pp = ckmalloc(sizeof(struct tblentry) - ARB + strlen(name) + 1); cmdp->next = NULL; cmdp->cmdtype = CMDUNKNOWN; @@ -4351,8 +4347,8 @@ unsetfunc(const char *name) { struct tblentry *cmdp; - if ((cmdp = cmdlookup(name, 0)) != NULL && - cmdp->cmdtype == CMDFUNCTION) + cmdp = cmdlookup(name, 0); + if (cmdp!= NULL && cmdp->cmdtype == CMDFUNCTION) delete_cmd_entry(); } @@ -4641,7 +4637,7 @@ expandarg(union node *arg, struct arglist *arglist, int flag) } else { if (flag & EXP_REDIR) /*XXX - for now, just remove escapes */ rmescapes(p); - sp = (struct strlist *)stalloc(sizeof (struct strlist)); + sp = (struct strlist *)stalloc(sizeof(struct strlist)); sp->text = p; *exparg.lastp = sp; exparg.lastp = &sp->next; @@ -4985,7 +4981,7 @@ expbackq(union node *cmd, int quoted, int quotes) read: if (in.fd < 0) break; - i = safe_read(in.fd, buf, sizeof buf); + i = safe_read(in.fd, buf, sizeof(buf)); TRACE(("expbackq: read returns %d\n", i)); if (i <= 0) break; @@ -5202,8 +5198,7 @@ vsplus: if (subtype == VSASSIGN || subtype == VSQUESTION) { if (varlen < 0) { - if (subevalvar(p, var, 0, subtype, startloc, - varflags, 0)) { + if (subevalvar(p, var, 0, subtype, startloc, varflags, 0)) { varflags &= ~VSNUL; /* * Remove any recorded regions beyond @@ -5255,7 +5250,7 @@ record: STPUTC('\0', expdest); patloc = expdest - (char *)stackblock(); if (subevalvar(p, NULL, patloc, subtype, - startloc, varflags, quotes) == 0) { + startloc, varflags, quotes) == 0) { int amount = expdest - ( (char *)stackblock() + patloc - 1 ); @@ -5450,7 +5445,7 @@ recordregion(int start, int end, int nulonly) ifsp = &ifsfirst; } else { INTOFF; - ifsp = (struct ifsregion *)ckmalloc(sizeof (struct ifsregion)); + ifsp = (struct ifsregion *)ckmalloc(sizeof(struct ifsregion)); ifsp->next = NULL; ifslastp->next = ifsp; INTON; @@ -5505,7 +5500,7 @@ ifsbreakup(char *string, struct arglist *arglist) continue; } *q = '\0'; - sp = (struct strlist *)stalloc(sizeof *sp); + sp = (struct strlist *)stalloc(sizeof(*sp)); sp->text = start; *arglist->lastp = sp; arglist->lastp = &sp->next; @@ -5546,7 +5541,7 @@ ifsbreakup(char *string, struct arglist *arglist) return; add: - sp = (struct strlist *)stalloc(sizeof *sp); + sp = (struct strlist *)stalloc(sizeof(*sp)); sp->text = start; *arglist->lastp = sp; arglist->lastp = &sp->next; @@ -5636,7 +5631,7 @@ addfname(const char *name) { struct strlist *sp; - sp = (struct strlist *)stalloc(sizeof *sp); + sp = (struct strlist *)stalloc(sizeof(*sp)); sp->text = sstrdup(name); *exparg.lastp = sp; exparg.lastp = &sp->next; @@ -5743,8 +5738,7 @@ out: scopy(dp->d_name, enddir); addfname(expdir); } else { - for (p = enddir, cp = dp->d_name; - (*p++ = *cp++) != '\0';) + for (p = enddir, cp = dp->d_name; (*p++ = *cp++) != '\0';) continue; p[-1] = '/'; expmeta(p, endname); @@ -6226,7 +6220,7 @@ pushstring(char *s, void *ap) INTOFF; /*dprintf("*** calling pushstring: %s, %d\n", s, len);*/ if (parsefile->strpush) { - sp = ckmalloc(sizeof (struct strpush)); + sp = ckmalloc(sizeof(struct strpush)); sp->prev = parsefile->strpush; parsefile->strpush = sp; } else @@ -6357,7 +6351,7 @@ pushfile(void) parsefile->lleft = parselleft; parsefile->nextc = parsenextc; parsefile->linno = plinno; - pf = (struct parsefile *)ckmalloc(sizeof (struct parsefile)); + pf = (struct parsefile *)ckmalloc(sizeof(struct parsefile)); pf->prev = parsefile; pf->fd = -1; pf->strpush = NULL; @@ -7102,10 +7096,10 @@ makejob(union node *node, int nprocs) jp->used = 1; jp->ps = &jp->ps0; if (nprocs > 1) { - jp->ps = ckmalloc(nprocs * sizeof (struct procstat)); + jp->ps = ckmalloc(nprocs * sizeof(struct procstat)); } TRACE(("makejob(0x%lx, %d) returns %%%d\n", (long)node, nprocs, - jobno(jp))); + jobno(jp))); return jp; } @@ -7397,7 +7391,9 @@ dowait(int block, struct job *job) sp = jp->ps; do { if (sp->pid == pid) { - TRACE(("Job %d: changing status of proc %d from 0x%x to 0x%x\n", jobno(jp), pid, sp->status, status)); + TRACE(("Job %d: changing status of proc %d " + "from 0x%x to 0x%x\n", + jobno(jp), pid, sp->status, status)); sp->status = status; thisjob = jp; } @@ -7427,7 +7423,8 @@ gotjob: thisjob->changed = 1; if (thisjob->state != state) { - TRACE(("Job %d: changing state from %d to %d\n", jobno(thisjob), thisjob->state, state)); + TRACE(("Job %d: changing state from %d to %d\n", + jobno(thisjob), thisjob->state, state)); thisjob->state = state; #if JOBS if (state == JOBSTOPPED) { @@ -7913,7 +7910,7 @@ int ash_main(int argc, char **argv) #endif #if PROFILE - monitor(4, etext, profile_buf, sizeof profile_buf, 50); + monitor(4, etext, profile_buf, sizeof(profile_buf), 50); #endif #if ENABLE_FEATURE_EDITING @@ -7966,7 +7963,7 @@ int ash_main(int argc, char **argv) if (hp == NULL) { hp = lookupvar("HOME"); - if(hp != NULL) { + if (hp != NULL) { char *defhp = concat_path_file(hp, ".ash_history"); setvar("HISTFILE", defhp, 0); free(defhp); @@ -8584,79 +8581,79 @@ sstrdup(const char *p) static void calcsize(union node *n) { - if (n == NULL) - return; - funcblocksize += nodesize[n->type]; - switch (n->type) { - case NCMD: - calcsize(n->ncmd.redirect); - calcsize(n->ncmd.args); - calcsize(n->ncmd.assign); - break; - case NPIPE: - sizenodelist(n->npipe.cmdlist); - break; - case NREDIR: - case NBACKGND: - case NSUBSHELL: - calcsize(n->nredir.redirect); - calcsize(n->nredir.n); - break; - case NAND: - case NOR: - case NSEMI: - case NWHILE: - case NUNTIL: - calcsize(n->nbinary.ch2); - calcsize(n->nbinary.ch1); - break; - case NIF: - calcsize(n->nif.elsepart); - calcsize(n->nif.ifpart); - calcsize(n->nif.test); - break; - case NFOR: - funcstringsize += strlen(n->nfor.var) + 1; - calcsize(n->nfor.body); - calcsize(n->nfor.args); - break; - case NCASE: - calcsize(n->ncase.cases); - calcsize(n->ncase.expr); - break; - case NCLIST: - calcsize(n->nclist.body); - calcsize(n->nclist.pattern); - calcsize(n->nclist.next); - break; - case NDEFUN: - case NARG: - sizenodelist(n->narg.backquote); - funcstringsize += strlen(n->narg.text) + 1; - calcsize(n->narg.next); - break; - case NTO: - case NCLOBBER: - case NFROM: - case NFROMTO: - case NAPPEND: - calcsize(n->nfile.fname); - calcsize(n->nfile.next); - break; - case NTOFD: - case NFROMFD: - calcsize(n->ndup.vname); - calcsize(n->ndup.next); - break; - case NHERE: - case NXHERE: - calcsize(n->nhere.doc); - calcsize(n->nhere.next); - break; - case NNOT: - calcsize(n->nnot.com); - break; - }; + if (n == NULL) + return; + funcblocksize += nodesize[n->type]; + switch (n->type) { + case NCMD: + calcsize(n->ncmd.redirect); + calcsize(n->ncmd.args); + calcsize(n->ncmd.assign); + break; + case NPIPE: + sizenodelist(n->npipe.cmdlist); + break; + case NREDIR: + case NBACKGND: + case NSUBSHELL: + calcsize(n->nredir.redirect); + calcsize(n->nredir.n); + break; + case NAND: + case NOR: + case NSEMI: + case NWHILE: + case NUNTIL: + calcsize(n->nbinary.ch2); + calcsize(n->nbinary.ch1); + break; + case NIF: + calcsize(n->nif.elsepart); + calcsize(n->nif.ifpart); + calcsize(n->nif.test); + break; + case NFOR: + funcstringsize += strlen(n->nfor.var) + 1; + calcsize(n->nfor.body); + calcsize(n->nfor.args); + break; + case NCASE: + calcsize(n->ncase.cases); + calcsize(n->ncase.expr); + break; + case NCLIST: + calcsize(n->nclist.body); + calcsize(n->nclist.pattern); + calcsize(n->nclist.next); + break; + case NDEFUN: + case NARG: + sizenodelist(n->narg.backquote); + funcstringsize += strlen(n->narg.text) + 1; + calcsize(n->narg.next); + break; + case NTO: + case NCLOBBER: + case NFROM: + case NFROMTO: + case NAPPEND: + calcsize(n->nfile.fname); + calcsize(n->nfile.next); + break; + case NTOFD: + case NFROMFD: + calcsize(n->ndup.vname); + calcsize(n->ndup.next); + break; + case NHERE: + case NXHERE: + calcsize(n->nhere.doc); + calcsize(n->nhere.next); + break; + case NNOT: + calcsize(n->nnot.com); + break; + }; } @@ -8674,88 +8671,89 @@ sizenodelist(struct nodelist *lp) static union node * copynode(union node *n) { - union node *new; - - if (n == NULL) - return NULL; - new = funcblock; - funcblock = (char *) funcblock + nodesize[n->type]; - switch (n->type) { - case NCMD: - new->ncmd.redirect = copynode(n->ncmd.redirect); - new->ncmd.args = copynode(n->ncmd.args); - new->ncmd.assign = copynode(n->ncmd.assign); - break; - case NPIPE: - new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); - new->npipe.backgnd = n->npipe.backgnd; - break; - case NREDIR: - case NBACKGND: - case NSUBSHELL: - new->nredir.redirect = copynode(n->nredir.redirect); - new->nredir.n = copynode(n->nredir.n); - break; - case NAND: - case NOR: - case NSEMI: - case NWHILE: - case NUNTIL: - new->nbinary.ch2 = copynode(n->nbinary.ch2); - new->nbinary.ch1 = copynode(n->nbinary.ch1); - break; - case NIF: - new->nif.elsepart = copynode(n->nif.elsepart); - new->nif.ifpart = copynode(n->nif.ifpart); - new->nif.test = copynode(n->nif.test); - break; - case NFOR: - new->nfor.var = nodesavestr(n->nfor.var); - new->nfor.body = copynode(n->nfor.body); - new->nfor.args = copynode(n->nfor.args); - break; - case NCASE: - new->ncase.cases = copynode(n->ncase.cases); - new->ncase.expr = copynode(n->ncase.expr); - break; - case NCLIST: - new->nclist.body = copynode(n->nclist.body); - new->nclist.pattern = copynode(n->nclist.pattern); - new->nclist.next = copynode(n->nclist.next); - break; - case NDEFUN: - case NARG: - new->narg.backquote = copynodelist(n->narg.backquote); - new->narg.text = nodesavestr(n->narg.text); - new->narg.next = copynode(n->narg.next); - break; - case NTO: - case NCLOBBER: - case NFROM: - case NFROMTO: - case NAPPEND: - new->nfile.fname = copynode(n->nfile.fname); - new->nfile.fd = n->nfile.fd; - new->nfile.next = copynode(n->nfile.next); - break; - case NTOFD: - case NFROMFD: - new->ndup.vname = copynode(n->ndup.vname); - new->ndup.dupfd = n->ndup.dupfd; - new->ndup.fd = n->ndup.fd; - new->ndup.next = copynode(n->ndup.next); - break; - case NHERE: - case NXHERE: - new->nhere.doc = copynode(n->nhere.doc); - new->nhere.fd = n->nhere.fd; - new->nhere.next = copynode(n->nhere.next); - break; - case NNOT: - new->nnot.com = copynode(n->nnot.com); - break; - }; - new->type = n->type; + union node *new; + + if (n == NULL) + return NULL; + new = funcblock; + funcblock = (char *) funcblock + nodesize[n->type]; + + switch (n->type) { + case NCMD: + new->ncmd.redirect = copynode(n->ncmd.redirect); + new->ncmd.args = copynode(n->ncmd.args); + new->ncmd.assign = copynode(n->ncmd.assign); + break; + case NPIPE: + new->npipe.cmdlist = copynodelist(n->npipe.cmdlist); + new->npipe.backgnd = n->npipe.backgnd; + break; + case NREDIR: + case NBACKGND: + case NSUBSHELL: + new->nredir.redirect = copynode(n->nredir.redirect); + new->nredir.n = copynode(n->nredir.n); + break; + case NAND: + case NOR: + case NSEMI: + case NWHILE: + case NUNTIL: + new->nbinary.ch2 = copynode(n->nbinary.ch2); + new->nbinary.ch1 = copynode(n->nbinary.ch1); + break; + case NIF: + new->nif.elsepart = copynode(n->nif.elsepart); + new->nif.ifpart = copynode(n->nif.ifpart); + new->nif.test = copynode(n->nif.test); + break; + case NFOR: + new->nfor.var = nodesavestr(n->nfor.var); + new->nfor.body = copynode(n->nfor.body); + new->nfor.args = copynode(n->nfor.args); + break; + case NCASE: + new->ncase.cases = copynode(n->ncase.cases); + new->ncase.expr = copynode(n->ncase.expr); + break; + case NCLIST: + new->nclist.body = copynode(n->nclist.body); + new->nclist.pattern = copynode(n->nclist.pattern); + new->nclist.next = copynode(n->nclist.next); + break; + case NDEFUN: + case NARG: + new->narg.backquote = copynodelist(n->narg.backquote); + new->narg.text = nodesavestr(n->narg.text); + new->narg.next = copynode(n->narg.next); + break; + case NTO: + case NCLOBBER: + case NFROM: + case NFROMTO: + case NAPPEND: + new->nfile.fname = copynode(n->nfile.fname); + new->nfile.fd = n->nfile.fd; + new->nfile.next = copynode(n->nfile.next); + break; + case NTOFD: + case NFROMFD: + new->ndup.vname = copynode(n->ndup.vname); + new->ndup.dupfd = n->ndup.dupfd; + new->ndup.fd = n->ndup.fd; + new->ndup.next = copynode(n->ndup.next); + break; + case NHERE: + case NXHERE: + new->nhere.doc = copynode(n->nhere.doc); + new->nhere.fd = n->nhere.fd; + new->nhere.next = copynode(n->nhere.next); + break; + case NNOT: + new->nnot.com = copynode(n->nnot.com); + break; + }; + new->type = n->type; return new; } @@ -8769,8 +8767,7 @@ copynodelist(struct nodelist *lp) lpp = &start; while (lp) { *lpp = funcblock; - funcblock = (char *) funcblock + - SHELL_ALIGN(sizeof(struct nodelist)); + funcblock = (char *) funcblock + SHELL_ALIGN(sizeof(struct nodelist)); (*lpp)->n = copynode(lp->n); lp = lp->next; lpp = &(*lpp)->next; @@ -8981,7 +8978,7 @@ setparam(char **argv) int nparam; for (nparam = 0 ; argv[nparam] ; nparam++); - ap = newparam = ckmalloc((nparam + 1) * sizeof *ap); + ap = newparam = ckmalloc((nparam + 1) * sizeof(*ap)); while (*argv) { *ap++ = savestr(*argv++); } @@ -9096,7 +9093,7 @@ static void change_lc_ctype(const char *value) /* Roughly copied from bash.. */ static void change_random(const char *value) { - if(value == NULL) { + if (value == NULL) { /* "get", generate */ char buf[16]; @@ -9124,7 +9121,7 @@ getopts(char *optstr, char *optvar, char **optfirst, int *param_optind, int *opt char s[12]; char **optnext; - if(*param_optind < 1) + if (*param_optind < 1) return 1; optnext = optfirst + *param_optind - 1; @@ -9233,7 +9230,7 @@ getoptscmd(int argc, char **argv) } return getopts(argv[1], argv[2], optbase, &shellparam.optind, - &shellparam.optoff); + &shellparam.optoff); } #endif /* CONFIG_ASH_GETOPTS */ @@ -9446,7 +9443,7 @@ list(int nlflag) n1 = n2; } else { - n3 = (union node *)stalloc(sizeof (struct nbinary)); + n3 = (union node *)stalloc(sizeof(struct nbinary)); n3->type = NSEMI; n3->nbinary.ch1 = n1; n3->nbinary.ch2 = n2; @@ -9504,7 +9501,7 @@ andor(void) } checkkwd = CHKNL | CHKKWD | CHKALIAS; n2 = pipeline(); - n3 = (union node *)stalloc(sizeof (struct nbinary)); + n3 = (union node *)stalloc(sizeof(struct nbinary)); n3->type = t; n3->nbinary.ch1 = n1; n3->nbinary.ch2 = n2; @@ -9530,15 +9527,15 @@ pipeline(void) tokpushback++; n1 = command(); if (readtoken() == TPIPE) { - pipenode = (union node *)stalloc(sizeof (struct npipe)); + pipenode = (union node *)stalloc(sizeof(struct npipe)); pipenode->type = NPIPE; pipenode->npipe.backgnd = 0; - lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); + lp = (struct nodelist *)stalloc(sizeof(struct nodelist)); pipenode->npipe.cmdlist = lp; lp->n = n1; do { prev = lp; - lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); + lp = (struct nodelist *)stalloc(sizeof(struct nodelist)); checkkwd = CHKNL | CHKKWD | CHKALIAS; lp->n = command(); prev->next = lp; @@ -9548,7 +9545,7 @@ pipeline(void) } tokpushback++; if (negate) { - n2 = (union node *)stalloc(sizeof (struct nnot)); + n2 = (union node *)stalloc(sizeof(struct nnot)); n2->type = NNOT; n2->nnot.com = n1; return n2; @@ -9576,7 +9573,7 @@ command(void) synexpect(-1); /* NOTREACHED */ case TIF: - n1 = (union node *)stalloc(sizeof (struct nif)); + n1 = (union node *)stalloc(sizeof(struct nif)); n1->type = NIF; n1->nif.test = list(0); if (readtoken() != TTHEN) @@ -9584,7 +9581,7 @@ command(void) n1->nif.ifpart = list(0); n2 = n1; while (readtoken() == TELIF) { - n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif)); + n2->nif.elsepart = (union node *)stalloc(sizeof(struct nif)); n2 = n2->nif.elsepart; n2->type = NIF; n2->nif.test = list(0); @@ -9603,7 +9600,7 @@ command(void) case TWHILE: case TUNTIL: { int got; - n1 = (union node *)stalloc(sizeof (struct nbinary)); + n1 = (union node *)stalloc(sizeof(struct nbinary)); n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL; n1->nbinary.ch1 = list(0); if ((got=readtoken()) != TDO) { @@ -9617,14 +9614,14 @@ TRACE(("expecting DO got %s %s\n", tokname(got), got == TWORD ? wordtext : "")); case TFOR: if (readtoken() != TWORD || quoteflag || ! goodname(wordtext)) synerror("Bad for loop variable"); - n1 = (union node *)stalloc(sizeof (struct nfor)); + n1 = (union node *)stalloc(sizeof(struct nfor)); n1->type = NFOR; n1->nfor.var = wordtext; checkkwd = CHKKWD | CHKALIAS; if (readtoken() == TIN) { app = ≈ while (readtoken() == TWORD) { - n2 = (union node *)stalloc(sizeof (struct narg)); + n2 = (union node *)stalloc(sizeof(struct narg)); n2->type = NARG; n2->narg.text = wordtext; n2->narg.backquote = backquotelist; @@ -9636,7 +9633,7 @@ TRACE(("expecting DO got %s %s\n", tokname(got), got == TWORD ? wordtext : "")); if (lasttoken != TNL && lasttoken != TSEMI) synexpect(-1); } else { - n2 = (union node *)stalloc(sizeof (struct narg)); + n2 = (union node *)stalloc(sizeof(struct narg)); n2->type = NARG; n2->narg.text = (char *)dolatstr; n2->narg.backquote = NULL; @@ -9656,11 +9653,11 @@ TRACE(("expecting DO got %s %s\n", tokname(got), got == TWORD ? wordtext : "")); t = TDONE; break; case TCASE: - n1 = (union node *)stalloc(sizeof (struct ncase)); + n1 = (union node *)stalloc(sizeof(struct ncase)); n1->type = NCASE; if (readtoken() != TWORD) synexpect(TWORD); - n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg)); + n1->ncase.expr = n2 = (union node *)stalloc(sizeof(struct narg)); n2->type = NARG; n2->narg.text = wordtext; n2->narg.backquote = backquotelist; @@ -9674,14 +9671,14 @@ TRACE(("expecting DO got %s %s\n", tokname(got), got == TWORD ? wordtext : "")); next_case: checkkwd = CHKNL | CHKKWD; t = readtoken(); - while(t != TESAC) { + while (t != TESAC) { if (lasttoken == TLP) readtoken(); - *cpp = cp = (union node *)stalloc(sizeof (struct nclist)); + *cpp = cp = (union node *)stalloc(sizeof(struct nclist)); cp->type = NCLIST; app = &cp->nclist.pattern; for (;;) { - *app = ap = (union node *)stalloc(sizeof (struct narg)); + *app = ap = (union node *)stalloc(sizeof(struct narg)); ap->type = NARG; ap->narg.text = wordtext; ap->narg.backquote = backquotelist; @@ -9708,7 +9705,7 @@ next_case: *cpp = NULL; goto redir; case TLP: - n1 = (union node *)stalloc(sizeof (struct nredir)); + n1 = (union node *)stalloc(sizeof(struct nredir)); n1->type = NSUBSHELL; n1->nredir.n = list(0); n1->nredir.redirect = NULL; @@ -9740,7 +9737,7 @@ redir: *rpp = NULL; if (redir) { if (n1->type != NSUBSHELL) { - n2 = (union node *)stalloc(sizeof (struct nredir)); + n2 = (union node *)stalloc(sizeof(struct nredir)); n2->type = NREDIR; n2->nredir.n = n1; n1 = n2; @@ -9772,7 +9769,7 @@ simplecmd(void) { checkkwd = savecheckkwd; switch (readtoken()) { case TWORD: - n = (union node *)stalloc(sizeof (struct narg)); + n = (union node *)stalloc(sizeof(struct narg)); n->type = NARG; n->narg.text = wordtext; n->narg.backquote = backquotelist; @@ -9824,7 +9821,7 @@ out: *app = NULL; *vpp = NULL; *rpp = NULL; - n = (union node *)stalloc(sizeof (struct ncmd)); + n = (union node *)stalloc(sizeof(struct ncmd)); n->type = NCMD; n->ncmd.args = args; n->ncmd.assign = vars; @@ -9837,7 +9834,7 @@ makename(void) { union node *n; - n = (union node *)stalloc(sizeof (struct narg)); + n = (union node *)stalloc(sizeof(struct narg)); n->type = NARG; n->narg.next = NULL; n->narg.text = wordtext; @@ -9918,7 +9915,7 @@ parseheredoc(void) } readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX, here->eofmark, here->striptabs); - n = (union node *)stalloc(sizeof (struct narg)); + n = (union node *)stalloc(sizeof(struct narg)); n->narg.type = NARG; n->narg.next = NULL; n->narg.text = wordtext; @@ -9993,9 +9990,9 @@ out: checkkwd = 0; #if DEBUG if (!alreadyseen) - TRACE(("token %s %s\n", tokname(t), t == TWORD ? wordtext : "")); + TRACE(("token %s %s\n", tokname(t), t == TWORD ? wordtext : "")); else - TRACE(("reread token %s %s\n", tokname(t), t == TWORD ? wordtext : "")); + TRACE(("reread token %s %s\n", tokname(t), t == TWORD ? wordtext : "")); #endif return t; } @@ -10283,7 +10280,7 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs) break; case CSQUOTE: syntax = SQSYNTAX; -quotemark: + quotemark: if (eofmark == NULL) { USTPUTC(CTLQUOTEMARK, out); } @@ -10293,8 +10290,9 @@ quotemark: dblquote = 1; goto quotemark; case CENDQUOTE: - if (eofmark != NULL && arinest == 0 && - varnest == 0) { + if (eofmark != NULL && arinest == 0 + && varnest == 0 + ) { USTPUTC(c, out); } else { if (dqvarnest == 0) { @@ -10369,7 +10367,7 @@ quotemark: c = pgetc_macro(); } } -endword: + endword: #ifdef CONFIG_ASH_MATH_SUPPORT if (syntax == ARISYNTAX) synerror("Missing '))'"); @@ -10399,7 +10397,8 @@ endword: backquotelist = bqlist; grabstackblock(len); wordtext = out; - return lasttoken = TWORD; + lasttoken = TWORD; + return lasttoken; /* end of readtoken routine */ @@ -10423,7 +10422,7 @@ checkend: { } } if (c == *eofmark) { - if (pfgets(line, sizeof line) != NULL) { + if (pfgets(line, sizeof(line)) != NULL) { char *p, *q; p = line; @@ -10452,7 +10451,7 @@ parseredir: { char fd = *out; union node *np; - np = (union node *)stalloc(sizeof (struct nfile)); + np = (union node *)stalloc(sizeof(struct nfile)); if (c == '>') { np->nfile.fd = 1; c = pgetc(); @@ -10470,12 +10469,12 @@ parseredir: { np->nfile.fd = 0; switch (c = pgetc()) { case '<': - if (sizeof (struct nfile) != sizeof (struct nhere)) { - np = (union node *)stalloc(sizeof (struct nhere)); + if (sizeof(struct nfile) != sizeof(struct nhere)) { + np = (union node *)stalloc(sizeof(struct nhere)); np->nfile.fd = 0; } np->type = NHERE; - heredoc = (struct heredoc *)stalloc(sizeof (struct heredoc)); + heredoc = (struct heredoc *)stalloc(sizeof(struct heredoc)); heredoc->here = np; if ((c = pgetc()) == '-') { heredoc->striptabs = 1; @@ -10562,13 +10561,11 @@ parsesub: { STPUTC(c, out); c = pgetc(); } while (is_digit(c)); - } - else if (is_special(c)) { + } else if (is_special(c)) { USTPUTC(c, out); c = pgetc(); - } - else -badsub: synerror("Bad substitution"); + } else + badsub: synerror("Bad substitution"); STPUTC('=', out); flags = 0; @@ -10589,7 +10586,7 @@ badsub: synerror("Bad substitution"); { int cc = c; subtype = c == '#' ? VSTRIMLEFT : - VSTRIMRIGHT; + VSTRIMRIGHT; c = pgetc(); if (c == cc) subtype++; @@ -10686,7 +10683,7 @@ parsebackq: { continue; } if (pc != '\\' && pc != '`' && pc != '$' - && (!dblquote || pc != '"')) + && (!dblquote || pc != '"')) STPUTC('\\', pout); if (pc > PEOA_OR_PEOF) { break; @@ -10721,7 +10718,7 @@ done: nlpp = &bqlist; while (*nlpp) nlpp = &(*nlpp)->next; - *nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist)); + *nlpp = (struct nodelist *)stalloc(sizeof(struct nodelist)); (*nlpp)->next = NULL; parsebackquote = oldstyle; @@ -10776,7 +10773,6 @@ done: * Parse an arithmetic expansion (indicate start of one and set state) */ parsearith: { - if (++arinest == 1) { prevsyntax = syntax; syntax = ARISYNTAX; @@ -10835,10 +10831,10 @@ endofname(const char *name) char *p; p = (char *) name; - if (! is_name(*p)) + if (!is_name(*p)) return p; while (*++p) { - if (! is_in_name(*p)) + if (!is_in_name(*p)) break; } return p; @@ -10930,8 +10926,8 @@ static void setprompt(int whichprompt) static const char *const *findkwd(const char *s) { return bsearch(s, tokname_array + KWDOFFSET, - (sizeof(tokname_array) / sizeof(const char *)) - KWDOFFSET, - sizeof(const char *), pstrcmp); + (sizeof(tokname_array) / sizeof(const char *)) - KWDOFFSET, + sizeof(const char *), pstrcmp); } /* redir.c */ @@ -10994,8 +10990,8 @@ static int noclobberopen(const char *fname) * revealed that it was a regular file, and the file has not been * replaced, return the file descriptor. */ - if (fstat(fd, &finfo2) == 0 && !S_ISREG(finfo2.st_mode) && - finfo.st_dev == finfo2.st_dev && finfo.st_ino == finfo2.st_ino) + if (fstat(fd, &finfo2) == 0 && !S_ISREG(finfo2.st_mode) + && finfo.st_dev == finfo2.st_dev && finfo.st_ino == finfo2.st_ino) return fd; /* The file has been replaced. badness. */ @@ -11145,7 +11141,7 @@ redirect(union node *redir, int flags) INTOFF; if (flags & REDIR_PUSH) { struct redirtab *q; - q = ckmalloc(sizeof (struct redirtab)); + q = ckmalloc(sizeof(struct redirtab)); q->next = redirlist; redirlist = q; q->nullredirs = nullredirs - 1; @@ -11157,8 +11153,8 @@ redirect(union node *redir, int flags) n = redir; do { fd = n->nfile.fd; - if ((n->nfile.type == NTOFD || n->nfile.type == NFROMFD) && - n->ndup.dupfd == fd) + if ((n->nfile.type == NTOFD || n->nfile.type == NFROMFD) + && n->ndup.dupfd == fd) continue; /* redirect from/to same file descriptor */ newfd = openredirect(n); @@ -11458,8 +11454,8 @@ sharg(union node *arg, FILE *fp) } break; case CTLENDVAR: - putc('}', fp); - break; + putc('}', fp); + break; case CTLBACKQ: case CTLBACKQ|CTLQUOTE: putc('$', fp); @@ -11776,8 +11772,9 @@ setsignal(int signo) return; } if (act.sa_handler == SIG_IGN) { - if (mflag && (signo == SIGTSTP || - signo == SIGTTIN || signo == SIGTTOU)) { + if (mflag && (signo == SIGTSTP || signo == SIGTTIN + || signo == SIGTTOU) + ) { tsig = S_IGN; /* don't hard ignore these */ } else tsig = S_HARD_IGN; @@ -11887,11 +11884,11 @@ setinteractive(int on) setsignal(SIGQUIT); setsignal(SIGTERM); #if !ENABLE_FEATURE_SH_EXTRA_QUIET - if(is_interactive > 1) { + if (is_interactive > 1) { /* Looks like they want an interactive shell */ static int do_banner; - if(!do_banner) { + if (!do_banner) { out1fmt( "\n\n%s Built-in shell (ash)\n" "Enter 'help' for a list of built-in commands.\n\n", @@ -12083,7 +12080,7 @@ setvareq(char *s, int flags) if (flags & VNOSET) return; /* not found */ - vp = ckmalloc(sizeof (*vp)); + vp = ckmalloc(sizeof(*vp)); vp->next = *vpp; vp->func = NULL; *vpp = vp; @@ -12131,10 +12128,10 @@ lookupvar(const char *name) * As soon as they're unset, they're no longer dynamic, and dynamic * lookup will no longer happen at that point. -- PFM. */ - if((v->flags & VDYNAMIC)) + if ((v->flags & VDYNAMIC)) (*v->func)(NULL); #endif - if(!(v->flags & VUNSET)) + if (!(v->flags & VUNSET)) return strchrnul(v->text, '=') + 1; } @@ -12275,7 +12272,7 @@ static void mklocal(char *name) struct var *vp; INTOFF; - lvp = ckmalloc(sizeof (struct localvar)); + lvp = ckmalloc(sizeof(struct localvar)); if (LONE_DASH(name)) { char *p; p = ckmalloc(sizeof(optlist)); @@ -12568,7 +12565,7 @@ letcmd(int argc, char **argv) arith_t i = 0; ap = argv + 1; - if(!*ap) + if (!*ap) sh_error("expression expected"); for (ap = argv + 1; *ap; ap++) { i = dash_arith(*ap); @@ -12695,11 +12692,11 @@ readcmd(int argc, char **argv) tcgetattr(0, &tty); old_tty = tty; if (nch_flag) { - tty.c_lflag &= ~ICANON; - tty.c_cc[VMIN] = nchars; + tty.c_lflag &= ~ICANON; + tty.c_cc[VMIN] = nchars; } if (silent) { - tty.c_lflag &= ~(ECHO|ECHOK|ECHONL); + tty.c_lflag &= ~(ECHO|ECHOK|ECHONL); } tcsetattr(0, TCSANOW, &tty); @@ -12964,7 +12961,7 @@ ulimitcmd(int argc, char **argv) #ifdef RLIMIT_LOCKS "w" #endif - )) != '\0') + )) != '\0') switch (optc) { case 'H': how = HARD; @@ -12993,8 +12990,7 @@ ulimitcmd(int argc, char **argv) else { val = (rlim_t) 0; - while ((c = *p++) >= '0' && c <= '9') - { + while ((c = *p++) >= '0' && c <= '9') { val = (val * 10) + (long)(c - '0'); if (val < (rlim_t) 0) break; @@ -13158,7 +13154,7 @@ typedef unsigned char operator; #define TOK_REM_ASSIGN tok_decl(3,2) /* all assign is right associativity and precedence eq, but (7+3)<<5 > 256 */ -#define convert_prec_is_assing(prec) do { if(prec == 3) prec = 2; } while(0) +#define convert_prec_is_assing(prec) do { if (prec == 3) prec = 2; } while (0) /* conditional is right associativity too */ #define TOK_CONDITIONAL tok_decl(4,0) @@ -13231,8 +13227,8 @@ static int tok_have_assign(operator op) static int is_right_associativity(operator prec) { - return (prec == PREC(TOK_ASSIGN) || prec == PREC(TOK_EXPONENT) || - prec == PREC(TOK_CONDITIONAL)); + return (prec == PREC(TOK_ASSIGN) || prec == PREC(TOK_EXPONENT) + || prec == PREC(TOK_CONDITIONAL)); } @@ -13255,38 +13251,37 @@ static chk_var_recursive_looped_t *prev_chk_var_recursive; static int arith_lookup_val(v_n_t *t) { - if(t->var) { - const char * p = lookupvar(t->var); + if (t->var) { + const char * p = lookupvar(t->var); - if(p) { - int errcode; + if (p) { + int errcode; - /* recursive try as expression */ - chk_var_recursive_looped_t *cur; - chk_var_recursive_looped_t cur_save; + /* recursive try as expression */ + chk_var_recursive_looped_t *cur; + chk_var_recursive_looped_t cur_save; - for(cur = prev_chk_var_recursive; cur; cur = cur->next) { - if(strcmp(cur->var, t->var) == 0) { - /* expression recursion loop detected */ - return -5; - } - } - /* save current lookuped var name */ - cur = prev_chk_var_recursive; - cur_save.var = t->var; - cur_save.next = cur; - prev_chk_var_recursive = &cur_save; + for (cur = prev_chk_var_recursive; cur; cur = cur->next) { + if (strcmp(cur->var, t->var) == 0) { + /* expression recursion loop detected */ + return -5; + } + } + /* save current lookuped var name */ + cur = prev_chk_var_recursive; + cur_save.var = t->var; + cur_save.next = cur; + prev_chk_var_recursive = &cur_save; - t->val = arith (p, &errcode); - /* restore previous ptr after recursiving */ - prev_chk_var_recursive = cur; - return errcode; - } else { - /* allow undefined var as 0 */ - t->val = 0; + t->val = arith (p, &errcode); + /* restore previous ptr after recursiving */ + prev_chk_var_recursive = cur; + return errcode; + } + /* allow undefined var as 0 */ + t->val = 0; } - } - return 0; + return 0; } /* "applying" a token means performing it on the top elements on the integer @@ -13298,13 +13293,13 @@ static int arith_apply(operator op, v_n_t *numstack, v_n_t **numstackptr) arith_t numptr_val, rez; int ret_arith_lookup_val; - if (NUMPTR == numstack) goto err; /* There is no operator that can work - without arguments */ + /* There is no operator that can work without arguments */ + if (NUMPTR == numstack) goto err; numptr_m1 = NUMPTR - 1; /* check operand is var with noninteger value */ ret_arith_lookup_val = arith_lookup_val(numptr_m1); - if(ret_arith_lookup_val) + if (ret_arith_lookup_val) return ret_arith_lookup_val; rez = numptr_m1->val; @@ -13321,102 +13316,102 @@ static int arith_apply(operator op, v_n_t *numstack, v_n_t **numstackptr) else if (op != TOK_UPLUS) { /* Binary operators */ - /* check and binary operators need two arguments */ - if (numptr_m1 == numstack) goto err; - - /* ... and they pop one */ - --NUMPTR; - numptr_val = rez; - if (op == TOK_CONDITIONAL) { - if(! numptr_m1->contidional_second_val_initialized) { - /* protect $((expr1 ? expr2)) without ": expr" */ - goto err; - } - rez = numptr_m1->contidional_second_val; - } else if(numptr_m1->contidional_second_val_initialized) { - /* protect $((expr1 : expr2)) without "expr ? " */ - goto err; - } - numptr_m1 = NUMPTR - 1; - if(op != TOK_ASSIGN) { - /* check operand is var with noninteger value for not '=' */ - ret_arith_lookup_val = arith_lookup_val(numptr_m1); - if(ret_arith_lookup_val) - return ret_arith_lookup_val; - } - if (op == TOK_CONDITIONAL) { - numptr_m1->contidional_second_val = rez; - } - rez = numptr_m1->val; - if (op == TOK_BOR || op == TOK_OR_ASSIGN) + /* check and binary operators need two arguments */ + if (numptr_m1 == numstack) goto err; + + /* ... and they pop one */ + --NUMPTR; + numptr_val = rez; + if (op == TOK_CONDITIONAL) { + if (! numptr_m1->contidional_second_val_initialized) { + /* protect $((expr1 ? expr2)) without ": expr" */ + goto err; + } + rez = numptr_m1->contidional_second_val; + } else if (numptr_m1->contidional_second_val_initialized) { + /* protect $((expr1 : expr2)) without "expr ? " */ + goto err; + } + numptr_m1 = NUMPTR - 1; + if (op != TOK_ASSIGN) { + /* check operand is var with noninteger value for not '=' */ + ret_arith_lookup_val = arith_lookup_val(numptr_m1); + if (ret_arith_lookup_val) + return ret_arith_lookup_val; + } + if (op == TOK_CONDITIONAL) { + numptr_m1->contidional_second_val = rez; + } + rez = numptr_m1->val; + if (op == TOK_BOR || op == TOK_OR_ASSIGN) rez |= numptr_val; - else if (op == TOK_OR) + else if (op == TOK_OR) rez = numptr_val || rez; - else if (op == TOK_BAND || op == TOK_AND_ASSIGN) + else if (op == TOK_BAND || op == TOK_AND_ASSIGN) rez &= numptr_val; - else if (op == TOK_BXOR || op == TOK_XOR_ASSIGN) + else if (op == TOK_BXOR || op == TOK_XOR_ASSIGN) rez ^= numptr_val; - else if (op == TOK_AND) + else if (op == TOK_AND) rez = rez && numptr_val; - else if (op == TOK_EQ) + else if (op == TOK_EQ) rez = (rez == numptr_val); - else if (op == TOK_NE) + else if (op == TOK_NE) rez = (rez != numptr_val); - else if (op == TOK_GE) + else if (op == TOK_GE) rez = (rez >= numptr_val); - else if (op == TOK_RSHIFT || op == TOK_RSHIFT_ASSIGN) + else if (op == TOK_RSHIFT || op == TOK_RSHIFT_ASSIGN) rez >>= numptr_val; - else if (op == TOK_LSHIFT || op == TOK_LSHIFT_ASSIGN) + else if (op == TOK_LSHIFT || op == TOK_LSHIFT_ASSIGN) rez <<= numptr_val; - else if (op == TOK_GT) + else if (op == TOK_GT) rez = (rez > numptr_val); - else if (op == TOK_LT) + else if (op == TOK_LT) rez = (rez < numptr_val); - else if (op == TOK_LE) + else if (op == TOK_LE) rez = (rez <= numptr_val); - else if (op == TOK_MUL || op == TOK_MUL_ASSIGN) + else if (op == TOK_MUL || op == TOK_MUL_ASSIGN) rez *= numptr_val; - else if (op == TOK_ADD || op == TOK_PLUS_ASSIGN) + else if (op == TOK_ADD || op == TOK_PLUS_ASSIGN) rez += numptr_val; - else if (op == TOK_SUB || op == TOK_MINUS_ASSIGN) + else if (op == TOK_SUB || op == TOK_MINUS_ASSIGN) rez -= numptr_val; - else if (op == TOK_ASSIGN || op == TOK_COMMA) + else if (op == TOK_ASSIGN || op == TOK_COMMA) rez = numptr_val; - else if (op == TOK_CONDITIONAL_SEP) { + else if (op == TOK_CONDITIONAL_SEP) { if (numptr_m1 == numstack) { - /* protect $((expr : expr)) without "expr ? " */ - goto err; + /* protect $((expr : expr)) without "expr ? " */ + goto err; } numptr_m1->contidional_second_val_initialized = op; numptr_m1->contidional_second_val = numptr_val; - } - else if (op == TOK_CONDITIONAL) { + } + else if (op == TOK_CONDITIONAL) { rez = rez ? - numptr_val : numptr_m1->contidional_second_val; - } - else if(op == TOK_EXPONENT) { - if(numptr_val < 0) + numptr_val : numptr_m1->contidional_second_val; + } + else if (op == TOK_EXPONENT) { + if (numptr_val < 0) return -3; /* exponent less than 0 */ else { arith_t c = 1; - if(numptr_val) - while(numptr_val--) + if (numptr_val) + while (numptr_val--) c *= rez; rez = c; } - } - else if(numptr_val==0) /* zero divisor check */ + } + else if (numptr_val==0) /* zero divisor check */ return -2; - else if (op == TOK_DIV || op == TOK_DIV_ASSIGN) + else if (op == TOK_DIV || op == TOK_DIV_ASSIGN) rez /= numptr_val; - else if (op == TOK_REM || op == TOK_REM_ASSIGN) + else if (op == TOK_REM || op == TOK_REM_ASSIGN) rez %= numptr_val; } - if(tok_have_assign(op)) { + if (tok_have_assign(op)) { char buf[32]; - if(numptr_m1->var == NULL) { + if (numptr_m1->var == NULL) { /* Hmm, 1=2 ? */ goto err; } @@ -13428,9 +13423,9 @@ static int arith_apply(operator op, v_n_t *numstack, v_n_t **numstackptr) #endif setvar(numptr_m1->var, buf, 0); /* after saving, make previous value for v++ or v-- */ - if(op == TOK_POST_INC) + if (op == TOK_POST_INC) rez--; - else if(op == TOK_POST_DEC) + else if (op == TOK_POST_DEC) rez++; } numptr_m1->val = rez; @@ -13491,73 +13486,74 @@ static const char op_tokens[] = { static arith_t arith(const char *expr, int *perrcode) { - char arithval; /* Current character under analysis */ - operator lasttok, op; - operator prec; + char arithval; /* Current character under analysis */ + operator lasttok, op; + operator prec; - const char *p = endexpression; - int errcode; + const char *p = endexpression; + int errcode; - size_t datasizes = strlen(expr) + 2; + size_t datasizes = strlen(expr) + 2; - /* Stack of integers */ - /* The proof that there can be no more than strlen(startbuf)/2+1 integers - * in any given correct or incorrect expression is left as an exercise to - * the reader. */ - v_n_t *numstack = alloca(((datasizes)/2)*sizeof(v_n_t)), - *numstackptr = numstack; - /* Stack of operator tokens */ - operator *stack = alloca((datasizes) * sizeof(operator)), - *stackptr = stack; + /* Stack of integers */ + /* The proof that there can be no more than strlen(startbuf)/2+1 integers + * in any given correct or incorrect expression is left as an exercise to + * the reader. */ + v_n_t *numstack = alloca(((datasizes)/2)*sizeof(v_n_t)), + *numstackptr = numstack; + /* Stack of operator tokens */ + operator *stack = alloca((datasizes) * sizeof(operator)), + *stackptr = stack; - *stackptr++ = lasttok = TOK_LPAREN; /* start off with a left paren */ - *perrcode = errcode = 0; + *stackptr++ = lasttok = TOK_LPAREN; /* start off with a left paren */ + *perrcode = errcode = 0; - while(1) { - if ((arithval = *expr) == 0) { - if (p == endexpression) { - /* Null expression. */ - return 0; - } + while (1) { + if ((arithval = *expr) == 0) { + if (p == endexpression) { + /* Null expression. */ + return 0; + } - /* This is only reached after all tokens have been extracted from the - * input stream. If there are still tokens on the operator stack, they - * are to be applied in order. At the end, there should be a final - * result on the integer stack */ + /* This is only reached after all tokens have been extracted from the + * input stream. If there are still tokens on the operator stack, they + * are to be applied in order. At the end, there should be a final + * result on the integer stack */ - if (expr != endexpression + 1) { - /* If we haven't done so already, */ - /* append a closing right paren */ - expr = endexpression; - /* and let the loop process it. */ - continue; - } - /* At this point, we're done with the expression. */ - if (numstackptr != numstack+1) { - /* ... but if there isn't, it's bad */ - err: - return (*perrcode = -1); - } - if(numstack->var) { - /* expression is $((var)) only, lookup now */ - errcode = arith_lookup_val(numstack); + if (expr != endexpression + 1) { + /* If we haven't done so already, */ + /* append a closing right paren */ + expr = endexpression; + /* and let the loop process it. */ + continue; + } + /* At this point, we're done with the expression. */ + if (numstackptr != numstack+1) { + /* ... but if there isn't, it's bad */ + err: + return (*perrcode = -1); + } + if (numstack->var) { + /* expression is $((var)) only, lookup now */ + errcode = arith_lookup_val(numstack); + } + ret: + *perrcode = errcode; + return numstack->val; } - ret: - *perrcode = errcode; - return numstack->val; - } else { + /* Continue processing the expression. */ if (arith_isspace(arithval)) { /* Skip whitespace */ goto prologue; } - if((p = endofname(expr)) != expr) { + if ((p = endofname(expr)) != expr) { size_t var_name_size = (p-expr) + 1; /* trailing zero */ numstackptr->var = alloca(var_name_size); safe_strncpy(numstackptr->var, expr, var_name_size); expr = p; - num: + num: numstackptr->contidional_second_val_initialized = 0; numstackptr++; lasttok = TOK_NUM; @@ -13571,22 +13567,22 @@ static arith_t arith(const char *expr, int *perrcode) #endif goto num; } - for(p = op_tokens; ; p++) { + for (p = op_tokens; ; p++) { const char *o; - if(*p == 0) { + if (*p == 0) { /* strange operator not found */ goto err; } - for(o = expr; *p && *o == *p; p++) + for (o = expr; *p && *o == *p; p++) o++; - if(! *p) { + if (! *p) { /* found */ expr = o - 1; break; } /* skip tail uncompared token */ - while(*p) + while (*p) p++; /* skip zero delim */ p++; @@ -13594,8 +13590,8 @@ static arith_t arith(const char *expr, int *perrcode) op = p[1]; /* post grammar: a++ reduce to num */ - if(lasttok == TOK_POST_INC || lasttok == TOK_POST_DEC) - lasttok = TOK_NUM; + if (lasttok == TOK_POST_INC || lasttok == TOK_POST_DEC) + lasttok = TOK_NUM; /* Plus and minus are binary (not unary) _only_ if the last * token was as number, or a right paren (which pretends to be @@ -13603,18 +13599,18 @@ static arith_t arith(const char *expr, int *perrcode) * It makes sense. */ if (lasttok != TOK_NUM) { switch (op) { - case TOK_ADD: - op = TOK_UPLUS; - break; - case TOK_SUB: - op = TOK_UMINUS; - break; - case TOK_POST_INC: - op = TOK_PRE_INC; - break; - case TOK_POST_DEC: - op = TOK_PRE_DEC; - break; + case TOK_ADD: + op = TOK_UPLUS; + break; + case TOK_SUB: + op = TOK_UMINUS; + break; + case TOK_POST_INC: + op = TOK_PRE_INC; + break; + case TOK_POST_DEC: + op = TOK_PRE_DEC; + break; } } /* We don't want a unary operator to cause recursive descent on the @@ -13636,30 +13632,30 @@ static arith_t arith(const char *expr, int *perrcode) goto err; } while (stackptr != stack) { - if (op == TOK_RPAREN) { - /* The algorithm employed here is simple: while we don't - * hit an open paren nor the bottom of the stack, pop - * tokens and apply them */ - if (stackptr[-1] == TOK_LPAREN) { - --stackptr; - /* Any operator directly after a */ - lasttok = TOK_NUM; - /* close paren should consider itself binary */ - goto prologue; - } - } else { - operator prev_prec = PREC(stackptr[-1]); + if (op == TOK_RPAREN) { + /* The algorithm employed here is simple: while we don't + * hit an open paren nor the bottom of the stack, pop + * tokens and apply them */ + if (stackptr[-1] == TOK_LPAREN) { + --stackptr; + /* Any operator directly after a */ + lasttok = TOK_NUM; + /* close paren should consider itself binary */ + goto prologue; + } + } else { + operator prev_prec = PREC(stackptr[-1]); - convert_prec_is_assing(prec); - convert_prec_is_assing(prev_prec); - if (prev_prec < prec) - break; - /* check right assoc */ - if(prev_prec == prec && is_right_associativity(prec)) - break; - } - errcode = arith_apply(*--stackptr, numstack, &numstackptr); - if(errcode) goto ret; + convert_prec_is_assing(prec); + convert_prec_is_assing(prev_prec); + if (prev_prec < prec) + break; + /* check right assoc */ + if (prev_prec == prec && is_right_associativity(prec)) + break; + } + errcode = arith_apply(*--stackptr, numstack, &numstackptr); + if (errcode) goto ret; } if (op == TOK_RPAREN) { goto err; @@ -13668,11 +13664,9 @@ static arith_t arith(const char *expr, int *perrcode) /* Push this operator to the stack and remember it. */ *stackptr++ = lasttok = op; - - prologue: + prologue: ++expr; - } - } + } /* while */ } #endif /* CONFIG_ASH_MATH_SUPPORT */ |