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 - ( |