+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):
}
-/*------------------------------------------------------------------.
-| 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;
}
} /* 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;
}
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)
{
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 */