aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-09-16 16:18:32 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-09-16 16:18:32 +0200
commitb0d63383dd0e78a64458126d09d212f9a3833a17 (patch)
tree4f5e12850577267e964cd02f41c544d54d94ee35 /shell
parent795633463a1f741eb965147879cfb94f6f8a8e76 (diff)
downloadbusybox-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.c105
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
5543static char * 5548static char *
5544exptilde(char *startp, char *p, int flag) 5549exptilde(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 */
5777static char *evalvar(char *p, int flag, struct strlist *var_str_list); 5782static 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 */
5788static void 5793static void
5789argstr(char *p, int flag, struct strlist *var_str_list) 5794argstr(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 */
6454static char * 6459static char *
6455evalvar(char *p, int flag, struct strlist *var_str_list) 6460evalvar(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 - (