ash: straighten up a bit of code in varvalue()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-11-30 12:16:17 +01:00
parent d0f9d0ed58
commit 8eda4a9005

View File

@ -6349,22 +6349,16 @@ subevalvar(char *p, char *str, int strloc, int subtype,
static NOINLINE ssize_t
varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
{
int num;
const char *p;
int num;
int i;
int sep = 0;
int sepq = 0;
ssize_t len = 0;
char **ap;
int syntax;
int quoted = varflags & VSQUOTE;
int subtype = varflags & VSTYPE;
int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR);
int quoted = varflags & VSQUOTE;
int syntax = quoted ? DQSYNTAX : BASESYNTAX;
if (quoted && (flags & EXP_FULL))
sep = 1 << CHAR_BIT;
syntax = quoted ? DQSYNTAX : BASESYNTAX;
switch (*name) {
case '$':
num = rootpid;
@ -6397,13 +6391,20 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
raise_error_syntax("bad substitution");
#endif
break;
case '@':
if (sep)
case '@': {
char **ap;
int sep;
if (quoted && (flags & EXP_FULL)) {
/* note: this is not meant as PEOF value */
sep = 1 << CHAR_BIT;
goto param;
}
/* fall through */
case '*':
sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' ';
if (quotes && (SIT(sep, syntax) == CCTL || SIT(sep, syntax) == CBACK))
i = SIT(sep, syntax);
if (quotes && (i == CCTL || i == CBACK))
sepq = 1;
param:
ap = shellparam.p;
@ -6428,11 +6429,14 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
q = expdest;
if (sepq)
STPUTC(CTLESC, q);
/* note: may put NUL despite sep != 0
* (see sep = 1 << CHAR_BIT above) */
STPUTC(sep, q);
expdest = q;
}
}
return len;
} /* case '@' and '*' */
case '0':
case '1':
case '2':
@ -6464,7 +6468,8 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
break;
eq++;
if (name_len == (unsigned)(eq - str)
&& strncmp(str, name, name_len) == 0) {
&& strncmp(str, name, name_len) == 0
) {
p = eq;
/* goto value; - WRONG! */
/* think "A=1 A=2 B=$A" */