mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
* src/lex.c (literalchar): Simply return the char you decoded, non
longer mess around with obstacks and int pointers. Adjust all callers.
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
2001-12-14 Akim Demaille <akim@epita.fr>
|
||||
|
||||
* src/lex.c (literalchar): Simply return the char you decoded, non
|
||||
longer mess around with obstacks and int pointers.
|
||||
Adjust all callers.
|
||||
|
||||
2001-12-14 Akim Demaille <akim@epita.fr>
|
||||
|
||||
* src/lex.c (literalchar): Don't escape the special characters,
|
||||
|
||||
94
src/lex.c
94
src/lex.c
@@ -140,67 +140,62 @@ xgetc (FILE *f)
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------.
|
||||
| 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. |
|
||||
`-----------------------------------------------------------------*/
|
||||
/*---------------------------------------------------------------.
|
||||
| Read one literal character from FINPUT, process \-escapes, and |
|
||||
| return the character. |
|
||||
`---------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
literalchar (struct obstack *out, int *pcode, char term)
|
||||
char
|
||||
literalchar (void)
|
||||
{
|
||||
int c;
|
||||
int code;
|
||||
int wasquote = 0;
|
||||
int res;
|
||||
|
||||
c = xgetc (finput);
|
||||
if (c == '\n')
|
||||
{
|
||||
complain (_("unescaped newline in constant"));
|
||||
ungetc (c, finput);
|
||||
code = '?';
|
||||
wasquote = 1;
|
||||
res = '?';
|
||||
}
|
||||
else if (c != '\\')
|
||||
{
|
||||
code = c;
|
||||
if (c == term)
|
||||
wasquote = 1;
|
||||
res = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
c = xgetc (finput);
|
||||
if (c == 't')
|
||||
code = '\t';
|
||||
res = '\t';
|
||||
else if (c == 'n')
|
||||
code = '\n';
|
||||
res = '\n';
|
||||
else if (c == 'a')
|
||||
code = '\007';
|
||||
res = '\007';
|
||||
else if (c == 'r')
|
||||
code = '\r';
|
||||
res = '\r';
|
||||
else if (c == 'f')
|
||||
code = '\f';
|
||||
res = '\f';
|
||||
else if (c == 'b')
|
||||
code = '\b';
|
||||
res = '\b';
|
||||
else if (c == 'v')
|
||||
code = '\013';
|
||||
res = '\013';
|
||||
else if (c == '\\')
|
||||
code = '\\';
|
||||
res = '\\';
|
||||
else if (c == '\'')
|
||||
code = '\'';
|
||||
res = '\'';
|
||||
else if (c == '\"')
|
||||
code = '\"';
|
||||
res = '\"';
|
||||
else if (c <= '7' && c >= '0')
|
||||
{
|
||||
code = 0;
|
||||
res = 0;
|
||||
while (c <= '7' && c >= '0')
|
||||
{
|
||||
code = (code * 8) + (c - '0');
|
||||
if (code >= 256 || code < 0)
|
||||
res = (res * 8) + (c - '0');
|
||||
if (res >= 256 || res < 0)
|
||||
{
|
||||
complain (_("octal value outside range 0...255: `\\%o'"),
|
||||
code);
|
||||
code &= 0xFF;
|
||||
res);
|
||||
res &= 0xFF;
|
||||
break;
|
||||
}
|
||||
c = xgetc (finput);
|
||||
@@ -210,21 +205,21 @@ literalchar (struct obstack *out, int *pcode, char term)
|
||||
else if (c == 'x')
|
||||
{
|
||||
c = xgetc (finput);
|
||||
code = 0;
|
||||
res = 0;
|
||||
while (1)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
code *= 16, code += c - '0';
|
||||
res *= 16, res += c - '0';
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
code *= 16, code += c - 'a' + 10;
|
||||
res *= 16, res += c - 'a' + 10;
|
||||
else if (c >= 'A' && c <= 'F')
|
||||
code *= 16, code += c - 'A' + 10;
|
||||
res *= 16, res += c - 'A' + 10;
|
||||
else
|
||||
break;
|
||||
if (code >= 256 || code < 0)
|
||||
if (res >= 256 || res < 0)
|
||||
{
|
||||
complain (_("hexadecimal value above 255: `\\x%x'"), code);
|
||||
code &= 0xFF;
|
||||
complain (_("hexadecimal value above 255: `\\x%x'"), res);
|
||||
res &= 0xFF;
|
||||
break;
|
||||
}
|
||||
c = xgetc (finput);
|
||||
@@ -237,14 +232,11 @@ literalchar (struct obstack *out, int *pcode, char term)
|
||||
badchar[0] = c;
|
||||
complain (_("unknown escape sequence: `\\' followed by `%s'"),
|
||||
quote (badchar));
|
||||
code = '?';
|
||||
res = '?';
|
||||
}
|
||||
} /* has \ */
|
||||
|
||||
if (out)
|
||||
obstack_1grow (out, code);
|
||||
*pcode = code;
|
||||
return !wasquote;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -356,19 +348,17 @@ lex (void)
|
||||
/* parse the literal token and compute character code in code */
|
||||
|
||||
{
|
||||
int code;
|
||||
int code = literalchar ();
|
||||
|
||||
obstack_1grow (&token_obstack, '\'');
|
||||
literalchar (&token_obstack, &code, '\'');
|
||||
obstack_1grow (&token_obstack, code);
|
||||
|
||||
c = getc (finput);
|
||||
if (c != '\'')
|
||||
{
|
||||
int discode;
|
||||
complain (_("use \"...\" for multi-character literal tokens"));
|
||||
while (1)
|
||||
if (!literalchar (0, &discode, '\''))
|
||||
break;
|
||||
while (literalchar () != '\'')
|
||||
/* Skip. */;
|
||||
}
|
||||
obstack_1grow (&token_obstack, '\'');
|
||||
obstack_1grow (&token_obstack, '\0');
|
||||
@@ -388,8 +378,12 @@ lex (void)
|
||||
|
||||
obstack_1grow (&token_obstack, '\"');
|
||||
/* Read up to and including ". */
|
||||
while (literalchar (&token_obstack, &code, '\"'))
|
||||
/* nothing */;
|
||||
do
|
||||
{
|
||||
code = literalchar ();
|
||||
obstack_1grow (&token_obstack, code);
|
||||
}
|
||||
while (code != '\"');
|
||||
obstack_1grow (&token_obstack, '\0');
|
||||
token_buffer = obstack_finish (&token_obstack);
|
||||
|
||||
@@ -543,7 +537,7 @@ parse_percent_token (void)
|
||||
arg_offset = obstack_object_size (&token_obstack);
|
||||
/* Read up to and including `"'. Do not append the closing
|
||||
`"' in the output: it's not part of the ARG. */
|
||||
while (literalchar (NULL, &code, '"'))
|
||||
while ((code = literalchar ()) != '"')
|
||||
obstack_1grow (&token_obstack, code);
|
||||
}
|
||||
/* else: should be an error. */
|
||||
|
||||
@@ -73,7 +73,7 @@ void read_type_name PARAMS ((FILE *fin));
|
||||
entry found. */
|
||||
|
||||
token_t lex PARAMS ((void));
|
||||
int literalchar PARAMS ((struct obstack *out, int *pcode, char term));
|
||||
char literalchar PARAMS ((void));
|
||||
|
||||
token_t parse_percent_token PARAMS ((void));
|
||||
|
||||
|
||||
@@ -985,13 +985,8 @@ parse_dquoted_param (const char *from)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (literalchar (NULL, &c, '\"'))
|
||||
obstack_1grow (¶m_obstack, c);
|
||||
else
|
||||
break;
|
||||
}
|
||||
while ((c = literalchar ()) != '"')
|
||||
obstack_1grow (¶m_obstack, c);
|
||||
|
||||
obstack_1grow (¶m_obstack, '\0');
|
||||
param = obstack_finish (¶m_obstack);
|
||||
|
||||
Reference in New Issue
Block a user