aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-11-30 12:16:17 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-11-30 12:16:17 +0100
commit8eda4a9005723be93d8f5c0adb33e457e2f54dfe (patch)
tree42ba6f9382e3839dc013f4b09077ad83c3a34723
parentd0f9d0ed5867d1ca0fbe96d37f68cfab443e949a (diff)
downloadbusybox-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.c31
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,
6349static NOINLINE ssize_t 6349static NOINLINE ssize_t
6350varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) 6350varvalue(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" */