mirror of
https://github.com/sheumann/hush.git
synced 2025-02-22 10:29:10 +00:00
ash: preparatory cleanup. The only real changes are (unsigned char) casts
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
795633463a
commit
b0d63383dd
97
shell/ash.c
97
shell/ash.c
@ -2700,8 +2700,8 @@ SIT(int c, int syntax)
|
|||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if ((unsigned char)c >= (unsigned char)(CTLESC)
|
if ((unsigned char)c >= CTLESC
|
||||||
&& (unsigned char)c <= (unsigned char)(CTLQUOTEMARK)
|
&& (unsigned char)c <= CTLQUOTEMARK
|
||||||
) {
|
) {
|
||||||
return CCTL;
|
return CCTL;
|
||||||
}
|
}
|
||||||
@ -5302,7 +5302,7 @@ ash_arith(const char *s)
|
|||||||
#define EXP_WORD 0x80 /* expand word in parameter expansion */
|
#define EXP_WORD 0x80 /* expand word in parameter expansion */
|
||||||
#define EXP_QWORD 0x100 /* expand word in quoted parameter expansion */
|
#define EXP_QWORD 0x100 /* expand word in quoted parameter expansion */
|
||||||
/*
|
/*
|
||||||
* _rmescape() flags
|
* rmescape() flags
|
||||||
*/
|
*/
|
||||||
#define RMESCAPE_ALLOC 0x1 /* Allocate a new string */
|
#define RMESCAPE_ALLOC 0x1 /* Allocate a new string */
|
||||||
#define RMESCAPE_GLOB 0x2 /* Add backslashes for glob */
|
#define RMESCAPE_GLOB 0x2 /* Add backslashes for glob */
|
||||||
@ -5356,7 +5356,7 @@ esclen(const char *start, const char *p)
|
|||||||
{
|
{
|
||||||
size_t esc = 0;
|
size_t esc = 0;
|
||||||
|
|
||||||
while (p > start && *--p == CTLESC) {
|
while (p > start && (unsigned char)*--p == CTLESC) {
|
||||||
esc++;
|
esc++;
|
||||||
}
|
}
|
||||||
return esc;
|
return esc;
|
||||||
@ -5372,13 +5372,13 @@ rmescapes(char *str, int flag)
|
|||||||
|
|
||||||
char *p, *q, *r;
|
char *p, *q, *r;
|
||||||
unsigned inquotes;
|
unsigned inquotes;
|
||||||
int notescaped;
|
unsigned protect_against_glob;
|
||||||
int globbing;
|
unsigned globbing;
|
||||||
|
|
||||||
p = strpbrk(str, qchars);
|
p = strpbrk(str, qchars);
|
||||||
if (!p) {
|
if (!p)
|
||||||
return str;
|
return str;
|
||||||
}
|
|
||||||
q = p;
|
q = p;
|
||||||
r = str;
|
r = str;
|
||||||
if (flag & RMESCAPE_ALLOC) {
|
if (flag & RMESCAPE_ALLOC) {
|
||||||
@ -5397,28 +5397,33 @@ rmescapes(char *str, int flag)
|
|||||||
q = (char *)memcpy(q, str, len) + len;
|
q = (char *)memcpy(q, str, len) + len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inquotes = (flag & RMESCAPE_QUOTED) ^ RMESCAPE_QUOTED;
|
inquotes = (flag & RMESCAPE_QUOTED) ^ RMESCAPE_QUOTED;
|
||||||
globbing = flag & RMESCAPE_GLOB;
|
globbing = flag & RMESCAPE_GLOB;
|
||||||
notescaped = globbing;
|
protect_against_glob = globbing;
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (*p == CTLQUOTEMARK) {
|
if (*p == CTLQUOTEMARK) {
|
||||||
|
// TODO: if no RMESCAPE_QUOTED in flags, inquotes never becomes 0
|
||||||
|
// (alternates between RMESCAPE_QUOTED and ~RMESCAPE_QUOTED). Is it ok?
|
||||||
|
// Note: both inquotes and protect_against_glob only affect whether
|
||||||
|
// CTLESC,<ch> gets converted to <ch> or to \<ch>
|
||||||
inquotes = ~inquotes;
|
inquotes = ~inquotes;
|
||||||
p++;
|
p++;
|
||||||
notescaped = globbing;
|
protect_against_glob = globbing;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*p == '\\') {
|
if (*p == '\\') {
|
||||||
/* naked back slash */
|
/* naked back slash */
|
||||||
notescaped = 0;
|
protect_against_glob = 0;
|
||||||
goto copy;
|
goto copy;
|
||||||
}
|
}
|
||||||
if (*p == CTLESC) {
|
if (*p == CTLESC) {
|
||||||
p++;
|
p++;
|
||||||
if (notescaped && inquotes && *p != '/') {
|
if (protect_against_glob && inquotes && *p != '/') {
|
||||||
*q++ = '\\';
|
*q++ = '\\';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
notescaped = globbing;
|
protect_against_glob = globbing;
|
||||||
copy:
|
copy:
|
||||||
*q++ = *p++;
|
*q++ = *p++;
|
||||||
}
|
}
|
||||||
@ -5541,13 +5546,13 @@ removerecordregions(int endoff)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
exptilde(char *startp, char *p, int flag)
|
exptilde(char *startp, char *p, int flags)
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
char *name;
|
char *name;
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
const char *home;
|
const char *home;
|
||||||
int quotes = flag & (EXP_FULL | EXP_CASE);
|
int quotes = flags & (EXP_FULL | EXP_CASE);
|
||||||
int startloc;
|
int startloc;
|
||||||
|
|
||||||
name = p + 1;
|
name = p + 1;
|
||||||
@ -5559,7 +5564,7 @@ exptilde(char *startp, char *p, int flag)
|
|||||||
case CTLQUOTEMARK:
|
case CTLQUOTEMARK:
|
||||||
return startp;
|
return startp;
|
||||||
case ':':
|
case ':':
|
||||||
if (flag & EXP_VARTILDE)
|
if (flags & EXP_VARTILDE)
|
||||||
goto done;
|
goto done;
|
||||||
break;
|
break;
|
||||||
case '/':
|
case '/':
|
||||||
@ -5774,7 +5779,7 @@ expari(int quotes)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* argstr needs it */
|
/* argstr needs it */
|
||||||
static char *evalvar(char *p, int flag, struct strlist *var_str_list);
|
static char *evalvar(char *p, int flags, struct strlist *var_str_list);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform variable and command substitution. If EXP_FULL is set, output CTLESC
|
* 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);
|
|||||||
* for correct expansion of "B=$A" word.
|
* for correct expansion of "B=$A" word.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
argstr(char *p, int flag, struct strlist *var_str_list)
|
argstr(char *p, int flags, struct strlist *var_str_list)
|
||||||
{
|
{
|
||||||
static const char spclchars[] ALIGN1 = {
|
static const char spclchars[] ALIGN1 = {
|
||||||
'=',
|
'=',
|
||||||
@ -5804,43 +5809,45 @@ argstr(char *p, int flag, struct strlist *var_str_list)
|
|||||||
};
|
};
|
||||||
const char *reject = spclchars;
|
const char *reject = spclchars;
|
||||||
int c;
|
int c;
|
||||||
int quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */
|
int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */
|
||||||
int breakall = flag & EXP_WORD;
|
int breakall = flags & EXP_WORD;
|
||||||
int inquotes;
|
int inquotes;
|
||||||
size_t length;
|
size_t length;
|
||||||
int startloc;
|
int startloc;
|
||||||
|
|
||||||
if (!(flag & EXP_VARTILDE)) {
|
if (!(flags & EXP_VARTILDE)) {
|
||||||
reject += 2;
|
reject += 2;
|
||||||
} else if (flag & EXP_VARTILDE2) {
|
} else if (flags & EXP_VARTILDE2) {
|
||||||
reject++;
|
reject++;
|
||||||
}
|
}
|
||||||
inquotes = 0;
|
inquotes = 0;
|
||||||
length = 0;
|
length = 0;
|
||||||
if (flag & EXP_TILDE) {
|
if (flags & EXP_TILDE) {
|
||||||
char *q;
|
char *q;
|
||||||
|
|
||||||
flag &= ~EXP_TILDE;
|
flags &= ~EXP_TILDE;
|
||||||
tilde:
|
tilde:
|
||||||
q = p;
|
q = p;
|
||||||
if (*q == CTLESC && (flag & EXP_QWORD))
|
if (*q == CTLESC && (flags & EXP_QWORD))
|
||||||
q++;
|
q++;
|
||||||
if (*q == '~')
|
if (*q == '~')
|
||||||
p = exptilde(p, q, flag);
|
p = exptilde(p, q, flags);
|
||||||
}
|
}
|
||||||
start:
|
start:
|
||||||
startloc = expdest - (char *)stackblock();
|
startloc = expdest - (char *)stackblock();
|
||||||
for (;;) {
|
for (;;) {
|
||||||
length += strcspn(p + length, reject);
|
length += strcspn(p + length, reject);
|
||||||
c = p[length];
|
c = (unsigned char) p[length];
|
||||||
if (c && (!(c & 0x80)
|
if (c) {
|
||||||
|
if (!(c & 0x80)
|
||||||
#if ENABLE_SH_MATH_SUPPORT
|
#if ENABLE_SH_MATH_SUPPORT
|
||||||
|| c == CTLENDARI
|
|| c == CTLENDARI
|
||||||
#endif
|
#endif
|
||||||
)) {
|
) {
|
||||||
/* c == '=' || c == ':' || c == CTLENDARI */
|
/* c == '=' || c == ':' || c == CTLENDARI */
|
||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
int newloc;
|
int newloc;
|
||||||
expdest = stack_nputstr(p, length, expdest);
|
expdest = stack_nputstr(p, length, expdest);
|
||||||
@ -5857,11 +5864,11 @@ argstr(char *p, int flag, struct strlist *var_str_list)
|
|||||||
case '\0':
|
case '\0':
|
||||||
goto breakloop;
|
goto breakloop;
|
||||||
case '=':
|
case '=':
|
||||||
if (flag & EXP_VARTILDE2) {
|
if (flags & EXP_VARTILDE2) {
|
||||||
p--;
|
p--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
flag |= EXP_VARTILDE2;
|
flags |= EXP_VARTILDE2;
|
||||||
reject++;
|
reject++;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case ':':
|
case ':':
|
||||||
@ -5880,15 +5887,13 @@ argstr(char *p, int flag, struct strlist *var_str_list)
|
|||||||
goto breakloop;
|
goto breakloop;
|
||||||
case CTLQUOTEMARK:
|
case CTLQUOTEMARK:
|
||||||
/* "$@" syntax adherence hack */
|
/* "$@" syntax adherence hack */
|
||||||
if (
|
if (!inquotes
|
||||||
!inquotes &&
|
&& memcmp(p, dolatstr, 4) == 0
|
||||||
!memcmp(p, dolatstr, 4) &&
|
&& ( p[4] == CTLQUOTEMARK
|
||||||
(p[4] == CTLQUOTEMARK || (
|
|| (p[4] == CTLENDVAR && p[5] == CTLQUOTEMARK)
|
||||||
p[4] == CTLENDVAR &&
|
)
|
||||||
p[5] == CTLQUOTEMARK
|
|
||||||
))
|
|
||||||
) {
|
) {
|
||||||
p = evalvar(p + 1, flag, /* var_str_list: */ NULL) + 1;
|
p = evalvar(p + 1, flags, /* var_str_list: */ NULL) + 1;
|
||||||
goto start;
|
goto start;
|
||||||
}
|
}
|
||||||
inquotes = !inquotes;
|
inquotes = !inquotes;
|
||||||
@ -5904,10 +5909,10 @@ argstr(char *p, int flag, struct strlist *var_str_list)
|
|||||||
length++;
|
length++;
|
||||||
goto addquote;
|
goto addquote;
|
||||||
case CTLVAR:
|
case CTLVAR:
|
||||||
p = evalvar(p, flag, var_str_list);
|
p = evalvar(p, flags, var_str_list);
|
||||||
goto start;
|
goto start;
|
||||||
case CTLBACKQ:
|
case CTLBACKQ:
|
||||||
c = 0;
|
c = '\0';
|
||||||
case CTLBACKQ|CTLQUOTE:
|
case CTLBACKQ|CTLQUOTE:
|
||||||
expbackq(argbackq->n, c, quotes);
|
expbackq(argbackq->n, c, quotes);
|
||||||
argbackq = argbackq->next;
|
argbackq = argbackq->next;
|
||||||
@ -6452,7 +6457,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
|
|||||||
* input string.
|
* input string.
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
evalvar(char *p, int flag, struct strlist *var_str_list)
|
evalvar(char *p, int flags, struct strlist *var_str_list)
|
||||||
{
|
{
|
||||||
char varflags;
|
char varflags;
|
||||||
char subtype;
|
char subtype;
|
||||||
@ -6463,7 +6468,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
|
|||||||
int startloc;
|
int startloc;
|
||||||
ssize_t varlen;
|
ssize_t varlen;
|
||||||
|
|
||||||
varflags = *p++;
|
varflags = (unsigned char) *p++;
|
||||||
subtype = varflags & VSTYPE;
|
subtype = varflags & VSTYPE;
|
||||||
quoted = varflags & VSQUOTE;
|
quoted = varflags & VSQUOTE;
|
||||||
var = p;
|
var = p;
|
||||||
@ -6472,7 +6477,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
|
|||||||
p = strchr(p, '=') + 1;
|
p = strchr(p, '=') + 1;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
varlen = varvalue(var, varflags, flag, var_str_list);
|
varlen = varvalue(var, varflags, flags, var_str_list);
|
||||||
if (varflags & VSNUL)
|
if (varflags & VSNUL)
|
||||||
varlen--;
|
varlen--;
|
||||||
|
|
||||||
@ -6485,7 +6490,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
|
|||||||
vsplus:
|
vsplus:
|
||||||
if (varlen < 0) {
|
if (varlen < 0) {
|
||||||
argstr(
|
argstr(
|
||||||
p, flag | EXP_TILDE |
|
p, flags | EXP_TILDE |
|
||||||
(quoted ? EXP_QWORD : EXP_WORD),
|
(quoted ? EXP_QWORD : EXP_WORD),
|
||||||
var_str_list
|
var_str_list
|
||||||
);
|
);
|
||||||
@ -6558,7 +6563,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
|
|||||||
patloc = expdest - (char *)stackblock();
|
patloc = expdest - (char *)stackblock();
|
||||||
if (0 == subevalvar(p, /* str: */ NULL, patloc, subtype,
|
if (0 == subevalvar(p, /* str: */ NULL, patloc, subtype,
|
||||||
startloc, varflags,
|
startloc, varflags,
|
||||||
/* quotes: */ flag & (EXP_FULL | EXP_CASE),
|
/* quotes: */ flags & (EXP_FULL | EXP_CASE),
|
||||||
var_str_list)
|
var_str_list)
|
||||||
) {
|
) {
|
||||||
int amount = expdest - (
|
int amount = expdest - (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user