mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Port more shell lint improvements from illumos and ksh93v- (#374)
This commit adds onto <https://github.com/ksh93/ksh/pull/353> by porting over two additional improvements to the shell linter: 1) The changes in the aforementioned pull request were merged into illumos-gate with an additional change.[*] The illumos revision of the patch improved the warning for (( $foo = $? )) to specify '$foo' causes the warning.[**] Example: $ ksh -n -c '(( $? != $bar ))' ksh: warning: line 1: in '(( $? != $bar ))', using '$' as in '$bar' is slower and can introduce rounding errors While I was porting the illumos patch I did notice one problem. The string it uses from paramsub() skips over the initial '{' in '${var}', resulting in the warning printing '$var}' instead: $ ksh -n -c '(( ${.sh.pid} != $$ ))' ... in '(( ${.sh.pid} != $$ ))', using '$' as in '$.sh.pid}' is slower ... This was fixed by including the missing '{' in the string returned by paramsub for ${var} variables. 2) In ksh93v-, parsing x=$((expr)) with the shell linter will cause ksh to warn the user x=$((expr)) is slower than ((x=expr)). This improvement has been backported with a modified warning: # Result from this commit $ ksh -n -c 'x=$((1 + 2))' ksh: warning: line 1: x=$((1 + 2)) is slower than ((x=1 + 2)) # Result from ksh93v- $ ksh93v -n -c 'x=$((1 + 2))' ksh93v: warning: line 1: ((x=1 + 2)) is more efficient than x=$((1 + 2)) Minor note: the ksh93v- patch had an invalid use of memcmp; this version of the patch uses strncmp instead. References:be548e87bc65722363_22fdf8e7/
This commit is contained in:
parent
66a50ece82
commit
cd562b16e2
5 changed files with 36 additions and 8 deletions
|
|
@ -250,7 +250,7 @@ static Shnode_t *makeparent(Lex_t *lp, int flag, Shnode_t *child)
|
|||
return(par);
|
||||
}
|
||||
|
||||
static int paramsub(const char *str)
|
||||
static const char *paramsub(const char *str)
|
||||
{
|
||||
register int c,sub=0,lit=0;
|
||||
while(c= *str++)
|
||||
|
|
@ -258,16 +258,20 @@ static int paramsub(const char *str)
|
|||
if(c=='$' && !lit)
|
||||
{
|
||||
if(*str=='(')
|
||||
return(0);
|
||||
return(NIL(const char*));
|
||||
if(sub)
|
||||
continue;
|
||||
if(*str=='{')
|
||||
str++;
|
||||
if(!isdigit(*str) && strchr("?#@*!$ ",*str)==0)
|
||||
return(1);
|
||||
{
|
||||
if(str[-1]=='{')
|
||||
str--; /* variable in the form of ${var} */
|
||||
return(str);
|
||||
}
|
||||
}
|
||||
else if(c=='`')
|
||||
return(0);
|
||||
return(NIL(const char*));
|
||||
else if(c=='[' && !lit)
|
||||
sub++;
|
||||
else if(c==']' && !lit)
|
||||
|
|
@ -275,7 +279,7 @@ static int paramsub(const char *str)
|
|||
else if(c=='\'')
|
||||
lit = !lit;
|
||||
}
|
||||
return(0);
|
||||
return(NIL(const char*));
|
||||
}
|
||||
|
||||
static Shnode_t *getanode(Lex_t *lp, struct argnod *ap)
|
||||
|
|
@ -288,8 +292,15 @@ static Shnode_t *getanode(Lex_t *lp, struct argnod *ap)
|
|||
t->ar.arcomp = sh_arithcomp(lp->sh,ap->argval);
|
||||
else
|
||||
{
|
||||
if(sh_isoption(SH_NOEXEC) && (ap->argflag&ARG_MAC) && paramsub(ap->argval))
|
||||
errormsg(SH_DICT,ERROR_warn(0),e_lexwarnvar,lp->sh->inlineno,ap->argval);
|
||||
const char *p, *q;
|
||||
if(sh_isoption(SH_NOEXEC) && (ap->argflag&ARG_MAC) &&
|
||||
((p = paramsub(ap->argval)) != NIL(const char*)))
|
||||
{
|
||||
for(q = p; !isspace(*q) && *q != '\0'; q++)
|
||||
;
|
||||
errormsg(SH_DICT, ERROR_warn(0), e_lexwarnvar,
|
||||
lp->sh->inlineno, ap->argval, q - p, p);
|
||||
}
|
||||
t->ar.arcomp = 0;
|
||||
}
|
||||
return(t);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue