ChangeLog rotatation and copyright year update
[deliverable/binutils-gdb.git] / gas / app.c
index d7eb50926d2cf91621137725bea8afb57e4347d8..67402e20e524a78c1631a63a6fe3f6a105d77c27 100644 (file)
--- a/gas/app.c
+++ b/gas/app.c
@@ -1,19 +1,17 @@
 /* This is the Assembler Pre-Processor
-   Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1987-2015 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    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 +80,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)
@@ -153,7 +158,10 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
   for (p = line_comment_chars; *p; p++)
     lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
 
-  for (p = line_separator_chars; *p; p++)
+#ifndef tc_line_separator_chars
+#define tc_line_separator_chars line_separator_chars
+#endif
+  for (p = tc_line_separator_chars; *p; p++)
     lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
 
 #ifdef tc_parallel_separator_chars
@@ -190,6 +198,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.  */
@@ -199,7 +215,7 @@ static char *out_string;
 static char out_buf[20];
 static int add_newlines;
 static char *saved_input;
-static int saved_input_len;
+static size_t saved_input_len;
 static char input_buffer[32 * 1024];
 static const char *mri_state;
 static char mri_last_ch;
@@ -217,7 +233,7 @@ struct app_save
   char         out_buf[sizeof (out_buf)];
   int          add_newlines;
   char *       saved_input;
-  int          saved_input_len;
+  size_t       saved_input_len;
 #ifdef TC_M68K
   int          scrub_m68k_mri;
 #endif
@@ -231,7 +247,7 @@ struct app_save
 char *
 app_push (void)
 {
-  register struct app_save *saved;
+  struct app_save *saved;
 
   saved = (struct app_save *) xmalloc (sizeof (*saved));
   saved->state = state;
@@ -243,7 +259,7 @@ app_push (void)
     saved->saved_input = NULL;
   else
     {
-      saved->saved_input = xmalloc (saved_input_len);
+      saved->saved_input = (char *) xmalloc (saved_input_len);
       memcpy (saved->saved_input, saved_input, saved_input_len);
       saved->saved_input_len = saved_input_len;
     }
@@ -260,6 +276,7 @@ app_push (void)
 
   state = 0;
   saved_input = NULL;
+  add_newlines = 0;
 
   return (char *) saved;
 }
@@ -267,7 +284,7 @@ app_push (void)
 void
 app_pop (char *arg)
 {
-  register struct app_save *saved = (struct app_save *) arg;
+  struct app_save *saved = (struct app_save *) arg;
 
   /* There is no do_scrub_end ().  */
   state = saved->state;
@@ -279,7 +296,7 @@ app_pop (char *arg)
     saved_input = NULL;
   else
     {
-      assert (saved->saved_input_len <= (int) (sizeof input_buffer));
+      gas_assert (saved->saved_input_len <= sizeof (input_buffer));
       memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
       saved_input = input_buffer;
       saved_input_len = saved->saved_input_len;
@@ -335,15 +352,15 @@ process_escape (int ch)
    machine, and saves its state so that it may return at any point.
    This is the way the old code used to work.  */
 
-int
-do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
+size_t
+do_scrub_chars (size_t (*get) (char *, size_t), char *tostart, size_t tolen)
 {
   char *to = tostart;
   char *toend = tostart + tolen;
   char *from;
   char *fromend;
-  int fromlen;
-  register int ch, ch2 = 0;
+  size_t fromlen;
+  int ch, ch2 = 0;
   /* Character that started the string we're working on.  */
   static char quotechar;
 
@@ -369,11 +386,11 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
         13: After seeing a vertical bar, looking for a second
             vertical bar as a parallel expression separator.
 #endif
-#ifdef TC_IA64
-        14: After seeing a `(' at state 0, looking for a `)' as
-            predicate.
-        15: After seeing a `(' at state 1, looking for a `)' as
-            predicate.
+#ifdef TC_PREDICATE_START_CHAR
+        14: After seeing a predicate start character at state 0, looking
+            for a predicate end character as predicate.
+        15: After seeing a predicate start character at state 1, looking
+            for a predicate end character as predicate.
 #endif
 #ifdef TC_Z80
         16: After seeing an 'a' or an 'A' at the start of a symbol
@@ -532,7 +549,7 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
             GET and PUT macros.  */
          {
            char *s;
-           int len;
+           ptrdiff_t len;
 
            for (s = from; s < fromend; s++)
              {
@@ -550,14 +567,22 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
                memcpy (to, from, len);
                to += len;
                from += len;
+               if (to >= toend)
+                 goto tofull;
              }
          }
 
          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);
            }
