Wed Mar 25 13:10:42 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
authorIan Lance Taylor <ian@airs.com>
Wed, 25 Mar 1998 18:12:52 +0000 (18:12 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 25 Mar 1998 18:12:52 +0000 (18:12 +0000)
        * gasp.c (IS*): Cast argument to unsigned char, not unsigned int.
        * macro.c (macro_expand_body): Increase buffer size.
        * messages.c (as_warn): Likewise.
(as_warn_where, as_bad, as_bad_where): Likewise.

gas/ChangeLog
gas/gasp.c
gas/macro.c

index da1bb5161719939fa1499bf796eb9327e669003e..c40837e0ccee6cc2e53d42222004695fb6f538a9 100644 (file)
@@ -1,3 +1,10 @@
+Wed Mar 25 13:10:42 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * gasp.c (IS*): Cast argument to unsigned char, not unsigned int.
+        * macro.c (macro_expand_body): Increase buffer size.
+        * messages.c (as_warn): Likewise.
+       (as_warn_where, as_bad, as_bad_where): Likewise.
+
 Wed Mar 25 12:59:07 1998  Ian Lance Taylor  <ian@cygnus.com>
 
        Based on patch from H.J. Lu  <hjl@gnu.org>:
index 9d2b2d0c67b6a5d4e8c35db9b8efd1afa9ec0805..80e2a925212d6ee4086c23580a1645327708be7a 100644 (file)
@@ -105,12 +105,12 @@ FILE *outfile;
 #define WHITEBIT 8
 #define COMMENTBIT 16
 #define BASEBIT  32
-#define ISCOMMENTCHAR(x) (chartype[(unsigned)(x)] & COMMENTBIT)
-#define ISFIRSTCHAR(x)  (chartype[(unsigned)(x)] & FIRSTBIT)
-#define ISNEXTCHAR(x)   (chartype[(unsigned)(x)] & NEXTBIT)
-#define ISSEP(x)        (chartype[(unsigned)(x)] & SEPBIT)
-#define ISWHITE(x)      (chartype[(unsigned)(x)] & WHITEBIT)
-#define ISBASE(x)       (chartype[(unsigned)(x)] & BASEBIT)
+#define ISCOMMENTCHAR(x) (chartype[(unsigned char)(x)] & COMMENTBIT)
+#define ISFIRSTCHAR(x)  (chartype[(unsigned char)(x)] & FIRSTBIT)
+#define ISNEXTCHAR(x)   (chartype[(unsigned char)(x)] & NEXTBIT)
+#define ISSEP(x)        (chartype[(unsigned char)(x)] & SEPBIT)
+#define ISWHITE(x)      (chartype[(unsigned char)(x)] & WHITEBIT)
+#define ISBASE(x)       (chartype[(unsigned char)(x)] & BASEBIT)
 static char chartype[256];
 
 
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 */