From 92790e5bf0c5b23e4a1d92ab8a9204e69db1eaf2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 14 Dec 2001 15:39:05 +0000 Subject: [PATCH] * 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. --- ChangeLog | 8 +++++ src/lex.c | 83 ++++------------------------------------------------ src/output.c | 38 +++++------------------- 3 files changed, 21 insertions(+), 108 deletions(-) diff --git a/ChangeLog b/ChangeLog index f33a119e..2f702c0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2001-12-14 Akim Demaille + + * 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 * src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE): diff --git a/src/lex.c b/src/lex.c index 78b8a8f3..b2458a4f 100644 --- 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; } diff --git a/src/output.c b/src/output.c index b1dd19c0..f38d63ba 100644 --- a/src/output.c +++ b/src/output.c @@ -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 */ -- 2.47.2