diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-30 12:16:17 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-30 12:16:17 +0100 |
commit | 8eda4a9005723be93d8f5c0adb33e457e2f54dfe (patch) | |
tree | 42ba6f9382e3839dc013f4b09077ad83c3a34723 | |
parent | d0f9d0ed5867d1ca0fbe96d37f68cfab443e949a (diff) | |
download | busybox-w32-8eda4a9005723be93d8f5c0adb33e457e2f54dfe.tar.gz busybox-w32-8eda4a9005723be93d8f5c0adb33e457e2f54dfe.tar.bz2 busybox-w32-8eda4a9005723be93d8f5c0adb33e457e2f54dfe.zip |
ash: straighten up a bit of code in varvalue()
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/shell/ash.c b/shell/ash.c index a90122149..cf406a42e 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -6349,22 +6349,16 @@ subevalvar(char *p, char *str, int strloc, int subtype, | |||
6349 | static NOINLINE ssize_t | 6349 | static NOINLINE ssize_t |
6350 | varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) | 6350 | varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) |
6351 | { | 6351 | { |
6352 | int num; | ||
6353 | const char *p; | 6352 | const char *p; |
6353 | int num; | ||
6354 | int i; | 6354 | int i; |
6355 | int sep = 0; | ||
6356 | int sepq = 0; | 6355 | int sepq = 0; |
6357 | ssize_t len = 0; | 6356 | ssize_t len = 0; |
6358 | char **ap; | ||
6359 | int syntax; | ||
6360 | int quoted = varflags & VSQUOTE; | ||
6361 | int subtype = varflags & VSTYPE; | 6357 | int subtype = varflags & VSTYPE; |
6362 | int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); | 6358 | int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); |
6359 | int quoted = varflags & VSQUOTE; | ||
6360 | int syntax = quoted ? DQSYNTAX : BASESYNTAX; | ||
6363 | 6361 | ||
6364 | if (quoted && (flags & EXP_FULL)) | ||
6365 | sep = 1 << CHAR_BIT; | ||
6366 | |||
6367 | syntax = quoted ? DQSYNTAX : BASESYNTAX; | ||
6368 | switch (*name) { | 6362 | switch (*name) { |
6369 | case '$': | 6363 | case '$': |
6370 | num = rootpid; | 6364 | num = rootpid; |
@@ -6397,13 +6391,20 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) | |||
6397 | raise_error_syntax("bad substitution"); | 6391 | raise_error_syntax("bad substitution"); |
6398 | #endif | 6392 | #endif |
6399 | break; | 6393 | break; |
6400 | case '@': | 6394 | case '@': { |
6401 | if (sep) | 6395 | char **ap; |
6396 | int sep; | ||
6397 | |||
6398 | if (quoted && (flags & EXP_FULL)) { | ||
6399 | /* note: this is not meant as PEOF value */ | ||
6400 | sep = 1 << CHAR_BIT; | ||
6402 | goto param; | 6401 | goto param; |
6402 | } | ||
6403 | /* fall through */ | 6403 | /* fall through */ |
6404 | case '*': | 6404 | case '*': |
6405 | sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' '; | 6405 | sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' '; |
6406 | if (quotes && (SIT(sep, syntax) == CCTL || SIT(sep, syntax) == CBACK)) | 6406 | i = SIT(sep, syntax); |
6407 | if (quotes && (i == CCTL || i == CBACK)) | ||
6407 | sepq = 1; | 6408 | sepq = 1; |
6408 | param: | 6409 | param: |
6409 | ap = shellparam.p; | 6410 | ap = shellparam.p; |
@@ -6428,11 +6429,14 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) | |||
6428 | q = expdest; | 6429 | q = expdest; |
6429 | if (sepq) | 6430 | if (sepq) |
6430 | STPUTC(CTLESC, q); | 6431 | STPUTC(CTLESC, q); |
6432 | /* note: may put NUL despite sep != 0 | ||
6433 | * (see sep = 1 << CHAR_BIT above) */ | ||
6431 | STPUTC(sep, q); | 6434 | STPUTC(sep, q); |
6432 | expdest = q; | 6435 | expdest = q; |
6433 | } | 6436 | } |
6434 | } | 6437 | } |
6435 | return len; | 6438 | return len; |
6439 | } /* case '@' and '*' */ | ||
6436 | case '0': | 6440 | case '0': |
6437 | case '1': | 6441 | case '1': |
6438 | case '2': | 6442 | case '2': |
@@ -6464,7 +6468,8 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) | |||
6464 | break; | 6468 | break; |
6465 | eq++; | 6469 | eq++; |
6466 | if (name_len == (unsigned)(eq - str) | 6470 | if (name_len == (unsigned)(eq - str) |
6467 | && strncmp(str, name, name_len) == 0) { | 6471 | && strncmp(str, name, name_len) == 0 |
6472 | ) { | ||
6468 | p = eq; | 6473 | p = eq; |
6469 | /* goto value; - WRONG! */ | 6474 | /* goto value; - WRONG! */ |
6470 | /* think "A=1 A=2 B=$A" */ | 6475 | /* think "A=1 A=2 B=$A" */ |