diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-09-16 16:18:32 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-09-16 16:18:32 +0200 |
| commit | b0d63383dd0e78a64458126d09d212f9a3833a17 (patch) | |
| tree | 4f5e12850577267e964cd02f41c544d54d94ee35 /shell | |
| parent | 795633463a1f741eb965147879cfb94f6f8a8e76 (diff) | |
| download | busybox-w32-b0d63383dd0e78a64458126d09d212f9a3833a17.tar.gz busybox-w32-b0d63383dd0e78a64458126d09d212f9a3833a17.tar.bz2 busybox-w32-b0d63383dd0e78a64458126d09d212f9a3833a17.zip | |
ash: preparatory cleanup. The only real changes are (unsigned char) casts
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 105 |
1 files changed, 55 insertions, 50 deletions
diff --git a/shell/ash.c b/shell/ash.c index eca4ab98c..ab13021a3 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -2700,8 +2700,8 @@ SIT(int c, int syntax) | |||
| 2700 | } else | 2700 | } else |
| 2701 | #endif | 2701 | #endif |
| 2702 | { | 2702 | { |
| 2703 | if ((unsigned char)c >= (unsigned char)(CTLESC) | 2703 | if ((unsigned char)c >= CTLESC |
| 2704 | && (unsigned char)c <= (unsigned char)(CTLQUOTEMARK) | 2704 | && (unsigned char)c <= CTLQUOTEMARK |
| 2705 | ) { | 2705 | ) { |
| 2706 | return CCTL; | 2706 | return CCTL; |
| 2707 | } | 2707 | } |
| @@ -5302,7 +5302,7 @@ ash_arith(const char *s) | |||
| 5302 | #define EXP_WORD 0x80 /* expand word in parameter expansion */ | 5302 | #define EXP_WORD 0x80 /* expand word in parameter expansion */ |
| 5303 | #define EXP_QWORD 0x100 /* expand word in quoted parameter expansion */ | 5303 | #define EXP_QWORD 0x100 /* expand word in quoted parameter expansion */ |
| 5304 | /* | 5304 | /* |
| 5305 | * _rmescape() flags | 5305 | * rmescape() flags |
| 5306 | */ | 5306 | */ |
| 5307 | #define RMESCAPE_ALLOC 0x1 /* Allocate a new string */ | 5307 | #define RMESCAPE_ALLOC 0x1 /* Allocate a new string */ |
| 5308 | #define RMESCAPE_GLOB 0x2 /* Add backslashes for glob */ | 5308 | #define RMESCAPE_GLOB 0x2 /* Add backslashes for glob */ |
| @@ -5356,7 +5356,7 @@ esclen(const char *start, const char *p) | |||
| 5356 | { | 5356 | { |
| 5357 | size_t esc = 0; | 5357 | size_t esc = 0; |
| 5358 | 5358 | ||
| 5359 | while (p > start && *--p == CTLESC) { | 5359 | while (p > start && (unsigned char)*--p == CTLESC) { |
| 5360 | esc++; | 5360 | esc++; |
| 5361 | } | 5361 | } |
| 5362 | return esc; | 5362 | return esc; |
| @@ -5372,13 +5372,13 @@ rmescapes(char *str, int flag) | |||
| 5372 | 5372 | ||
| 5373 | char *p, *q, *r; | 5373 | char *p, *q, *r; |
| 5374 | unsigned inquotes; | 5374 | unsigned inquotes; |
| 5375 | int notescaped; | 5375 | unsigned protect_against_glob; |
| 5376 | int globbing; | 5376 | unsigned globbing; |
| 5377 | 5377 | ||
| 5378 | p = strpbrk(str, qchars); | 5378 | p = strpbrk(str, qchars); |
| 5379 | if (!p) { | 5379 | if (!p) |
| 5380 | return str; | 5380 | return str; |
| 5381 | } | 5381 | |
| 5382 | q = p; | 5382 | q = p; |
| 5383 | r = str; | 5383 | r = str; |
| 5384 | if (flag & RMESCAPE_ALLOC) { | 5384 | if (flag & RMESCAPE_ALLOC) { |
| @@ -5397,28 +5397,33 @@ rmescapes(char *str, int flag) | |||
| 5397 | q = (char *)memcpy(q, str, len) + len; | 5397 | q = (char *)memcpy(q, str, len) + len; |
| 5398 | } | 5398 | } |
| 5399 | } | 5399 | } |
| 5400 | |||
| 5400 | inquotes = (flag & RMESCAPE_QUOTED) ^ RMESCAPE_QUOTED; | 5401 | inquotes = (flag & RMESCAPE_QUOTED) ^ RMESCAPE_QUOTED; |
| 5401 | globbing = flag & RMESCAPE_GLOB; | 5402 | globbing = flag & RMESCAPE_GLOB; |
| 5402 | notescaped = globbing; | 5403 | protect_against_glob = globbing; |
| 5403 | while (*p) { | 5404 | while (*p) { |
| 5404 | if (*p == CTLQUOTEMARK) { | 5405 | if (*p == CTLQUOTEMARK) { |
| 5406 | // TODO: if no RMESCAPE_QUOTED in flags, inquotes never becomes 0 | ||
| 5407 | // (alternates between RMESCAPE_QUOTED and ~RMESCAPE_QUOTED). Is it ok? | ||
| 5408 | // Note: both inquotes and protect_against_glob only affect whether | ||
| 5409 | // CTLESC,<ch> gets converted to <ch> or to \<ch> | ||
| 5405 | inquotes = ~inquotes; | 5410 | inquotes = ~inquotes; |
| 5406 | p++; | 5411 | p++; |
| 5407 | notescaped = globbing; | 5412 | protect_against_glob = globbing; |
| 5408 | continue; | 5413 | continue; |
| 5409 | } | 5414 | } |
| 5410 | if (*p == '\\') { | 5415 | if (*p == '\\') { |
| 5411 | /* naked back slash */ | 5416 | /* naked back slash */ |
| 5412 | notescaped = 0; | 5417 | protect_against_glob = 0; |
| 5413 | goto copy; | 5418 | goto copy; |
| 5414 | } | 5419 | } |
| 5415 | if (*p == CTLESC) { | 5420 | if (*p == CTLESC) { |
| 5416 | p++; | 5421 | p++; |
| 5417 | if (notescaped && inquotes && *p != '/') { | 5422 | if (protect_against_glob && inquotes && *p != '/') { |
| 5418 | *q++ = '\\'; | 5423 | *q++ = '\\'; |
| 5419 | } | 5424 | } |
| 5420 | } | 5425 | } |
| 5421 | notescaped = globbing; | 5426 | protect_against_glob = globbing; |
| 5422 | copy: | 5427 | copy: |
| 5423 | *q++ = *p++; | 5428 | *q++ = *p++; |
| 5424 | } | 5429 | } |
| @@ -5541,13 +5546,13 @@ removerecordregions(int endoff) | |||
| 5541 | } | 5546 | } |
| 5542 | 5547 | ||
| 5543 | static char * | 5548 | static char * |
| 5544 | exptilde(char *startp, char *p, int flag) | 5549 | exptilde(char *startp, char *p, int flags) |
| 5545 | { | 5550 | { |
| 5546 | char c; | 5551 | char c; |
| 5547 | char *name; | 5552 | char *name; |
| 5548 | struct passwd *pw; | 5553 | struct passwd *pw; |
| 5549 | const char *home; | 5554 | const char *home; |
| 5550 | int quotes = flag & (EXP_FULL | EXP_CASE); | 5555 | int quotes = flags & (EXP_FULL | EXP_CASE); |
| 5551 | int startloc; | 5556 | int startloc; |
| 5552 | 5557 | ||
| 5553 | name = p + 1; | 5558 | name = p + 1; |
| @@ -5559,7 +5564,7 @@ exptilde(char *startp, char *p, int flag) | |||
| 5559 | case CTLQUOTEMARK: | 5564 | case CTLQUOTEMARK: |
| 5560 | return startp; | 5565 | return startp; |
| 5561 | case ':': | 5566 | case ':': |
| 5562 | if (flag & EXP_VARTILDE) | 5567 | if (flags & EXP_VARTILDE) |
| 5563 | goto done; | 5568 | goto done; |
| 5564 | break; | 5569 | break; |
| 5565 | case '/': | 5570 | case '/': |
| @@ -5774,7 +5779,7 @@ expari(int quotes) | |||
| 5774 | #endif | 5779 | #endif |
| 5775 | 5780 | ||
| 5776 | /* argstr needs it */ | 5781 | /* argstr needs it */ |
| 5777 | static char *evalvar(char *p, int flag, struct strlist *var_str_list); | 5782 | static char *evalvar(char *p, int flags, struct strlist *var_str_list); |
| 5778 | 5783 | ||
| 5779 | /* | 5784 | /* |
| 5780 | * Perform variable and command substitution. If EXP_FULL is set, output CTLESC | 5785 | * Perform variable and command substitution. If EXP_FULL is set, output CTLESC |
| @@ -5786,7 +5791,7 @@ static char *evalvar(char *p, int flag, struct strlist *var_str_list); | |||
| 5786 | * for correct expansion of "B=$A" word. | 5791 | * for correct expansion of "B=$A" word. |
| 5787 | */ | 5792 | */ |
| 5788 | static void | 5793 | static void |
| 5789 | argstr(char *p, int flag, struct strlist *var_str_list) | 5794 | argstr(char *p, int flags, struct strlist *var_str_list) |
| 5790 | { | 5795 | { |
| 5791 | static const char spclchars[] ALIGN1 = { | 5796 | static const char spclchars[] ALIGN1 = { |
| 5792 | '=', | 5797 | '=', |
| @@ -5804,42 +5809,44 @@ argstr(char *p, int flag, struct strlist *var_str_list) | |||
| 5804 | }; | 5809 | }; |
| 5805 | const char *reject = spclchars; | 5810 | const char *reject = spclchars; |
| 5806 | int c; | 5811 | int c; |
| 5807 | int quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */ | 5812 | int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */ |
| 5808 | int breakall = flag & EXP_WORD; | 5813 | int breakall = flags & EXP_WORD; |
| 5809 | int inquotes; | 5814 | int inquotes; |
| 5810 | size_t length; | 5815 | size_t length; |
| 5811 | int startloc; | 5816 | int startloc; |
| 5812 | 5817 | ||
| 5813 | if (!(flag & EXP_VARTILDE)) { | 5818 | if (!(flags & EXP_VARTILDE)) { |
| 5814 | reject += 2; | 5819 | reject += 2; |
| 5815 | } else if (flag & EXP_VARTILDE2) { | 5820 | } else if (flags & EXP_VARTILDE2) { |
| 5816 | reject++; | 5821 | reject++; |
| 5817 | } | 5822 | } |
| 5818 | inquotes = 0; | 5823 | inquotes = 0; |
| 5819 | length = 0; | 5824 | length = 0; |
| 5820 | if (flag & EXP_TILDE) { | 5825 | if (flags & EXP_TILDE) { |
| 5821 | char *q; | 5826 | char *q; |
| 5822 | 5827 | ||
| 5823 | flag &= ~EXP_TILDE; | 5828 | flags &= ~EXP_TILDE; |
| 5824 | tilde: | 5829 | tilde: |
| 5825 | q = p; | 5830 | q = p; |
| 5826 | if (*q == CTLESC && (flag & EXP_QWORD)) | 5831 | if (*q == CTLESC && (flags & EXP_QWORD)) |
| 5827 | q++; | 5832 | q++; |
| 5828 | if (*q == '~') | 5833 | if (*q == '~') |
| 5829 | p = exptilde(p, q, flag); | 5834 | p = exptilde(p, q, flags); |
| 5830 | } | 5835 | } |
| 5831 | start: | 5836 | start: |
| 5832 | startloc = expdest - (char *)stackblock(); | 5837 | startloc = expdest - (char *)stackblock(); |
| 5833 | for (;;) { | 5838 | for (;;) { |
| 5834 | length += strcspn(p + length, reject); | 5839 | length += strcspn(p + length, reject); |
| 5835 | c = p[length]; | 5840 | c = (unsigned char) p[length]; |
| 5836 | if (c && (!(c & 0x80) | 5841 | if (c) { |
| 5842 | if (!(c & 0x80) | ||
| 5837 | #if ENABLE_SH_MATH_SUPPORT | 5843 | #if ENABLE_SH_MATH_SUPPORT |
| 5838 | || c == CTLENDARI | 5844 | || c == CTLENDARI |
| 5839 | #endif | 5845 | #endif |
| 5840 | )) { | 5846 | ) { |
| 5841 | /* c == '=' || c == ':' || c == CTLENDARI */ | 5847 | /* c == '=' || c == ':' || c == CTLENDARI */ |
| 5842 | length++; | 5848 | length++; |
| 5849 | } | ||
| 5843 | } | 5850 | } |
| 5844 | if (length > 0) { | 5851 | if (length > 0) { |
| 5845 | int newloc; | 5852 | int newloc; |
| @@ -5857,11 +5864,11 @@ argstr(char *p, int flag, struct strlist *var_str_list) | |||
| 5857 | case '\0': | 5864 | case '\0': |
| 5858 | goto breakloop; | 5865 | goto breakloop; |
| 5859 | case '=': | 5866 | case '=': |
| 5860 | if (flag & EXP_VARTILDE2) { | 5867 | if (flags & EXP_VARTILDE2) { |
| 5861 | p--; | 5868 | p--; |
| 5862 | continue; | 5869 | continue; |
| 5863 | } | 5870 | } |
| 5864 | flag |= EXP_VARTILDE2; | 5871 | flags |= EXP_VARTILDE2; |
| 5865 | reject++; | 5872 | reject++; |
| 5866 | /* fall through */ | 5873 | /* fall through */ |
| 5867 | case ':': | 5874 | case ':': |
| @@ -5880,15 +5887,13 @@ argstr(char *p, int flag, struct strlist *var_str_list) | |||
| 5880 | goto breakloop; | 5887 | goto breakloop; |
| 5881 | case CTLQUOTEMARK: | 5888 | case CTLQUOTEMARK: |
| 5882 | /* "$@" syntax adherence hack */ | 5889 | /* "$@" syntax adherence hack */ |
| 5883 | if ( | 5890 | if (!inquotes |
| 5884 | !inquotes && | 5891 | && memcmp(p, dolatstr, 4) == 0 |
| 5885 | !memcmp(p, dolatstr, 4) && | 5892 | && ( p[4] == CTLQUOTEMARK |
| 5886 | (p[4] == CTLQUOTEMARK || ( | 5893 | || (p[4] == CTLENDVAR && p[5] == CTLQUOTEMARK) |
| 5887 | p[4] == CTLENDVAR && | 5894 | ) |
| 5888 | p[5] == CTLQUOTEMARK | ||
| 5889 | )) | ||
| 5890 | ) { | 5895 | ) { |
| 5891 | p = evalvar(p + 1, flag, /* var_str_list: */ NULL) + 1; | 5896 | p = evalvar(p + 1, flags, /* var_str_list: */ NULL) + 1; |
| 5892 | goto start; | 5897 | goto start; |
| 5893 | } | 5898 | } |
| 5894 | inquotes = !inquotes; | 5899 | inquotes = !inquotes; |
| @@ -5904,10 +5909,10 @@ argstr(char *p, int flag, struct strlist *var_str_list) | |||
| 5904 | length++; | 5909 | length++; |
| 5905 | goto addquote; | 5910 | goto addquote; |
| 5906 | case CTLVAR: | 5911 | case CTLVAR: |
| 5907 | p = evalvar(p, flag, var_str_list); | 5912 | p = evalvar(p, flags, var_str_list); |
| 5908 | goto start; | 5913 | goto start; |
| 5909 | case CTLBACKQ: | 5914 | case CTLBACKQ: |
| 5910 | c = 0; | 5915 | c = '\0'; |
| 5911 | case CTLBACKQ|CTLQUOTE: | 5916 | case CTLBACKQ|CTLQUOTE: |
| 5912 | expbackq(argbackq->n, c, quotes); | 5917 | expbackq(argbackq->n, c, quotes); |
| 5913 | argbackq = argbackq->next; | 5918 | argbackq = argbackq->next; |
| @@ -6452,7 +6457,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list) | |||
| 6452 | * input string. | 6457 | * input string. |
| 6453 | */ | 6458 | */ |
| 6454 | static char * | 6459 | static char * |
| 6455 | evalvar(char *p, int flag, struct strlist *var_str_list) | 6460 | evalvar(char *p, int flags, struct strlist *var_str_list) |
| 6456 | { | 6461 | { |
| 6457 | char varflags; | 6462 | char varflags; |
| 6458 | char subtype; | 6463 | char subtype; |
| @@ -6463,7 +6468,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
| 6463 | int startloc; | 6468 | int startloc; |
| 6464 | ssize_t varlen; | 6469 | ssize_t varlen; |
| 6465 | 6470 | ||
| 6466 | varflags = *p++; | 6471 | varflags = (unsigned char) *p++; |
| 6467 | subtype = varflags & VSTYPE; | 6472 | subtype = varflags & VSTYPE; |
| 6468 | quoted = varflags & VSQUOTE; | 6473 | quoted = varflags & VSQUOTE; |
| 6469 | var = p; | 6474 | var = p; |
| @@ -6472,7 +6477,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
| 6472 | p = strchr(p, '=') + 1; | 6477 | p = strchr(p, '=') + 1; |
| 6473 | 6478 | ||
| 6474 | again: | 6479 | again: |
| 6475 | varlen = varvalue(var, varflags, flag, var_str_list); | 6480 | varlen = varvalue(var, varflags, flags, var_str_list); |
| 6476 | if (varflags & VSNUL) | 6481 | if (varflags & VSNUL) |
| 6477 | varlen--; | 6482 | varlen--; |
| 6478 | 6483 | ||
| @@ -6485,8 +6490,8 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
| 6485 | vsplus: | 6490 | vsplus: |
| 6486 | if (varlen < 0) { | 6491 | if (varlen < 0) { |
| 6487 | argstr( | 6492 | argstr( |
| 6488 | p, flag | EXP_TILDE | | 6493 | p, flags | EXP_TILDE | |
| 6489 | (quoted ? EXP_QWORD : EXP_WORD), | 6494 | (quoted ? EXP_QWORD : EXP_WORD), |
| 6490 | var_str_list | 6495 | var_str_list |
| 6491 | ); | 6496 | ); |
| 6492 | goto end; | 6497 | goto end; |
| @@ -6558,7 +6563,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
| 6558 | patloc = expdest - (char *)stackblock(); | 6563 | patloc = expdest - (char *)stackblock(); |
| 6559 | if (0 == subevalvar(p, /* str: */ NULL, patloc, subtype, | 6564 | if (0 == subevalvar(p, /* str: */ NULL, patloc, subtype, |
| 6560 | startloc, varflags, | 6565 | startloc, varflags, |
| 6561 | /* quotes: */ flag & (EXP_FULL | EXP_CASE), | 6566 | /* quotes: */ flags & (EXP_FULL | EXP_CASE), |
| 6562 | var_str_list) | 6567 | var_str_list) |
| 6563 | ) { | 6568 | ) { |
| 6564 | int amount = expdest - ( | 6569 | int amount = expdest - ( |
