]> git.saurik.com Git - bison.git/commitdiff
* src/lex.c (literalchar): Don't escape the special characters,
authorAkim Demaille <akim@epita.fr>
Fri, 14 Dec 2001 15:39:05 +0000 (15:39 +0000)
committerAkim Demaille <akim@epita.fr>
Fri, 14 Dec 2001 15:39:05 +0000 (15:39 +0000)
just decode them, and keep them as char (before, eol was output as
the 2 char string `n' etc.).
* src/output.c (output_rule_data): Use quotearg to output the
token strings.

ChangeLog
src/lex.c
src/output.c

index f33a119e07a514d12a730850aa97d5eba70917a2..2f702c0af882881a9d844ff015a51b80e8a3d0f9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2001-12-14  Akim Demaille  <akim@epita.fr>
+
+       * src/lex.c (literalchar): Don't escape the special characters,
+       just decode them, and keep them as char (before, eol was output as
+       the 2 char string `\n' etc.).
+       * src/output.c (output_rule_data): Use quotearg to output the
+       token strings.
+
 2001-12-13  Paul Eggert  <eggert@twinsun.com>
 
        * src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE):
index 78b8a8f391bf84f8db7981a39e008575f18dd8e4..b2458a4f2e8a2c1978ee9ecac7cd0c8f09aaa8ef 100644 (file)
--- a/src/lex.c
+++ b/src/lex.c
@@ -140,24 +140,16 @@ xgetc (FILE *f)
 }
 
 
-/*------------------------------------------------------------------.
-| Read one literal character from finput.  Process \ escapes.       |
-| Append the normalized string version of the char to OUT.  Assign  |
-| the character code to *PCODE. Return 1 unless the character is an |
-| unescaped `term' or \n report error for \n.                       |
-`------------------------------------------------------------------*/
-
-/* FIXME: We could directly work in the obstack, but that would make
-   it more difficult to move to quotearg some day.  So for the time
-   being, I prefer have literalchar behave like quotearg, and change
-   my mind later if I was wrong.  */
+/*-----------------------------------------------------------------.
+| Read one literal character from FINPUT.  Process \-escapes.      |
+| Append the char to OUT and assign it *PCODE. Return 1 unless the |
+| character is an unescaped `term' or \n report error for \n.      |
+`-----------------------------------------------------------------*/
 
 int
 literalchar (struct obstack *out, int *pcode, char term)
 {
   int c;
-  char buf[4096];
-  char *cp;
   int code;
   int wasquote = 0;
 
@@ -249,71 +241,8 @@ literalchar (struct obstack *out, int *pcode, char term)
        }
     }                          /* has \ */
 
-  /* now fill BUF with the canonical name for this character as a
-     literal token.  Do not use what the user typed, so that `\012'
-     and `\n' can be interchangeable.  */
-
-  cp = buf;
-  if (code == term && wasquote)
-    *cp++ = code;
-  else if (code == '\\')
-    {
-      *cp++ = '\\';
-      *cp++ = '\\';
-    }
-  else if (code == '\'')
-    {
-      *cp++ = '\\';
-      *cp++ = '\'';
-    }
-  else if (code == '\"')
-    {
-      *cp++ = '\\';
-      *cp++ = '\"';
-    }
-  else if (code >= 040 && code < 0177)
-    *cp++ = code;
-  else if (code == '\t')
-    {
-      *cp++ = '\\';
-      *cp++ = 't';
-    }
-  else if (code == '\n')
-    {
-      *cp++ = '\\';
-      *cp++ = 'n';
-    }
-  else if (code == '\r')
-    {
-      *cp++ = '\\';
-      *cp++ = 'r';
-    }
-  else if (code == '\v')
-    {
-      *cp++ = '\\';
-      *cp++ = 'v';
-    }
-  else if (code == '\b')
-    {
-      *cp++ = '\\';
-      *cp++ = 'b';
-    }
-  else if (code == '\f')
-    {
-      *cp++ = '\\';
-      *cp++ = 'f';
-    }
-  else
-    {
-      *cp++ = '\\';
-      *cp++ = code / 0100 + '0';
-      *cp++ = ((code / 010) & 07) + '0';
-      *cp++ = (code & 07) + '0';
-    }
-  *cp = '\0';
-
   if (out)
-    obstack_sgrow (out, buf);
+    obstack_1grow (out, code);
   *pcode = code;
   return !wasquote;
 }
index b1dd19c03646a2520211795ac297fca3655dd533..f38d63bae36c7ee9601e3024292c3f4dcbfe965e 100644 (file)
@@ -234,22 +234,14 @@ output_rule_data (void)
 
   j = 0;
   for (i = 0; i < nsyms; i++)
-    /* this used to be i<=nsyms, but that output a final "" symbol
-       almost by accident */
     {
+      /* Be sure not to use twice the same quotearg slot. */
+      const char *cp =
+       quotearg_n_style (1, c_quoting_style,
+                         quotearg_style (escape_quoting_style, tags[i]));
       /* Width of the next token, including the two quotes, the coma
         and the space.  */
-      int strsize = 4;
-      char *p;
-
-      for (p = tags[i]; p && *p; p++)
-       if (*p == '"' || *p == '\\' || *p == '\n' || *p == '\t'
-           || *p == '\b')
-         strsize += 2;
-       else if (*p < 040 || *p >= 0177)
-         strsize += 4;
-       else
-         strsize++;
+      int strsize = strlen (cp) + 2;
 
       if (j + strsize > 75)
        {
@@ -257,24 +249,8 @@ output_rule_data (void)
          j = 2;
        }
 
-      obstack_1grow (&output_obstack, '\"');
-      for (p = tags[i]; p && *p; p++)
-       {
-         if (*p == '"' || *p == '\\')
-           obstack_fgrow1 (&output_obstack, "\\%c", *p);
-         else if (*p == '\n')
-           obstack_sgrow (&output_obstack, "\\n");
-         else if (*p == '\t')
-           obstack_sgrow (&output_obstack, "\\t");
-         else if (*p == '\b')
-           obstack_sgrow (&output_obstack, "\\b");
-         else if (*p < 040 || *p >= 0177)
-           obstack_fgrow1 (&output_obstack, "\\%03o", *p);
-         else
-           obstack_1grow (&output_obstack, *p);
-       }
-
-      obstack_sgrow (&output_obstack, "\", ");
+      obstack_sgrow (&output_obstack, cp);
+      obstack_sgrow (&output_obstack, ", ");
       j += strsize;
     }
   /* add a NULL entry to list of tokens */