@@ -644,13 +669,23 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
             line from just after the first white space.  */
          state = 1;
          PUT ('|');
+#ifdef TC_TIC6X
+         /* "||^" is used for SPMASKed instructions.  */
+         ch = GET ();
+         if (ch == EOF)
+           goto fromeof;
+         else if (ch == '^')
+           PUT ('^');
+         else
+           UNGET (ch);
+#endif
          continue;
 #endif
 #ifdef TC_Z80
        case 16:
          /* We have seen an 'a' at the start of a symbol, look for an 'f'.  */
          ch = GET ();
-         if (ch == 'f' || ch == 'F') 
+         if (ch == 'f' || ch == 'F')
            {
              state = 17;
              PUT (ch);
@@ -668,7 +703,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
@@ -679,8 +714,8 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
       /* flushchar: */
       ch = GET ();
 
-#ifdef TC_IA64
-      if (ch == '(' && (state == 0 || state == 1))
+#ifdef TC_PREDICATE_START_CHAR
+      if (ch == TC_PREDICATE_START_CHAR && (state == 0 || state == 1))
        {
          state += 14;
          PUT (ch);
@@ -688,7 +723,7 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
        }
       else if (state == 14 || state == 15)
        {
-         if (ch == ')')
+         if (ch == TC_PREDICATE_END_CHAR)
            {
              state -= 14;
              PUT (ch);
@@ -824,7 +859,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;
@@ -881,7 +917,11 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
              PUT (' ');
              break;
            case 3:
+#ifndef TC_KEEP_OPERAND_SPACES
+             /* For TI C6X, we keep these spaces as they may separate
+                functional unit specifiers from operands.  */
              if (scrub_m68k_mri)
+#endif
                {
                  /* In MRI mode, we keep these spaces.  */
                  UNGET (ch);
@@ -891,7 +931,9 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
              goto recycle;     /* Sp in operands */
            case 9:
            case 10:
+#ifndef TC_KEEP_OPERAND_SPACES
              if (scrub_m68k_mri)
+#endif
                {
                  /* In MRI mode, we keep these spaces.  */
                  state = 3;
@@ -1000,6 +1042,16 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 
 #ifndef IEEE_STYLE
        case LEX_IS_ONECHAR_QUOTE:
+#ifdef H_TICK_HEX
+         if (state == 9 && enable_h_tick_hex)
+           {
+             char c;
+
+             c = GET ();
+             as_warn ("'%c found after symbol", c);
+             UNGET (c);
+           }
+#endif
          if (state == 10)
            {
              /* Preserve the whitespace in foo 'b'.  */
@@ -1088,7 +1140,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.  */
@@ -1108,7 +1161,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;
 
@@ -1164,9 +1218,16 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
                  while (ch != EOF && !IS_NEWLINE (ch))
                    ch = GET ();
                  if (ch == EOF)
-                   as_warn (_("end of file in comment; newline inserted"));
+                   {
+                     as_warn (_("end of file in comment; newline inserted"));
+                     PUT ('\n');
+                   }
+                 else /* IS_NEWLINE (ch) */
+                   {
+                     /* To process non-zero add_newlines.  */
+                     UNGET (ch);
+                   }
                  state = 0;
-                 PUT ('\n');
                  break;
                }
              /* Looks like `# 123 "filename"' from cpp.  */
@@ -1243,6 +1304,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)
            {
@@ -1257,12 +1338,12 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 
 #ifdef TC_Z80
          /* "af'" is a symbol containing '\''.  */
-         if (state == 3 && (ch == 'a' || ch == 'A')) 
+         if (state == 3 && (ch == 'a' || ch == 'A'))
            {
              state = 16;
              PUT (ch);
              ch = GET ();
-             if (ch == 'f' || ch == 'F') 
+             if (ch == 'f' || ch == 'F')
                {
                  state = 17;
                  PUT (ch);
@@ -1271,9 +1352,10 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
              else
                {
                  state = 9;
-                 if (!IS_SYMBOL_COMPONENT (ch)) 
+                 if (ch == EOF || !IS_SYMBOL_COMPONENT (ch))
                    {
-                     UNGET (ch);
+                     if (ch != EOF)
+                       UNGET (ch);
                      break;
                    }
                }
@@ -1292,7 +1374,7 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
              )
            {
              char *s;
-             int len;
+             ptrdiff_t len;
 
              for (s = from; s < fromend; s++)
                {
@@ -1397,4 +1479,3 @@ do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
 
   return to - tostart;
 }
-
This page took 0.036777 seconds and 4 git commands to generate.