On Sat, Feb 04, 2006 at 10:47:09AM +0000, Gerrit Pape wrote:
>
> Hi Herbert, I can confirm this. '\201' is used as CTLESC, and removed
> on expansion it seems. Sorry, I don't have a patch to suggest this
> time.
Yes this is a real bug. Here is the patch that should fix this.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
diff --git a/COPYING b/COPYING
diff --git a/ChangeLog.O b/ChangeLog.O
diff --git a/Makefile.am b/Makefile.am
diff --git a/configure.ac b/configure.ac
diff --git a/src/expand.c b/src/expand.c
index dafb51f..cf64921 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -171,7 +171,7 @@
esclen(const char *start, const char *p) {
size_t esc = 0;
- while (p > start && *--p == CTLESC) {
+ while (p > start && *--p == (char)CTLESC) {
esc++;
}
return esc;
@@ -296,7 +296,7 @@
flag &= ~EXP_TILDE;
tilde:
q = p;
- if (*q == CTLESC && (flag & EXP_QWORD))
+ if (*q == (char)CTLESC && (flag & EXP_QWORD))
q++;
if (*q == '~')
p = exptilde(p, q, flag);
@@ -305,7 +305,7 @@
startloc = expdest - (char *)stackblock();
for (;;) {
length += strcspn(p + length, reject);
- c = p[length];
+ c = (signed char)p[length];
if (c && (!(c & 0x80) || c == CTLENDARI)) {
/* c == '=' || c == ':' || c == CTLENDARI */
length++;
@@ -352,9 +352,9 @@
if (
!inquotes &&
!memcmp(p, dolatstr, DOLATSTRLEN) &&
- (p[4] == CTLQUOTEMARK || (
- p[4] == CTLENDVAR &&
- p[5] == CTLQUOTEMARK
+ (p[4] == (char)CTLQUOTEMARK || (
+ p[4] == (char)CTLENDVAR &&
+ p[5] == (char)CTLQUOTEMARK
))
) {
p = evalvar(p + 1, flag) + 1;
@@ -394,7 +394,7 @@
STATIC char *
exptilde(char *startp, char *p, int flag)
{
- char c;
+ signed char c;
char *name;
const char *home;
int quotes = flag & QUOTES_ESC;
@@ -503,7 +503,7 @@
do {
int esc;
- while (*p != CTLARI) {
+ while (*p != (char)CTLARI) {
p--;
#ifdef DEBUG
if (p < start) {
@@ -626,7 +626,7 @@
*loc2 = c;
if (match)
return loc;
- if (quotes && *loc == CTLESC)
+ if (quotes && *loc == (char)CTLESC)
loc++;
loc++;
loc2++;
@@ -860,7 +860,7 @@
if (subtype != VSNORMAL) { /* skip to end of alternative */
int nesting = 1;
for (;;) {
- if ((c = *p++) == CTLESC)
+ if ((c = (signed char)*p++) == CTLESC)
p++;
else if (c == CTLBACKQ || c == (CTLBACKQ|CTLQUOTE)) {
if (varlen >= 0)
@@ -892,7 +892,7 @@
q = makestrspace(len * 2, expdest);
do {
- int c = (unsigned char)*p++;
+ int c = (signed char)*p++;
if (c) {
if ((quotes & QUOTES_ESC) &&
(syntax[c] == CCTL || syntax[c] == CBACK))
@@ -1078,7 +1078,7 @@
ifsspc = 0;
while (p < string + ifsp->endoff) {
q = p;
- if (*p == CTLESC)
+ if (*p == (char)CTLESC)
p++;
if (strchr(ifs, *p)) {
if (!nulonly)
@@ -1101,7 +1101,7 @@
break;
}
q = p;
- if (*p == CTLESC)
+ if (*p == (char)CTLESC)
p++;
if (strchr(ifs, *p) ==
NULL ) {
p = q;
@@ -1658,7 +1658,7 @@
globbing = flag & RMESCAPE_GLOB;
notescaped = globbing;
while (*p) {
- if (*p == CTLQUOTEMARK) {
+ if (*p == (char)CTLQUOTEMARK) {
inquotes = ~inquotes;
p++;
notescaped = globbing;
@@ -1669,7 +1669,7 @@
notescaped = 0;
goto copy;
}
- if (*p == CTLESC) {
+ if (*p == (char)CTLESC) {
p++;
if (notescaped && inquotes && *p != '/') {
*q++ = '\\';
@@ -1734,7 +1734,7 @@
tail = nullstr;
msg = "parameter not set";
if (umsg) {
- if (*end == CTLENDVAR) {
+ if (*end == (char)CTLENDVAR) {
if (varflags & VSNUL)
tail = " or null";
} else
diff --git a/src/input.c b/src/input.c
index 639c023..057da71 100644
--- a/src/input.c
+++ b/src/input.c
@@ -263,7 +263,7 @@
}
popstring();
if (--parsenleft >= 0)
- return (*parsenextc++);
+ return (signed char)*parsenextc++;
}
if (unlikely(parsenleft == EOF_NLEFT || parsefile->buf == NULL))
return PEOF;
@@ -346,7 +346,7 @@
*q = savec;
- return *parsenextc++;
+ return (signed char)*parsenextc++;
}
/*
diff --git a/src/input.h b/src/input.h
index 7675653..1ed9ddf 100644
--- a/src/input.h
+++ b/src/input.h
@@ -64,4 +64,5 @@
void popallfiles(void);
void closescript(void);
-#define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer())
+#define pgetc_macro() \
+ (--parsenleft >= 0 ? (signed char)*parsenextc++ : preadbuffer())
diff --git a/src/jobs.c b/src/jobs.c
index 0113354..9e28adb 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -1357,8 +1357,9 @@
cmdputs(const char *s)
{
const char *p, *str;
- char c, cc[2] = " ";
+ char cc[2] = " ";
char *nextc;
+ signed char c;
int subtype = 0;
int quoted = 0;
static const char vstype[VSTYPE + 1][4] = {
diff --git a/src/mksyntax.c b/src/mksyntax.c
index 5e65bdd..7a8a9ae 100644
--- a/src/mksyntax.c
+++ b/src/mksyntax.c
@@ -92,34 +92,20 @@
static FILE *cfile;
static FILE *hfile;
static char *syntax[513];
-static int base;
-static int size; /* number of values which a char variable can have */
-static int nbits; /* number of bits in a character */
-static int digit_contig;/* true if digits are contiguous */
-
+
static void filltable(char *);
static void init(void);
static void add(char *, char *);
static void print(char *);
-static void output_type_macros(int);
-static void digit_convert(void);
+static void output_type_macros(void);
int main(int, char **);
int
main(int argc, char **argv)
-{
-#ifdef TARGET_CHAR
- TARGET_CHAR c;
- TARGET_CHAR d;
-#else
- char c;
- char d;
-#endif
- int sign;
- int i;
+{
+ int i;
char buf[80];
int pos;
- static char digit[] = "0123456789";
/* Create output files */
if ((cfile = fopen("syntax.c", "w")) == NULL) {
@@ -132,33 +118,7 @@
}
fputs(writer, hfile);
fputs(writer, cfile);
-
- /* Determine the characteristics of chars. */
- c = -1;
- if (c <= 0)
- sign = 1;
- else
- sign = 0;
- for (nbits = 1 ; ; nbits++) {
- d = (1 << nbits) - 1;
- if (d == c)
- break;
- }
- printf("%s %d bit chars\n", sign? "signed" : "unsigned", nbits);
- if (nbits > 9) {
- fputs("Characters can't have more than 9 bits\n", stderr);
- exit(2);
- }
- size = (1 << nbits) + 1;
- base = 2;
- if (sign)
- base += 1 << (nbits - 1);
- digit_contig = 1;
- for (i = 0 ; i < 10 ; i++) {
- if (digit[i] != '0' + i)
- digit_contig = 0;
- }
-
+
fputs("#include <ctype.h>\n", hfile);
fputs("\n", hfile);
fputs("#ifdef CEOF\n", hfile);
@@ -185,16 +145,16 @@
fprintf(hfile, "/* %s */\n", is_entry[i].comment);
}
putc('\n', hfile);
- fprintf(hfile, "#define SYNBASE %d\n", base);
- fprintf(hfile, "#define PEOF %d\n\n", -base);
- fprintf(hfile, "#define PEOA %d\n\n", -base + 1);
+ fprintf(hfile, "#define SYNBASE %d\n", 130);
+ fprintf(hfile, "#define PEOF %d\n\n", -130);
+ fprintf(hfile, "#define PEOA %d\n\n", -129);
putc('\n', hfile);
fputs("#define BASESYNTAX (basesyntax + SYNBASE)\n", hfile);
fputs("#define DQSYNTAX (dqsyntax + SYNBASE)\n", hfile);
fputs("#define SQSYNTAX (sqsyntax + SYNBASE)\n", hfile);
fputs("#define ARISYNTAX (arisyntax + SYNBASE)\n", hfile);
putc('\n', hfile);
- output_type_macros(sign); /* is_digit, etc. */
+ output_type_macros(); /* is_digit, etc. */
putc('\n', hfile);
/* Generate the syntax tables. */
@@ -248,8 +208,6 @@
add("_", "ISUNDER");
add("#?$!-*@", "ISSPECL");
print("is_type");
- if (! digit_contig)
- digit_convert();
exit(0);
/* NOTREACHED */
}
@@ -265,7 +223,7 @@
{
int i;
- for (i = 0 ; i < size ; i++)
+ for (i = 0 ; i < 257; i++)
syntax[i] = dftval;
}
@@ -283,11 +241,7 @@
syntax[0] = "CEOF";
syntax[1] = "CIGN";
for (ctl = CTL_FIRST; ctl <= CTL_LAST; ctl++ )
-#ifdef TARGET_CHAR
- syntax[base + (TARGET_CHAR)ctl ] = "CCTL";
-#else
- syntax[base + ctl] = "CCTL";
-#endif /* TARGET_CHAR */
+ syntax[130 + ctl] = "CCTL";
}
@@ -299,7 +253,7 @@
add(char *p, char *type)
{
while (*p)
- syntax[*p++ + base] = type;
+ syntax[(signed char)*p++ + 130] = type;
}
@@ -315,9 +269,9 @@
int col;
fprintf(hfile, "extern const char %s[];\n", name);
- fprintf(cfile, "const char %s[%d] = {\n", name, size);
+ fprintf(cfile, "const char %s[%d] = {\n", name, 257);
col = 0;
- for (i = 0 ; i < size ; i++) {
+ for (i = 0 ; i < 257; i++) {
if (i == 0) {
fputs(" ", cfile);
} else if ((i & 03) == 0) {
@@ -342,7 +296,7 @@
*/
static char *macro[] = {
- "#define is_digit(c)\t((is_type+SYNBASE)[(signed char)(c)] &
ISDIGIT)\n",
+ "#define is_digit(c)\t((unsigned)((c) - '0') <= 9)\n",
"#define is_alpha(c)\tisalpha((unsigned char)(c))\n",
"#define is_name(c)\t((c) == '_' || isalpha((unsigned char)(c)))\n",
"#define is_in_name(c)\t((c) == '_' || isalnum((unsigned char)(c)))\n",
@@ -351,45 +305,11 @@
};
static void
-output_type_macros(int sign)
+output_type_macros(void)
{
char **pp;
- if (digit_contig)
- macro[0] = "#define is_digit(c)\t((unsigned)((c) - '0') <=
9)\n";
for (pp = macro ; *pp ; pp++)
- fprintf(hfile, *pp, sign ? "char" : "unsigned char");
- if (digit_contig)
- fputs("#define digit_val(c)\t((c) - '0')\n", hfile);
- else
- fputs("#define digit_val(c)\t(digit_value[(unsigned
char)(c)])\n", hfile);
-}
-
-
-
-/*
- * Output digit conversion table (if digits are not contiguous).
- */
-
-static void
-digit_convert(void)
-{
- int maxdigit;
- static char digit[] = "0123456789";
- char *p;
- int i;
-
- maxdigit = 0;
- for (p = digit ; *p ; p++)
- if (*p > maxdigit)
- maxdigit = *p;
- fputs("extern const char digit_value[];\n", hfile);
- fputs("\n\nconst char digit_value[] = {\n", cfile);
- for (i = 0 ; i <= maxdigit ; i++) {
- for (p = digit ; *p && *p != i ; p++);
- if (*p == '\0')
- p = digit;
- fprintf(cfile, " %ld,\n", (long)(p - digit));
- }
- fputs("};\n", cfile);
+ fputs(*pp, hfile);
+ fputs("#define digit_val(c)\t((c) - '0')\n", hfile);
}
diff --git a/src/parser.c b/src/parser.c
index 4362f6a..deea702 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1414,7 +1414,7 @@
noexpand(char *text)
{
char *p;
- char c;
+ signed char c;
p = text;
while ((c = *p++) != '\0') {
diff --git a/src/parser.h b/src/parser.h
index fa58ed7..d0cf440 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -35,17 +35,17 @@
*/
/* control characters in argument strings */
-#define CTL_FIRST '\201' /* first 'special' character */
-#define CTLESC '\201' /* escape next character */
-#define CTLVAR '\202' /* variable defn */
-#define CTLENDVAR '\203'
-#define CTLBACKQ '\204'
+#define CTL_FIRST -127 /* first 'special' character */
+#define CTLESC -127 /* escape next character */
+#define CTLVAR -126 /* variable defn */
+#define CTLENDVAR -125
+#define CTLBACKQ -124
#define CTLQUOTE 01 /* ored with CTLBACKQ code if in quotes */
-/* CTLBACKQ | CTLQUOTE == '\205' */
-#define CTLARI '\206' /* arithmetic expression */
-#define CTLENDARI '\207'
-#define CTLQUOTEMARK '\210'
-#define CTL_LAST '\210' /* last 'special' character */
+/* CTLBACKQ | CTLQUOTE == 133 */
+#define CTLARI -122 /* arithmetic expression */
+#define CTLENDARI -121
+#define CTLQUOTEMARK -120
+#define CTL_LAST -120 /* last 'special' character */
/* variable substitution byte (follows CTLVAR) */
#define VSTYPE 0x0f /* type of variable substitution */
diff --git a/src/show.c b/src/show.c
index 05af328..1b58de1 100644
--- a/src/show.c
+++ b/src/show.c
@@ -165,7 +165,7 @@
}
bqlist = arg->narg.backquote;
for (p = arg->narg.text ; *p ; p++) {
- switch (*p) {
+ switch ((signed char)*p) {
case CTLESC:
putc(*++p, fp);
break;
@@ -306,7 +306,7 @@
return;
putc('"', tracefile);
for (p = s ; *p ; p++) {
- switch (*p) {
+ switch ((signed char)*p) {
case '\n': c = 'n'; goto backslash;
case '\t': c = 't'; goto backslash;
case '\r': c = 'r'; goto backslash;