mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-19 17:23:02 +00:00
* 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.
This commit is contained in:
@@ -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>
|
2001-12-13 Paul Eggert <eggert@twinsun.com>
|
||||||
|
|
||||||
* src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE):
|
* src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE):
|
||||||
|
|||||||
83
src/lex.c
83
src/lex.c
@@ -140,24 +140,16 @@ xgetc (FILE *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
/*-----------------------------------------------------------------.
|
||||||
| Read one literal character from finput. Process \ escapes. |
|
| Read one literal character from FINPUT. Process \-escapes. |
|
||||||
| Append the normalized string version of the char to OUT. Assign |
|
| Append the char to OUT and assign it *PCODE. Return 1 unless the |
|
||||||
| the character code to *PCODE. Return 1 unless the character is an |
|
| character is an unescaped `term' or \n report error for \n. |
|
||||||
| 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. */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
literalchar (struct obstack *out, int *pcode, char term)
|
literalchar (struct obstack *out, int *pcode, char term)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
char buf[4096];
|
|
||||||
char *cp;
|
|
||||||
int code;
|
int code;
|
||||||
int wasquote = 0;
|
int wasquote = 0;
|
||||||
|
|
||||||
@@ -249,71 +241,8 @@ literalchar (struct obstack *out, int *pcode, char term)
|
|||||||
}
|
}
|
||||||
} /* has \ */
|
} /* 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)
|
if (out)
|
||||||
obstack_sgrow (out, buf);
|
obstack_1grow (out, code);
|
||||||
*pcode = code;
|
*pcode = code;
|
||||||
return !wasquote;
|
return !wasquote;
|
||||||
}
|
}
|
||||||
|
|||||||
38
src/output.c
38
src/output.c
@@ -234,22 +234,14 @@ output_rule_data (void)
|
|||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
for (i = 0; i < nsyms; i++)
|
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
|
/* Width of the next token, including the two quotes, the coma
|
||||||
and the space. */
|
and the space. */
|
||||||
int strsize = 4;
|
int strsize = strlen (cp) + 2;
|
||||||
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++;
|
|
||||||
|
|
||||||
if (j + strsize > 75)
|
if (j + strsize > 75)
|
||||||
{
|
{
|
||||||
@@ -257,24 +249,8 @@ output_rule_data (void)
|
|||||||
j = 2;
|
j = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
obstack_1grow (&output_obstack, '\"');
|
obstack_sgrow (&output_obstack, cp);
|
||||||
for (p = tags[i]; p && *p; p++)
|
obstack_sgrow (&output_obstack, ", ");
|
||||||
{
|
|
||||||
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, "\", ");
|
|
||||||
j += strsize;
|
j += strsize;
|
||||||
}
|
}
|
||||||
/* add a NULL entry to list of tokens */
|
/* add a NULL entry to list of tokens */
|
||||||
|
|||||||
Reference in New Issue
Block a user