diff options
author | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-04-03 09:48:44 -0700 |
---|---|---|
committer | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-04-03 09:48:44 -0700 |
commit | 3e14f97f673e8a630f076077de35afdd43dc1587 (patch) | |
tree | 9828b6b676f58d7b27dd28e00202d3f3461a5cd8 /usr/src/lib/libshell/common/sh/parse.c | |
parent | 4f60987df4dcaa54a88b596f861fbf4f3382c65e (diff) | |
download | illumos-joyent-3e14f97f673e8a630f076077de35afdd43dc1587.tar.gz |
6939349 RFE: Update ksh93 to ast-ksh.2010-03-09
6877392 ksh93 regresses 'uniq -c' performance
6887363 Korn shell 93 sometimes mishandles return value of its child process
6900314 (while true ; do true|true ; done) hang in ioctl() with SIGTTOU
6904557 wc no longer counts number of bytes correctly
6904575 cut -d with multibyte character no longer works
6904597 paste -d no longer works with multibyte characters
6904780 /usr/bin/cksum changed output in snv_128
6904870 uniq -s does not skip multibyte characters correctly
6904878 join -t no longer works with multibyte char separator
6907460 EXIT trap handlers are sometimes executed twice
6909579 libast getopt solaris compatibility broken
6920072 ksh93 tail -f, with unconditional .25s sleep and line parsing, about 37x slower than cat
6932124 mktemp in ksh93 is broken
Contributed by Olga Kryzhanovska <olga.kryzhanovska@gmail.com>
Diffstat (limited to 'usr/src/lib/libshell/common/sh/parse.c')
-rw-r--r-- | usr/src/lib/libshell/common/sh/parse.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/usr/src/lib/libshell/common/sh/parse.c b/usr/src/lib/libshell/common/sh/parse.c index c7290d20e7..28d52ac769 100644 --- a/usr/src/lib/libshell/common/sh/parse.c +++ b/usr/src/lib/libshell/common/sh/parse.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1982-2009 AT&T Intellectual Property * +* Copyright (c) 1982-2010 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * @@ -247,6 +247,34 @@ static Shnode_t *makeparent(Lex_t *lp, int flag, Shnode_t *child) return(par); } +static int paramsub(const char *str) +{ + register int c,sub=0,lit=0; + while(c= *str++) + { + if(c=='$' && !lit) + { + if(*str=='(') + return(0); + if(sub) + continue; + if(*str=='{') + str++; + if(!isdigit(*str) && strchr("?#@*!$ ",*str)==0) + return(1); + } + else if(c=='`') + return(0); + else if(c=='[' && !lit) + sub++; + else if(c==']' && !lit) + sub--; + else if(c=='\'') + lit = !lit; + } + return(0); +} + static Shnode_t *getanode(Lex_t *lp, struct argnod *ap) { register Shnode_t *t = getnode(arithnod); @@ -256,7 +284,11 @@ static Shnode_t *getanode(Lex_t *lp, struct argnod *ap) if(ap->argflag&ARG_RAW) t->ar.arcomp = sh_arithcomp(ap->argval); else + { + if(sh_isoption(SH_NOEXEC) && (ap->argflag&ARG_MAC) && paramsub(ap->argval)) + errormsg(SH_DICT,ERROR_warn(0),"%d: parameter substitution requires unnecessary string to number conversion",lp->sh->inlineno-(lp->token=='\n')); t->ar.arcomp = 0; + } return(t); } @@ -797,6 +829,8 @@ static Shnode_t *funct(Lex_t *lexp) } t->funct.functtre = item(lexp,SH_NOIO); } + else if(shp->shcomp) + exit(1); sh_popcontext(&buff); loop_level = saveloop; label_last = savelabel; @@ -1413,7 +1447,7 @@ static Shnode_t *simple(Lex_t *lexp,int flag, struct ionod *io) *argtail = 0; if(argno>0) argmax = argno; - t->comtyp = TCOM | (argmax<<(COMBITS+2)); + t->comtyp = TCOM; #if SHOPT_KIA if(lexp->kiafile && !(flag&SH_NOIO)) { |