* app.c (do_scrub_chars): Turn #<line>"file"flags into .linefile.
[external/binutils.git] / gas / app.c
1 /* This is the Assembler Pre-Processor
2    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2006, 2007
4    Free Software Foundation, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 /* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90.  */
24 /* App, the assembler pre-processor.  This pre-processor strips out
25    excess spaces, turns single-quoted characters into a decimal
26    constant, and turns the # in # <number> <filename> <garbage> into a
27    .linefile.  This needs better error-handling.  */
28
29 #include "as.h"
30
31 #if (__STDC__ != 1)
32 #ifndef const
33 #define const  /* empty */
34 #endif
35 #endif
36
37 #ifdef TC_M68K
38 /* Whether we are scrubbing in m68k MRI mode.  This is different from
39    flag_m68k_mri, because the two flags will be affected by the .mri
40    pseudo-op at different times.  */
41 static int scrub_m68k_mri;
42
43 /* The pseudo-op which switches in and out of MRI mode.  See the
44    comment in do_scrub_chars.  */
45 static const char mri_pseudo[] = ".mri 0";
46 #else
47 #define scrub_m68k_mri 0
48 #endif
49
50 #if defined TC_ARM && defined OBJ_ELF
51 /* The pseudo-op for which we need to special-case `@' characters.
52    See the comment in do_scrub_chars.  */
53 static const char   symver_pseudo[] = ".symver";
54 static const char * symver_state;
55 #endif
56
57 static char lex[256];
58 static const char symbol_chars[] =
59 "$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
60
61 #define LEX_IS_SYMBOL_COMPONENT         1
62 #define LEX_IS_WHITESPACE               2
63 #define LEX_IS_LINE_SEPARATOR           3
64 #define LEX_IS_COMMENT_START            4
65 #define LEX_IS_LINE_COMMENT_START       5
66 #define LEX_IS_TWOCHAR_COMMENT_1ST      6
67 #define LEX_IS_STRINGQUOTE              8
68 #define LEX_IS_COLON                    9
69 #define LEX_IS_NEWLINE                  10
70 #define LEX_IS_ONECHAR_QUOTE            11
71 #ifdef TC_V850
72 #define LEX_IS_DOUBLEDASH_1ST           12
73 #endif
74 #ifdef TC_M32R
75 #define DOUBLEBAR_PARALLEL
76 #endif
77 #ifdef DOUBLEBAR_PARALLEL
78 #define LEX_IS_DOUBLEBAR_1ST            13
79 #endif
80 #define LEX_IS_PARALLEL_SEPARATOR       14
81 #define IS_SYMBOL_COMPONENT(c)          (lex[c] == LEX_IS_SYMBOL_COMPONENT)
82 #define IS_WHITESPACE(c)                (lex[c] == LEX_IS_WHITESPACE)
83 #define IS_LINE_SEPARATOR(c)            (lex[c] == LEX_IS_LINE_SEPARATOR)
84 #define IS_PARALLEL_SEPARATOR(c)        (lex[c] == LEX_IS_PARALLEL_SEPARATOR)
85 #define IS_COMMENT(c)                   (lex[c] == LEX_IS_COMMENT_START)
86 #define IS_LINE_COMMENT(c)              (lex[c] == LEX_IS_LINE_COMMENT_START)
87 #define IS_NEWLINE(c)                   (lex[c] == LEX_IS_NEWLINE)
88
89 static int process_escape (int);
90
91 /* FIXME-soon: The entire lexer/parser thingy should be
92    built statically at compile time rather than dynamically
93    each and every time the assembler is run.  xoxorich.  */
94
95 void
96 do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
97 {
98   const char *p;
99   int c;
100
101   lex[' '] = LEX_IS_WHITESPACE;
102   lex['\t'] = LEX_IS_WHITESPACE;
103   lex['\r'] = LEX_IS_WHITESPACE;
104   lex['\n'] = LEX_IS_NEWLINE;
105   lex[':'] = LEX_IS_COLON;
106
107 #ifdef TC_M68K
108   scrub_m68k_mri = m68k_mri;
109
110   if (! m68k_mri)
111 #endif
112     {
113       lex['"'] = LEX_IS_STRINGQUOTE;
114
115 #if ! defined (TC_HPPA) && ! defined (TC_I370)
116       /* I370 uses single-quotes to delimit integer, float constants.  */
117       lex['\''] = LEX_IS_ONECHAR_QUOTE;
118 #endif
119
120 #ifdef SINGLE_QUOTE_STRINGS
121       lex['\''] = LEX_IS_STRINGQUOTE;
122 #endif
123     }
124
125   /* Note: if any other character can be LEX_IS_STRINGQUOTE, the loop
126      in state 5 of do_scrub_chars must be changed.  */
127
128   /* Note that these override the previous defaults, e.g. if ';' is a
129      comment char, then it isn't a line separator.  */
130   for (p = symbol_chars; *p; ++p)
131     lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
132
133   for (c = 128; c < 256; ++c)
134     lex[c] = LEX_IS_SYMBOL_COMPONENT;
135
136 #ifdef tc_symbol_chars
137   /* This macro permits the processor to specify all characters which
138      may appears in an operand.  This will prevent the scrubber from
139      discarding meaningful whitespace in certain cases.  The i386
140      backend uses this to support prefixes, which can confuse the
141      scrubber as to whether it is parsing operands or opcodes.  */
142   for (p = tc_symbol_chars; *p; ++p)
143     lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT;
144 #endif
145
146   /* The m68k backend wants to be able to change comment_chars.  */
147 #ifndef tc_comment_chars
148 #define tc_comment_chars comment_chars
149 #endif
150   for (p = tc_comment_chars; *p; p++)
151     lex[(unsigned char) *p] = LEX_IS_COMMENT_START;
152
153   for (p = line_comment_chars; *p; p++)
154     lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
155
156   for (p = line_separator_chars; *p; p++)
157     lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
158
159 #ifdef tc_parallel_separator_chars
160   /* This macro permits the processor to specify all characters which
161      separate parallel insns on the same line.  */
162   for (p = tc_parallel_separator_chars; *p; p++)
163     lex[(unsigned char) *p] = LEX_IS_PARALLEL_SEPARATOR;
164 #endif
165
166   /* Only allow slash-star comments if slash is not in use.
167      FIXME: This isn't right.  We should always permit them.  */
168   if (lex['/'] == 0)
169     lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST;
170
171 #ifdef TC_M68K
172   if (m68k_mri)
173     {
174       lex['\''] = LEX_IS_STRINGQUOTE;
175       lex[';'] = LEX_IS_COMMENT_START;
176       lex['*'] = LEX_IS_LINE_COMMENT_START;
177       /* The MRI documentation says '!' is LEX_IS_COMMENT_START, but
178          then it can't be used in an expression.  */
179       lex['!'] = LEX_IS_LINE_COMMENT_START;
180     }
181 #endif
182
183 #ifdef TC_V850
184   lex['-'] = LEX_IS_DOUBLEDASH_1ST;
185 #endif
186 #ifdef DOUBLEBAR_PARALLEL
187   lex['|'] = LEX_IS_DOUBLEBAR_1ST;
188 #endif
189 #ifdef TC_D30V
190   /* Must do this is we want VLIW instruction with "->" or "<-".  */
191   lex['-'] = LEX_IS_SYMBOL_COMPONENT;
192 #endif
193 }
194
195 /* Saved state of the scrubber.  */
196 static int state;
197 static int old_state;
198 static char *out_string;
199 static char out_buf[20];
200 static int add_newlines;
201 static char *saved_input;
202 static int saved_input_len;
203 static char input_buffer[32 * 1024];
204 static const char *mri_state;
205 static char mri_last_ch;
206
207 /* Data structure for saving the state of app across #include's.  Note that
208    app is called asynchronously to the parsing of the .include's, so our
209    state at the time .include is interpreted is completely unrelated.
210    That's why we have to save it all.  */
211
212 struct app_save
213 {
214   int          state;
215   int          old_state;
216   char *       out_string;
217   char         out_buf[sizeof (out_buf)];
218   int          add_newlines;
219   char *       saved_input;
220   int          saved_input_len;
221 #ifdef TC_M68K
222   int          scrub_m68k_mri;
223 #endif
224   const char * mri_state;
225   char         mri_last_ch;
226 #if defined TC_ARM && defined OBJ_ELF
227   const char * symver_state;
228 #endif
229 };
230
231 char *
232 app_push (void)
233 {
234   register struct app_save *saved;
235
236   saved = (struct app_save *) xmalloc (sizeof (*saved));
237   saved->state = state;
238   saved->old_state = old_state;
239   saved->out_string = out_string;
240   memcpy (saved->out_buf, out_buf, sizeof (out_buf));
241   saved->add_newlines = add_newlines;
242   if (saved_input == NULL)
243     saved->saved_input = NULL;
244   else
245     {
246       saved->saved_input = xmalloc (saved_input_len);
247       memcpy (saved->saved_input, saved_input, saved_input_len);
248       saved->saved_input_len = saved_input_len;
249     }
250 #ifdef TC_M68K
251   saved->scrub_m68k_mri = scrub_m68k_mri;
252 #endif
253   saved->mri_state = mri_state;
254   saved->mri_last_ch = mri_last_ch;
255 #if defined TC_ARM && defined OBJ_ELF
256   saved->symver_state = symver_state;
257 #endif
258
259   /* do_scrub_begin() is not useful, just wastes time.  */
260
261   state = 0;
262   saved_input = NULL;
263
264   return (char *) saved;
265 }
266
267 void
268 app_pop (char *arg)
269 {
270   register struct app_save *saved = (struct app_save *) arg;
271
272   /* There is no do_scrub_end ().  */
273   state = saved->state;
274   old_state = saved->old_state;
275   out_string = saved->out_string;
276   memcpy (out_buf, saved->out_buf, sizeof (out_buf));
277   add_newlines = saved->add_newlines;
278   if (saved->saved_input == NULL)
279     saved_input = NULL;
280   else
281     {
282       assert (saved->saved_input_len <= (int) (sizeof input_buffer));
283       memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
284       saved_input = input_buffer;
285       saved_input_len = saved->saved_input_len;
286       free (saved->saved_input);
287     }
288 #ifdef TC_M68K
289   scrub_m68k_mri = saved->scrub_m68k_mri;
290 #endif
291   mri_state = saved->mri_state;
292   mri_last_ch = saved->mri_last_ch;
293 #if defined TC_ARM && defined OBJ_ELF
294   symver_state = saved->symver_state;
295 #endif
296
297   free (arg);
298 }
299
300 /* @@ This assumes that \n &c are the same on host and target.  This is not
301    necessarily true.  */
302
303 static int
304 process_escape (int ch)
305 {
306   switch (ch)
307     {
308     case 'b':
309       return '\b';
310     case 'f':
311       return '\f';
312     case 'n':
313       return '\n';
314     case 'r':
315       return '\r';
316     case 't':
317       return '\t';
318     case '\'':
319       return '\'';
320     case '"':
321       return '\"';
322     default:
323       return ch;
324     }
325 }
326
327 /* This function is called to process input characters.  The GET
328    parameter is used to retrieve more input characters.  GET should
329    set its parameter to point to a buffer, and return the length of
330    the buffer; it should return 0 at end of file.  The scrubbed output
331    characters are put into the buffer starting at TOSTART; the TOSTART
332    buffer is TOLEN bytes in length.  The function returns the number
333    of scrubbed characters put into TOSTART.  This will be TOLEN unless
334    end of file was seen.  This function is arranged as a state
335    machine, and saves its state so that it may return at any point.
336    This is the way the old code used to work.  */
337
338 int
339 do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
340 {
341   char *to = tostart;
342   char *toend = tostart + tolen;
343   char *from;
344   char *fromend;
345   int fromlen;
346   register int ch, ch2 = 0;
347   /* Character that started the string we're working on.  */
348   static char quotechar;
349
350   /*State 0: beginning of normal line
351           1: After first whitespace on line (flush more white)
352           2: After first non-white (opcode) on line (keep 1white)
353           3: after second white on line (into operands) (flush white)
354           4: after putting out a .linefile, put out digits
355           5: parsing a string, then go to old-state
356           6: putting out \ escape in a "d string.
357           7: no longer used
358           8: After putting out a .appfile string, flush until newline.
359           9: After seeing symbol char in state 3 (keep 1white after symchar)
360          10: After seeing whitespace in state 9 (keep white before symchar)
361          11: After seeing a symbol character in state 0 (eg a label definition)
362          -1: output string in out_string and go to the state in old_state
363          -2: flush text until a '*' '/' is seen, then go to state old_state
364 #ifdef TC_V850
365          12: After seeing a dash, looking for a second dash as a start
366              of comment.
367 #endif
368 #ifdef DOUBLEBAR_PARALLEL
369          13: After seeing a vertical bar, looking for a second
370              vertical bar as a parallel expression separator.
371 #endif
372 #ifdef TC_IA64
373          14: After seeing a `(' at state 0, looking for a `)' as
374              predicate.
375          15: After seeing a `(' at state 1, looking for a `)' as
376              predicate.
377 #endif
378 #ifdef TC_Z80
379          16: After seeing an 'a' or an 'A' at the start of a symbol
380          17: After seeing an 'f' or an 'F' in state 16
381 #endif
382           */
383
384   /* I added states 9 and 10 because the MIPS ECOFF assembler uses
385      constructs like ``.loc 1 20''.  This was turning into ``.loc
386      120''.  States 9 and 10 ensure that a space is never dropped in
387      between characters which could appear in an identifier.  Ian
388      Taylor, ian@cygnus.com.
389
390      I added state 11 so that something like "Lfoo add %r25,%r26,%r27" works
391      correctly on the PA (and any other target where colons are optional).
392      Jeff Law, law@cs.utah.edu.
393
394      I added state 13 so that something like "cmp r1, r2 || trap #1" does not
395      get squashed into "cmp r1,r2||trap#1", with the all important space
396      between the 'trap' and the '#1' being eliminated.  nickc@cygnus.com  */
397
398   /* This macro gets the next input character.  */
399
400 #define GET()                                                   \
401   (from < fromend                                               \
402    ? * (unsigned char *) (from++)                               \
403    : (saved_input = NULL,                                       \
404       fromlen = (*get) (input_buffer, sizeof input_buffer),     \
405       from = input_buffer,                                      \
406       fromend = from + fromlen,                                 \
407       (fromlen == 0                                             \
408        ? EOF                                                    \
409        : * (unsigned char *) (from++))))
410
411   /* This macro pushes a character back on the input stream.  */
412
413 #define UNGET(uch) (*--from = (uch))
414
415   /* This macro puts a character into the output buffer.  If this
416      character fills the output buffer, this macro jumps to the label
417      TOFULL.  We use this rather ugly approach because we need to
418      handle two different termination conditions: EOF on the input
419      stream, and a full output buffer.  It would be simpler if we
420      always read in the entire input stream before processing it, but
421      I don't want to make such a significant change to the assembler's
422      memory usage.  */
423
424 #define PUT(pch)                                \
425   do                                            \
426     {                                           \
427       *to++ = (pch);                            \
428       if (to >= toend)                          \
429         goto tofull;                            \
430     }                                           \
431   while (0)
432
433   if (saved_input != NULL)
434     {
435       from = saved_input;
436       fromend = from + saved_input_len;
437     }
438   else
439     {
440       fromlen = (*get) (input_buffer, sizeof input_buffer);
441       if (fromlen == 0)
442         return 0;
443       from = input_buffer;
444       fromend = from + fromlen;
445     }
446
447   while (1)
448     {
449       /* The cases in this switch end with continue, in order to
450          branch back to the top of this while loop and generate the
451          next output character in the appropriate state.  */
452       switch (state)
453         {
454         case -1:
455           ch = *out_string++;
456           if (*out_string == '\0')
457             {
458               state = old_state;
459               old_state = 3;
460             }
461           PUT (ch);
462           continue;
463
464         case -2:
465           for (;;)
466             {
467               do
468                 {
469                   ch = GET ();
470
471                   if (ch == EOF)
472                     {
473                       as_warn (_("end of file in comment"));
474                       goto fromeof;
475                     }
476
477                   if (ch == '\n')
478                     PUT ('\n');
479                 }
480               while (ch != '*');
481
482               while ((ch = GET ()) == '*')
483                 ;
484
485               if (ch == EOF)
486                 {
487                   as_warn (_("end of file in comment"));
488                   goto fromeof;
489                 }
490
491               if (ch == '/')
492                 break;
493
494               UNGET (ch);
495             }
496
497           state = old_state;
498           UNGET (' ');
499           continue;
500
501         case 4:
502           ch = GET ();
503           if (ch == EOF)
504             goto fromeof;
505           else if (ch >= '0' && ch <= '9')
506             PUT (ch);
507           else
508             {
509               while (ch != EOF && IS_WHITESPACE (ch))
510                 ch = GET ();
511               if (ch == '"')
512                 {
513                   PUT (' ');
514                   PUT (ch);
515                   quotechar = ch;
516                   state = 5;
517                   old_state = 8;
518                 }
519               else
520                 {
521                   while (ch != EOF && ch != '\n')
522                     ch = GET ();
523                   state = 0;
524                   PUT (ch);
525                 }
526             }
527           continue;
528
529         case 5:
530           /* We are going to copy everything up to a quote character,
531              with special handling for a backslash.  We try to
532              optimize the copying in the simple case without using the
533              GET and PUT macros.  */
534           {
535             char *s;
536             int len;
537
538             for (s = from; s < fromend; s++)
539               {
540                 ch = *s;
541                 if (ch == '\\'
542                     || ch == quotechar
543                     || ch == '\n')
544                   break;
545               }
546             len = s - from;
547             if (len > toend - to)
548               len = toend - to;
549             if (len > 0)
550               {
551                 memcpy (to, from, len);
552                 to += len;
553                 from += len;
554               }
555           }
556
557           ch = GET ();
558           if (ch == EOF)
559             {
560               as_warn (_("end of file in string; '%c' inserted"), quotechar);
561               state = old_state;
562               UNGET ('\n');
563               PUT (quotechar);
564             }
565           else if (ch == quotechar)
566             {
567               state = old_state;
568               PUT (ch);
569             }
570 #ifndef NO_STRING_ESCAPES
571           else if (ch == '\\')
572             {
573               state = 6;
574               PUT (ch);
575             }
576 #endif
577           else if (scrub_m68k_mri && ch == '\n')
578             {
579               /* Just quietly terminate the string.  This permits lines like
580                    bne  label   loop if we haven't reach end yet.  */
581               state = old_state;
582               UNGET (ch);
583               PUT ('\'');
584             }
585           else
586             {
587               PUT (ch);
588             }
589           continue;
590
591         case 6:
592           state = 5;
593           ch = GET ();
594           switch (ch)
595             {
596               /* Handle strings broken across lines, by turning '\n' into
597                  '\\' and 'n'.  */
598             case '\n':
599               UNGET ('n');
600               add_newlines++;
601               PUT ('\\');
602               continue;
603
604             case EOF:
605               as_warn (_("end of file in string; '%c' inserted"), quotechar);
606               PUT (quotechar);
607               continue;
608
609             case '"':
610             case '\\':
611             case 'b':
612             case 'f':
613             case 'n':
614             case 'r':
615             case 't':
616             case 'v':
617             case 'x':
618             case 'X':
619             case '0':
620             case '1':
621             case '2':
622             case '3':
623             case '4':
624             case '5':
625             case '6':
626             case '7':
627               break;
628
629             default:
630 #ifdef ONLY_STANDARD_ESCAPES
631               as_warn (_("unknown escape '\\%c' in string; ignored"), ch);
632 #endif
633               break;
634             }
635           PUT (ch);
636           continue;
637
638         case 8:
639           do
640             if ((ch = GET ()) == EOF)
641               goto fromeof;
642             else
643               PUT (ch);
644           while (ch != '\n');
645           state = 0;
646           continue;
647
648 #ifdef DOUBLEBAR_PARALLEL
649         case 13:
650           ch = GET ();
651           if (ch != '|')
652             abort ();
653
654           /* Reset back to state 1 and pretend that we are parsing a
655              line from just after the first white space.  */
656           state = 1;
657           PUT ('|');
658           continue;
659 #endif
660 #ifdef TC_Z80
661         case 16:
662           /* We have seen an 'a' at the start of a symbol, look for an 'f'.  */
663           ch = GET ();
664           if (ch == 'f' || ch == 'F') 
665             {
666               state = 17;
667               PUT (ch);
668             }
669           else
670             {
671               state = 9;
672               break;
673             }
674         case 17:
675           /* We have seen "af" at the start of a symbol,
676              a ' here is a part of that symbol.  */
677           ch = GET ();
678           state = 9;
679           if (ch == '\'')
680             /* Change to avoid warning about unclosed string.  */
681             PUT ('`');
682           else
683             UNGET (ch);
684           break;
685 #endif
686         }
687
688       /* OK, we are somewhere in states 0 through 4 or 9 through 11.  */
689
690       /* flushchar: */
691       ch = GET ();
692
693 #ifdef TC_IA64
694       if (ch == '(' && (state == 0 || state == 1))
695         {
696           state += 14;
697           PUT (ch);
698           continue;
699         }
700       else if (state == 14 || state == 15)
701         {
702           if (ch == ')')
703             {
704               state -= 14;
705               PUT (ch);
706               ch = GET ();
707             }
708           else
709             {
710               PUT (ch);
711               continue;
712             }
713         }
714 #endif
715
716     recycle:
717
718 #if defined TC_ARM && defined OBJ_ELF
719       /* We need to watch out for .symver directives.  See the comment later
720          in this function.  */
721       if (symver_state == NULL)
722         {
723           if ((state == 0 || state == 1) && ch == symver_pseudo[0])
724             symver_state = symver_pseudo + 1;
725         }
726       else
727         {
728           /* We advance to the next state if we find the right
729              character.  */
730           if (ch != '\0' && (*symver_state == ch))
731             ++symver_state;
732           else if (*symver_state != '\0')
733             /* We did not get the expected character, or we didn't
734                get a valid terminating character after seeing the
735                entire pseudo-op, so we must go back to the beginning.  */
736             symver_state = NULL;
737           else
738             {
739               /* We've read the entire pseudo-op.  If this is the end
740                  of the line, go back to the beginning.  */
741               if (IS_NEWLINE (ch))
742                 symver_state = NULL;
743             }
744         }
745 #endif /* TC_ARM && OBJ_ELF */
746
747 #ifdef TC_M68K
748       /* We want to have pseudo-ops which control whether we are in
749          MRI mode or not.  Unfortunately, since m68k MRI mode affects
750          the scrubber, that means that we need a special purpose
751          recognizer here.  */
752       if (mri_state == NULL)
753         {
754           if ((state == 0 || state == 1)
755               && ch == mri_pseudo[0])
756             mri_state = mri_pseudo + 1;
757         }
758       else
759         {
760           /* We advance to the next state if we find the right
761              character, or if we need a space character and we get any
762              whitespace character, or if we need a '0' and we get a
763              '1' (this is so that we only need one state to handle
764              ``.mri 0'' and ``.mri 1'').  */
765           if (ch != '\0'
766               && (*mri_state == ch
767                   || (*mri_state == ' '
768                       && lex[ch] == LEX_IS_WHITESPACE)
769                   || (*mri_state == '0'
770                       && ch == '1')))
771             {
772               mri_last_ch = ch;
773               ++mri_state;
774             }
775           else if (*mri_state != '\0'
776                    || (lex[ch] != LEX_IS_WHITESPACE
777                        && lex[ch] != LEX_IS_NEWLINE))
778             {
779               /* We did not get the expected character, or we didn't
780                  get a valid terminating character after seeing the
781                  entire pseudo-op, so we must go back to the
782                  beginning.  */
783               mri_state = NULL;
784             }
785           else
786             {
787               /* We've read the entire pseudo-op.  mips_last_ch is
788                  either '0' or '1' indicating whether to enter or
789                  leave MRI mode.  */
790               do_scrub_begin (mri_last_ch == '1');
791               mri_state = NULL;
792
793               /* We continue handling the character as usual.  The
794                  main gas reader must also handle the .mri pseudo-op
795                  to control expression parsing and the like.  */
796             }
797         }
798 #endif
799
800       if (ch == EOF)
801         {
802           if (state != 0)
803             {
804               as_warn (_("end of file not at end of a line; newline inserted"));
805               state = 0;
806               PUT ('\n');
807             }
808           goto fromeof;
809         }
810
811       switch (lex[ch])
812         {
813         case LEX_IS_WHITESPACE:
814           do
815             {
816               ch = GET ();
817             }
818           while (ch != EOF && IS_WHITESPACE (ch));
819           if (ch == EOF)
820             goto fromeof;
821
822           if (state == 0)
823             {
824               /* Preserve a single whitespace character at the
825                  beginning of a line.  */
826               state = 1;
827               UNGET (ch);
828               PUT (' ');
829               break;
830             }
831
832 #ifdef KEEP_WHITE_AROUND_COLON
833           if (lex[ch] == LEX_IS_COLON)
834             {
835               /* Only keep this white if there's no white *after* the
836                  colon.  */
837               ch2 = GET ();
838               UNGET (ch2);
839               if (!IS_WHITESPACE (ch2))
840                 {
841                   state = 9;
842                   UNGET (ch);
843                   PUT (' ');
844                   break;
845                 }
846             }
847 #endif
848           if (IS_COMMENT (ch)
849               || ch == '/'
850               || IS_LINE_SEPARATOR (ch)
851               || IS_PARALLEL_SEPARATOR (ch))
852             {
853               if (scrub_m68k_mri)
854                 {
855                   /* In MRI mode, we keep these spaces.  */
856                   UNGET (ch);
857                   PUT (' ');
858                   break;
859                 }
860               goto recycle;
861             }
862
863           /* If we're in state 2 or 11, we've seen a non-white
864              character followed by whitespace.  If the next character
865              is ':', this is whitespace after a label name which we
866              normally must ignore.  In MRI mode, though, spaces are
867              not permitted between the label and the colon.  */
868           if ((state == 2 || state == 11)
869               && lex[ch] == LEX_IS_COLON
870               && ! scrub_m68k_mri)
871             {
872               state = 1;
873               PUT (ch);
874               break;
875             }
876
877           switch (state)
878             {
879             case 1:
880               /* We can arrive here if we leave a leading whitespace
881                  character at the beginning of a line.  */
882               goto recycle;
883             case 2:
884               state = 3;
885               if (to + 1 < toend)
886                 {
887                   /* Optimize common case by skipping UNGET/GET.  */
888                   PUT (' ');    /* Sp after opco */
889                   goto recycle;
890                 }
891               UNGET (ch);
892               PUT (' ');
893               break;
894             case 3:
895               if (scrub_m68k_mri)
896                 {
897                   /* In MRI mode, we keep these spaces.  */
898                   UNGET (ch);
899                   PUT (' ');
900                   break;
901                 }
902               goto recycle;     /* Sp in operands */
903             case 9:
904             case 10:
905               if (scrub_m68k_mri)
906                 {
907                   /* In MRI mode, we keep these spaces.  */
908                   state = 3;
909                   UNGET (ch);
910                   PUT (' ');
911                   break;
912                 }
913               state = 10;       /* Sp after symbol char */
914               goto recycle;
915             case 11:
916               if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
917                 state = 1;
918               else
919                 {
920                   /* We know that ch is not ':', since we tested that
921                      case above.  Therefore this is not a label, so it
922                      must be the opcode, and we've just seen the
923                      whitespace after it.  */
924                   state = 3;
925                 }
926               UNGET (ch);
927               PUT (' ');        /* Sp after label definition.  */
928               break;
929             default:
930               BAD_CASE (state);
931             }
932           break;
933
934         case LEX_IS_TWOCHAR_COMMENT_1ST:
935           ch2 = GET ();
936           if (ch2 == '*')
937             {
938               for (;;)
939                 {
940                   do
941                     {
942                       ch2 = GET ();
943                       if (ch2 != EOF && IS_NEWLINE (ch2))
944                         add_newlines++;
945                     }
946                   while (ch2 != EOF && ch2 != '*');
947
948                   while (ch2 == '*')
949                     ch2 = GET ();
950
951                   if (ch2 == EOF || ch2 == '/')
952                     break;
953
954                   /* This UNGET will ensure that we count newlines
955                      correctly.  */
956                   UNGET (ch2);
957                 }
958
959               if (ch2 == EOF)
960                 as_warn (_("end of file in multiline comment"));
961
962               ch = ' ';
963               goto recycle;
964             }
965 #ifdef DOUBLESLASH_LINE_COMMENTS
966           else if (ch2 == '/')
967             {
968               do
969                 {
970                   ch = GET ();
971                 }
972               while (ch != EOF && !IS_NEWLINE (ch));
973               if (ch == EOF)
974                 as_warn ("end of file in comment; newline inserted");
975               state = 0;
976               PUT ('\n');
977               break;
978             }
979 #endif
980           else
981             {
982               if (ch2 != EOF)
983                 UNGET (ch2);
984               if (state == 9 || state == 10)
985                 state = 3;
986               PUT (ch);
987             }
988           break;
989
990         case LEX_IS_STRINGQUOTE:
991           quotechar = ch;
992           if (state == 10)
993             {
994               /* Preserve the whitespace in foo "bar".  */
995               UNGET (ch);
996               state = 3;
997               PUT (' ');
998
999               /* PUT didn't jump out.  We could just break, but we
1000                  know what will happen, so optimize a bit.  */
1001               ch = GET ();
1002               old_state = 3;
1003             }
1004           else if (state == 9)
1005             old_state = 3;
1006           else
1007             old_state = state;
1008           state = 5;
1009           PUT (ch);
1010           break;
1011
1012 #ifndef IEEE_STYLE
1013         case LEX_IS_ONECHAR_QUOTE:
1014           if (state == 10)
1015             {
1016               /* Preserve the whitespace in foo 'b'.  */
1017               UNGET (ch);
1018               state = 3;
1019               PUT (' ');
1020               break;
1021             }
1022           ch = GET ();
1023           if (ch == EOF)
1024             {
1025               as_warn (_("end of file after a one-character quote; \\0 inserted"));
1026               ch = 0;
1027             }
1028           if (ch == '\\')
1029             {
1030               ch = GET ();
1031               if (ch == EOF)
1032                 {
1033                   as_warn (_("end of file in escape character"));
1034                   ch = '\\';
1035                 }
1036               else
1037                 ch = process_escape (ch);
1038             }
1039           sprintf (out_buf, "%d", (int) (unsigned char) ch);
1040
1041           /* None of these 'x constants for us.  We want 'x'.  */
1042           if ((ch = GET ()) != '\'')
1043             {
1044 #ifdef REQUIRE_CHAR_CLOSE_QUOTE
1045               as_warn (_("missing close quote; (assumed)"));
1046 #else
1047               if (ch != EOF)
1048                 UNGET (ch);
1049 #endif
1050             }
1051           if (strlen (out_buf) == 1)
1052             {
1053               PUT (out_buf[0]);
1054               break;
1055             }
1056           if (state == 9)
1057             old_state = 3;
1058           else
1059             old_state = state;
1060           state = -1;
1061           out_string = out_buf;
1062           PUT (*out_string++);
1063           break;
1064 #endif
1065
1066         case LEX_IS_COLON:
1067 #ifdef KEEP_WHITE_AROUND_COLON
1068           state = 9;
1069 #else
1070           if (state == 9 || state == 10)
1071             state = 3;
1072           else if (state != 3)
1073             state = 1;
1074 #endif
1075           PUT (ch);
1076           break;
1077
1078         case LEX_IS_NEWLINE:
1079           /* Roll out a bunch of newlines from inside comments, etc.  */
1080           if (add_newlines)
1081             {
1082               --add_newlines;
1083               UNGET (ch);
1084             }
1085           /* Fall through.  */
1086
1087         case LEX_IS_LINE_SEPARATOR:
1088           state = 0;
1089           PUT (ch);
1090           break;
1091
1092         case LEX_IS_PARALLEL_SEPARATOR:
1093           state = 1;
1094           PUT (ch);
1095           break;
1096
1097 #ifdef TC_V850
1098         case LEX_IS_DOUBLEDASH_1ST:
1099           ch2 = GET ();
1100           if (ch2 != '-')
1101             {
1102               UNGET (ch2);
1103               goto de_fault;
1104             }
1105           /* Read and skip to end of line.  */
1106           do
1107             {
1108               ch = GET ();
1109             }
1110           while (ch != EOF && ch != '\n');
1111
1112           if (ch == EOF)
1113             as_warn (_("end of file in comment; newline inserted"));
1114
1115           state = 0;
1116           PUT ('\n');
1117           break;
1118 #endif
1119 #ifdef DOUBLEBAR_PARALLEL
1120         case LEX_IS_DOUBLEBAR_1ST:
1121           ch2 = GET ();
1122           UNGET (ch2);
1123           if (ch2 != '|')
1124             goto de_fault;
1125
1126           /* Handle '||' in two states as invoking PUT twice might
1127              result in the first one jumping out of this loop.  We'd
1128              then lose track of the state and one '|' char.  */
1129           state = 13;
1130           PUT ('|');
1131           break;
1132 #endif
1133         case LEX_IS_LINE_COMMENT_START:
1134           /* FIXME-someday: The two character comment stuff was badly
1135              thought out.  On i386, we want '/' as line comment start
1136              AND we want C style comments.  hence this hack.  The
1137              whole lexical process should be reworked.  xoxorich.  */
1138           if (ch == '/')
1139             {
1140               ch2 = GET ();
1141               if (ch2 == '*')
1142                 {
1143                   old_state = 3;
1144                   state = -2;
1145                   break;
1146                 }
1147               else
1148                 {
1149                   UNGET (ch2);
1150                 }
1151             }
1152
1153           if (state == 0 || state == 1) /* Only comment at start of line.  */
1154             {
1155               int startch;
1156
1157               startch = ch;
1158
1159               do
1160                 {
1161                   ch = GET ();
1162                 }
1163               while (ch != EOF && IS_WHITESPACE (ch));
1164
1165               if (ch == EOF)
1166                 {
1167                   as_warn (_("end of file in comment; newline inserted"));
1168                   PUT ('\n');
1169                   break;
1170                 }
1171
1172               if (ch < '0' || ch > '9' || state != 0 || startch != '#')
1173                 {
1174                   /* Not a cpp line.  */
1175                   while (ch != EOF && !IS_NEWLINE (ch))
1176                     ch = GET ();
1177                   if (ch == EOF)
1178                     as_warn (_("end of file in comment; newline inserted"));
1179                   state = 0;
1180                   PUT ('\n');
1181                   break;
1182                 }
1183               /* Looks like `# 123 "filename"' from cpp.  */
1184               UNGET (ch);
1185               old_state = 4;
1186               state = -1;
1187               if (scrub_m68k_mri)
1188                 out_string = "\tlinefile ";
1189               else
1190                 out_string = "\t.linefile ";
1191               PUT (*out_string++);
1192               break;
1193             }
1194
1195 #ifdef TC_D10V
1196           /* All insns end in a char for which LEX_IS_SYMBOL_COMPONENT is true.
1197              Trap is the only short insn that has a first operand that is
1198              neither register nor label.
1199              We must prevent exef0f ||trap #1 to degenerate to exef0f ||trap#1 .
1200              We can't make '#' LEX_IS_SYMBOL_COMPONENT because it is
1201              already LEX_IS_LINE_COMMENT_START.  However, it is the
1202              only character in line_comment_chars for d10v, hence we
1203              can recognize it as such.  */
1204           /* An alternative approach would be to reset the state to 1 when
1205              we see '||', '<'- or '->', but that seems to be overkill.  */
1206           if (state == 10)
1207             PUT (' ');
1208 #endif
1209           /* We have a line comment character which is not at the
1210              start of a line.  If this is also a normal comment
1211              character, fall through.  Otherwise treat it as a default
1212              character.  */
1213           if (strchr (tc_comment_chars, ch) == NULL
1214               && (! scrub_m68k_mri
1215                   || (ch != '!' && ch != '*')))
1216             goto de_fault;
1217           if (scrub_m68k_mri
1218               && (ch == '!' || ch == '*' || ch == '#')
1219               && state != 1
1220               && state != 10)
1221             goto de_fault;
1222           /* Fall through.  */
1223         case LEX_IS_COMMENT_START:
1224 #if defined TC_ARM && defined OBJ_ELF
1225           /* On the ARM, `@' is the comment character.
1226              Unfortunately this is also a special character in ELF .symver
1227              directives (and .type, though we deal with those another way).
1228              So we check if this line is such a directive, and treat
1229              the character as default if so.  This is a hack.  */
1230           if ((symver_state != NULL) && (*symver_state == 0))
1231             goto de_fault;
1232 #endif
1233 #ifdef WARN_COMMENTS
1234           if (!found_comment)
1235             as_where (&found_comment_file, &found_comment);
1236 #endif
1237           do
1238             {
1239               ch = GET ();
1240             }
1241           while (ch != EOF && !IS_NEWLINE (ch));
1242           if (ch == EOF)
1243             as_warn (_("end of file in comment; newline inserted"));
1244           state = 0;
1245           PUT ('\n');
1246           break;
1247
1248         case LEX_IS_SYMBOL_COMPONENT:
1249           if (state == 10)
1250             {
1251               /* This is a symbol character following another symbol
1252                  character, with whitespace in between.  We skipped
1253                  the whitespace earlier, so output it now.  */
1254               UNGET (ch);
1255               state = 3;
1256               PUT (' ');
1257               break;
1258             }
1259
1260 #ifdef TC_Z80
1261           /* "af'" is a symbol containing '\''.  */
1262           if (state == 3 && (ch == 'a' || ch == 'A')) 
1263             {
1264               state = 16;
1265               PUT (ch);
1266               ch = GET ();
1267               if (ch == 'f' || ch == 'F') 
1268                 {
1269                   state = 17;
1270                   PUT (ch);
1271                   break;
1272                 }
1273               else
1274                 {
1275                   state = 9;
1276                   if (!IS_SYMBOL_COMPONENT (ch)) 
1277                     {
1278                       UNGET (ch);
1279                       break;
1280                     }
1281                 }
1282             }
1283 #endif
1284           if (state == 3)
1285             state = 9;
1286
1287           /* This is a common case.  Quickly copy CH and all the
1288              following symbol component or normal characters.  */
1289           if (to + 1 < toend
1290               && mri_state == NULL
1291 #if defined TC_ARM && defined OBJ_ELF
1292               && symver_state == NULL
1293 #endif
1294               )
1295             {
1296               char *s;
1297               int len;
1298
1299               for (s = from; s < fromend; s++)
1300                 {
1301                   int type;
1302
1303                   ch2 = *(unsigned char *) s;
1304                   type = lex[ch2];
1305                   if (type != 0
1306                       && type != LEX_IS_SYMBOL_COMPONENT)
1307                     break;
1308                 }
1309
1310               if (s > from)
1311                 /* Handle the last character normally, for
1312                    simplicity.  */
1313                 --s;
1314
1315               len = s - from;
1316
1317               if (len > (toend - to) - 1)
1318                 len = (toend - to) - 1;
1319
1320               if (len > 0)
1321                 {
1322                   PUT (ch);
1323                   memcpy (to, from, len);
1324                   to += len;
1325                   from += len;
1326                   if (to >= toend)
1327                     goto tofull;
1328                   ch = GET ();
1329                 }
1330             }
1331
1332           /* Fall through.  */
1333         default:
1334         de_fault:
1335           /* Some relatively `normal' character.  */
1336           if (state == 0)
1337             {
1338               state = 11;       /* Now seeing label definition.  */
1339             }
1340           else if (state == 1)
1341             {
1342               state = 2;        /* Ditto.  */
1343             }
1344           else if (state == 9)
1345             {
1346               if (!IS_SYMBOL_COMPONENT (ch))
1347                 state = 3;
1348             }
1349           else if (state == 10)
1350             {
1351               if (ch == '\\')
1352                 {
1353                   /* Special handling for backslash: a backslash may
1354                      be the beginning of a formal parameter (of a
1355                      macro) following another symbol character, with
1356                      whitespace in between.  If that is the case, we
1357                      output a space before the parameter.  Strictly
1358                      speaking, correct handling depends upon what the
1359                      macro parameter expands into; if the parameter
1360                      expands into something which does not start with
1361                      an operand character, then we don't want to keep
1362                      the space.  We don't have enough information to
1363                      make the right choice, so here we are making the
1364                      choice which is more likely to be correct.  */
1365                   PUT (' ');
1366                 }
1367
1368               state = 3;
1369             }
1370           PUT (ch);
1371           break;
1372         }
1373     }
1374
1375   /*NOTREACHED*/
1376
1377  fromeof:
1378   /* We have reached the end of the input.  */
1379   return to - tostart;
1380
1381  tofull:
1382   /* The output buffer is full.  Save any input we have not yet
1383      processed.  */
1384   if (fromend > from)
1385     {
1386       saved_input = from;
1387       saved_input_len = fromend - from;
1388     }
1389   else
1390     saved_input = NULL;
1391
1392   return to - tostart;
1393 }
1394