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;

Reply via email to