PR 6913
[deliverable/binutils-gdb.git] / gas / app.c
index e5f177801fdb264484b4187786f40bf0a36c5920..6fa604fa831e63403765c1ae2a13f21019779c06 100644 (file)
--- a/gas/app.c
+++ b/gas/app.c
@@ -7,13 +7,13 @@
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
-   GAS is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GAS is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the Free
 #endif
 #endif
 
+#ifdef H_TICK_HEX
+int enable_h_tick_hex = 0;
+#endif
+
 #ifdef TC_M68K
 /* Whether we are scrubbing in m68k MRI mode.  This is different from
    flag_m68k_mri, because the two flags will be affected by the .mri
@@ -78,6 +82,9 @@ static const char symbol_chars[] =
 #define LEX_IS_DOUBLEBAR_1ST           13
 #endif
 #define LEX_IS_PARALLEL_SEPARATOR      14
+#ifdef H_TICK_HEX
+#define LEX_IS_H                       15
+#endif
 #define IS_SYMBOL_COMPONENT(c)         (lex[c] == LEX_IS_SYMBOL_COMPONENT)
 #define IS_WHITESPACE(c)               (lex[c] == LEX_IS_WHITESPACE)
 #define IS_LINE_SEPARATOR(c)           (lex[c] == LEX_IS_LINE_SEPARATOR)
@@ -190,6 +197,14 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
   /* Must do this is we want VLIW instruction with "->" or "<-".  */
   lex['-'] = LEX_IS_SYMBOL_COMPONENT;
 #endif
+
+#ifdef H_TICK_HEX
+  if (enable_h_tick_hex)
+    {
+      lex['h'] = LEX_IS_H;
+      lex['H'] = LEX_IS_H;
+    }
+#endif
 }
 
 /* Saved state of the scrubber.  */
@@ -558,8 +573,14 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
          ch = GET ();
          if (ch == EOF)
            {
+             /* This buffer is here specifically so
+                that the UNGET below will work.  */
+             static char one_char_buf[1];
+
              as_warn (_("end of file in string; '%c' inserted"), quotechar);
              state = old_state;
+             from = fromend = one_char_buf + 1;
+             fromlen = 1;
              UNGET ('\n');
              PUT (quotechar);
            }
@@ -670,7 +691,7 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
          if (ch == '\'')
            /* Change to avoid warning about unclosed string.  */
            PUT ('`');
-         else
+         else if (ch != EOF)
            UNGET (ch);
          break;
 #endif
@@ -826,7 +847,8 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
              /* Only keep this white if there's no white *after* the
                 colon.  */
              ch2 = GET ();
-             UNGET (ch2);
+             if (ch2 != EOF)
+               UNGET (ch2);
              if (!IS_WHITESPACE (ch2))
                {
                  state = 9;
@@ -1002,6 +1024,14 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 
 #ifndef IEEE_STYLE
        case LEX_IS_ONECHAR_QUOTE:
+         if (state == 9)
+           {
+             char c;
+
+             c = GET ();
+             as_warn ("'%c found after symbol", c);
+             UNGET (c);
+           }
          if (state == 10)
            {
              /* Preserve the whitespace in foo 'b'.  */
@@ -1090,7 +1120,8 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
          ch2 = GET ();
          if (ch2 != '-')
            {
-             UNGET (ch2);
+             if (ch2 != EOF)
+               UNGET (ch2);
              goto de_fault;
            }
          /* Read and skip to end of line.  */
@@ -1110,7 +1141,8 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 #ifdef DOUBLEBAR_PARALLEL
        case LEX_IS_DOUBLEBAR_1ST:
          ch2 = GET ();
-         UNGET (ch2);
+         if (ch2 != EOF)
+           UNGET (ch2);
          if (ch2 != '|')
            goto de_fault;
 
@@ -1245,6 +1277,26 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
          PUT ('\n');
          break;
 
+#ifdef H_TICK_HEX
+       case LEX_IS_H:
+         /* Look for strings like H'[0-9A-Fa-f] and if found, replace
+            the H' with 0x to make them gas-style hex characters.  */
+         if (enable_h_tick_hex)
+           {
+             char quot;
+
+             quot = GET ();
+             if (quot == '\'')
+               {
+                 UNGET ('x');
+                 ch = '0';
+               }
+             else
+               UNGET (quot);
+           }
+         /* FALL THROUGH */
+#endif
+
        case LEX_IS_SYMBOL_COMPONENT:
          if (state == 10)
            {
@@ -1275,7 +1327,8 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
                  state = 9;
                  if (!IS_SYMBOL_COMPONENT (ch)) 
                    {
-                     UNGET (ch);
+                     if (ch != EOF)
+                       UNGET (ch);
                      break;
                    }
                }
@@ -1399,4 +1452,3 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 
   return to - tostart;
 }
-
This page took 0.028831 seconds and 4 git commands to generate.