sanitize fr30 parts
[deliverable/binutils-gdb.git] / gas / macro.c
index e03b0f710b3c623e7756ddd8bb83142d0b689714..02738ddb3155f97572f0970697dfbf00d151c8f4 100644 (file)
@@ -1,5 +1,5 @@
 /* macro.c - macro support for gas and gasp
-   Copyright (C) 1994, 95, 96, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc.
 
    Written by Steve and Judy Chamberlain of Cygnus Support,
       sac@cygnus.com
 
 /* AIX requires this to be the first thing in the file.  */
 #ifdef __GNUC__
-#ifdef __STDC__
+# ifndef alloca
+#  ifdef __STDC__
 extern void *alloca ();
-#else
+#  else
 extern char *alloca ();
-#endif
+#  endif
+# endif
 #else
 # if HAVE_ALLOCA_H
 #  include <alloca.h>
@@ -119,7 +121,8 @@ static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int));
 
 #define ISSEP(x) \
  ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
-  || (x) == '<' || (x) == '>' || (x) == ')' || (x) == '(')
+  || (x) == ')' || (x) == '(' \
+  || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
 
 #define ISBASE(x) \
   ((x) == 'b' || (x) == 'B' \
@@ -295,49 +298,31 @@ getstring (idx, in, acc)
 
   while (idx < in->len
         && (in->ptr[idx] == '"' 
-            || in->ptr[idx] == '<' 
+            || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
             || (in->ptr[idx] == '\'' && macro_alternate)))
     {
       if (in->ptr[idx] == '<')
        {
-         if (macro_alternate || macro_mri)
+         int nest = 0;
+         idx++;
+         while ((in->ptr[idx] != '>' || nest)
+                && idx < in->len)
            {
-             int nest = 0;
-             idx++;
-             while ((in->ptr[idx] != '>' || nest)
-                    && idx < in->len)
+             if (in->ptr[idx] == '!')
                {
-                 if (in->ptr[idx] == '!')
-                   {
-                     idx++  ;
-                     sb_add_char (acc, in->ptr[idx++]);
-                   }
-                 else
-                   {
-                     if (in->ptr[idx] == '>')
-                       nest--;
-                     if (in->ptr[idx] == '<')
-                       nest++;
-                     sb_add_char (acc, in->ptr[idx++]);
-                   }
+                 idx++  ;
+                 sb_add_char (acc, in->ptr[idx++]);
+               }
+             else
+               {
+                 if (in->ptr[idx] == '>')
+                   nest--;
+                 if (in->ptr[idx] == '<')
+                   nest++;
+                 sb_add_char (acc, in->ptr[idx++]);
                }
-             idx++;
-           }
-         else
-           {
-             int code;
-             idx++;
-             idx = ((*macro_expr)
-                    ("character code in string must be absolute expression",
-                     idx, in, &code));
-             sb_add_char (acc, code);
-
-#if 0
-             if (in->ptr[idx] != '>')
-               ERROR ((stderr, "Missing > for character code.\n"));
-#endif
-             idx++;
            }
+         idx++;
        }
       else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
        {
@@ -409,7 +394,7 @@ get_any_string (idx, in, out, expand, pretend_quoted)
          sb_add_string (out, buf);
        }
       else if (in->ptr[idx] == '"'
-              || in->ptr[idx] == '<'
+              || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
               || (macro_alternate && in->ptr[idx] == '\''))
        {
          if (macro_alternate
@@ -436,7 +421,8 @@ get_any_string (idx, in, out, expand, pretend_quoted)
                     || (in->ptr[idx] != ' '
                         && in->ptr[idx] != '\t'
                         && in->ptr[idx] != ','
-                        && in->ptr[idx] != '<')))
+                        && (in->ptr[idx] != '<'
+                            || (! macro_alternate && ! macro_mri)))))
            {
              if (in->ptr[idx] == '"' 
                  || in->ptr[idx] == '\'')
@@ -655,6 +641,11 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere)
          sb_add_sb (out, &ptr->def);
        }
     }
+  else if (kind == '&')
+    {
+      /* Doing this permits people to use & in macro bodies.  */
+      sb_add_char (out, '&');
+    }
   else if (copyifnotthere)
     {
       sb_add_sb (out, t);
@@ -699,8 +690,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
            }
          else
            {
-             /* FIXME: Why do we do this?  It prevents people from
-                 using the & operator in a macro.  */
+             /* FIXME: Why do we do this?  */
              src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
            }
        }
@@ -731,7 +721,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
            {
              /* Sub in the macro invocation number */
 
-             char buffer[6];
+             char buffer[10];
              src++;
              sprintf (buffer, "%05d", macro_number);
              sb_add_string (out, buffer);
@@ -977,8 +967,8 @@ macro_expand (idx, in, m, out, comment_char)
       if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
        {
          is_keyword = 1;
-         if (is_positional)
-           return "can't mix positional and keyword arguments";
+
+         /* It's OK to go from positional to keyword.  */
 
          /* This is a keyword arg, fetch the formal name and
             then the actual stuff */
This page took 0.028854 seconds and 4 git commands to generate.