* app.c (do_scrub_chars): Handle '||' in two states.

This commit is contained in:
Alan Modra 2003-02-19 10:46:52 +00:00
parent ee3fd32958
commit b1ac4c66ea
2 changed files with 49 additions and 30 deletions

View File

@ -1,3 +1,7 @@
2003-02-19 Jie Zhang <zhangjie@magima.com.cn>
* app.c (do_scrub_chars): Handle '||' in two states.
2003-02-13 Alan Modra <amodra@bigpond.net.au>
* write.c (TC_FORCE_RELOCATION_SUB_SAME): Revert last change.

View File

@ -1,6 +1,6 @@
/* This is the Assembler Pre-Processor
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2002
1999, 2000, 2002, 2003
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -189,7 +189,7 @@ do_scrub_begin (m68k_mri)
lex[';'] = LEX_IS_COMMENT_START;
lex['*'] = LEX_IS_LINE_COMMENT_START;
/* The MRI documentation says '!' is LEX_IS_COMMENT_START, but
then it can't be used in an expression. */
then it can't be used in an expression. */
lex['!'] = LEX_IS_LINE_COMMENT_START;
}
#endif
@ -377,10 +377,12 @@ do_scrub_chars (get, tostart, tolen)
-1: output string in out_string and go to the state in old_state
-2: flush text until a '*' '/' is seen, then go to state old_state
#ifdef TC_V850
12: After seeing a dash, looking for a second dash as a start of comment.
12: After seeing a dash, looking for a second dash as a start
of comment.
#endif
#ifdef DOUBLEBAR_PARALLEL
13: After seeing a vertical bar, looking for a second vertical bar as a parallel expression seperator.
13: After seeing a vertical bar, looking for a second
vertical bar as a parallel expression separator.
#endif
*/
@ -450,8 +452,8 @@ do_scrub_chars (get, tostart, tolen)
while (1)
{
/* The cases in this switch end with continue, in order to
branch back to the top of this while loop and generate the
next output character in the appropriate state. */
branch back to the top of this while loop and generate the
next output character in the appropriate state. */
switch (state)
{
case -1:
@ -534,9 +536,9 @@ do_scrub_chars (get, tostart, tolen)
case 5:
/* We are going to copy everything up to a quote character,
with special handling for a backslash. We try to
optimize the copying in the simple case without using the
GET and PUT macros. */
with special handling for a backslash. We try to
optimize the copying in the simple case without using the
GET and PUT macros. */
{
char *s;
int len;
@ -545,7 +547,7 @@ do_scrub_chars (get, tostart, tolen)
{
ch = *s;
/* This condition must be changed if the type of any
other character can be LEX_IS_STRINGQUOTE. */
other character can be LEX_IS_STRINGQUOTE. */
if (ch == '\\'
|| ch == '"'
|| ch == '\''
@ -663,6 +665,19 @@ do_scrub_chars (get, tostart, tolen)
state = 0;
PUT (ch);
continue;
#ifdef DOUBLEBAR_PARALLEL
case 13:
ch = GET ();
if (ch != '|')
abort ();
/* Reset back to state 1 and pretend that we are parsing a
line from just after the first white space. */
state = 1;
PUT ('|');
continue;
#endif
}
/* OK, we are somewhere in states 0 through 4 or 9 through 11 */
@ -703,9 +718,9 @@ do_scrub_chars (get, tostart, tolen)
#ifdef TC_M68K
/* We want to have pseudo-ops which control whether we are in
MRI mode or not. Unfortunately, since m68k MRI mode affects
the scrubber, that means that we need a special purpose
recognizer here. */
MRI mode or not. Unfortunately, since m68k MRI mode affects
the scrubber, that means that we need a special purpose
recognizer here. */
if (mri_state == NULL)
{
if ((state == 0 || state == 1)
@ -742,14 +757,14 @@ do_scrub_chars (get, tostart, tolen)
else
{
/* We've read the entire pseudo-op. mips_last_ch is
either '0' or '1' indicating whether to enter or
leave MRI mode. */
either '0' or '1' indicating whether to enter or
leave MRI mode. */
do_scrub_begin (mri_last_ch == '1');
mri_state = NULL;
/* We continue handling the character as usual. The
main gas reader must also handle the .mri pseudo-op
to control expression parsing and the like. */
main gas reader must also handle the .mri pseudo-op
to control expression parsing and the like. */
}
}
#endif
@ -790,7 +805,7 @@ do_scrub_chars (get, tostart, tolen)
if (lex[ch] == LEX_IS_COLON)
{
/* Only keep this white if there's no white *after* the
colon. */
colon. */
ch2 = GET ();
UNGET (ch2);
if (!IS_WHITESPACE (ch2))
@ -878,9 +893,9 @@ do_scrub_chars (get, tostart, tolen)
else
{
/* We know that ch is not ':', since we tested that
case above. Therefore this is not a label, so it
must be the opcode, and we've just seen the
whitespace after it. */
case above. Therefore this is not a label, so it
must be the opcode, and we've just seen the
whitespace after it. */
state = 3;
}
UNGET (ch);
@ -912,7 +927,7 @@ do_scrub_chars (get, tostart, tolen)
break;
/* This UNGET will ensure that we count newlines
correctly. */
correctly. */
UNGET (ch2);
}
@ -956,7 +971,7 @@ do_scrub_chars (get, tostart, tolen)
PUT (' ');
/* PUT didn't jump out. We could just break, but we
know what will happen, so optimize a bit. */
know what will happen, so optimize a bit. */
ch = GET ();
old_state = 3;
}
@ -1078,15 +1093,15 @@ do_scrub_chars (get, tostart, tolen)
#ifdef DOUBLEBAR_PARALLEL
case LEX_IS_DOUBLEBAR_1ST:
ch2 = GET ();
UNGET (ch2);
if (ch2 != '|')
{
UNGET (ch2);
goto de_fault;
}
/* Reset back to state 1 and pretend that we are parsing a line from
just after the first white space. */
state = 1;
PUT ('|');
/* Handle '||' in two states as invoking PUT twice might
result in the first one jumping out of this loop. We'd
then lose track of the state and one '|' char. */
state = 13;
PUT ('|');
break;
#endif
@ -1219,7 +1234,7 @@ do_scrub_chars (get, tostart, tolen)
state = 9;
/* This is a common case. Quickly copy CH and all the
following symbol component or normal characters. */
following symbol component or normal characters. */
if (to + 1 < toend
&& mri_state == NULL
#if defined TC_ARM && defined OBJ_ELF
@ -1243,7 +1258,7 @@ do_scrub_chars (get, tostart, tolen)
if (s > from)
{
/* Handle the last character normally, for
simplicity. */
simplicity. */
--s;
}
len = s - from;