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 /shell | |
| 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>
Diffstat (limited to 'shell')
| -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" */ |
