(buffer_and_nest): Store more to sb instead of '\n'.
[binutils-gdb.git] / gas / macro.c
index 3e03c5d68f1a8e30c3d349fcd79a2415d38ffd75..469ca801f32101fc9e078dd5375fa429608c54e0 100644 (file)
@@ -1,5 +1,5 @@
-/* macro.c - macro support for gas and gasp
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+/* macro.c - macro support for gas
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    Written by Steve and Judy Chamberlain of Cygnus Support,
@@ -63,7 +63,7 @@ extern void *alloca ();
 #include "asintl.h"
 
 /* The routines in this file handle macro definition and expansion.
-   They are called by both gasp and gas.  */
+   They are called by gas.  */
 
 /* Internal functions.  */
 
@@ -75,8 +75,8 @@ static int get_apost_token PARAMS ((int, sb *, sb *, int));
 static int sub_actual
   PARAMS ((int, sb *, sb *, struct hash_control *, int, sb *, int));
 static const char *macro_expand_body
-  PARAMS ((sb *, sb *, formal_entry *, struct hash_control *, int, int));
-static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int));
+  PARAMS ((sb *, sb *, formal_entry *, struct hash_control *, int));
+static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *));
 
 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
 
@@ -93,13 +93,13 @@ static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int));
 
 /* The macro hash table.  */
 
-static struct hash_control *macro_hash;
+struct hash_control *macro_hash;
 
 /* Whether any macros have been defined.  */
 
 int macro_defined;
 
-/* Whether we are in GASP alternate mode.  */
+/* Whether we are in alternate syntax mode.  */
 
 static int macro_alternate;
 
@@ -222,8 +222,8 @@ buffer_and_nest (from, to, ptr, get_line)
            }
        }
 
-      /* Add a CR to the end and keep running.  */
-      sb_add_char (ptr, '\n');
+      /* Add the original end-of-line char to the end and keep running.  */
+      sb_add_char (ptr, more);
       line_start = ptr->len;
       more = get_line (ptr);
     }
@@ -366,7 +366,7 @@ get_any_string (idx, in, out, expand, pretend_quoted)
 
   if (idx < in->len)
     {
-      if (in->len > 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
+      if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
        {
          while (!ISSEP (in->ptr[idx]))
            sb_add_char (out, in->ptr[idx++]);
@@ -378,11 +378,12 @@ get_any_string (idx, in, out, expand, pretend_quoted)
          int val;
          char buf[20];
          /* Turns the next expression into a string.  */
+         /* xgettext: no-c-format */
          idx = (*macro_expr) (_("% operator needs absolute expression"),
                               idx + 1,
                               in,
                               &val);
-         sprintf(buf, "%d", val);
+         sprintf (buf, "%d", val);
          sb_add_string (out, buf);
        }
       else if (in->ptr[idx] == '"'
@@ -652,12 +653,11 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere)
 /* Expand the body of a macro.  */
 
 static const char *
-macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
+macro_expand_body (in, out, formals, formal_hash, locals)
      sb *in;
      sb *out;
      formal_entry *formals;
      struct hash_control *formal_hash;
-     int comment_char;
      int locals;
 {
   sb t;
@@ -688,14 +688,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
       else if (in->ptr[src] == '\\')
        {
          src++;
-         if (in->ptr[src] == comment_char && comment_char != '\0')
-           {
-             /* This is a comment, just drop the rest of the line.  */
-             while (src < in->len
-                    && in->ptr[src] != '\n')
-               src++;
-           }
-         else if (in->ptr[src] == '(')
+         if (in->ptr[src] == '(')
            {
              /* Sub in till the next ')' literally.  */
              src++;
@@ -778,7 +771,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
              formal_entry *f;
 
              src = sb_skip_white (src + 5, in);
-             while (in->ptr[src] != '\n' && in->ptr[src] != comment_char)
+             while (in->ptr[src] != '\n')
                {
                  static int loccnt;
                  char buf[20];
@@ -805,17 +798,6 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
                }
            }
        }
-      else if (comment_char != '\0'
-              && in->ptr[src] == comment_char
-              && src + 1 < in->len
-              && in->ptr[src + 1] == comment_char
-              && !inquote)
-       {
-         /* Two comment chars in a row cause the rest of the line to
-             be dropped.  */
-         while (src < in->len && in->ptr[src] != '\n')
-           src++;
-       }
       else if (in->ptr[src] == '"'
               || (macro_mri && in->ptr[src] == '\''))
        {
@@ -898,12 +880,11 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
    body.  */
 
 static const char *
-macro_expand (idx, in, m, out, comment_char)
+macro_expand (idx, in, m, out)
      int idx;
      sb *in;
      macro_entry *m;
      sb *out;
-     int comment_char;
 {
   sb t;
   formal_entry *ptr;
@@ -927,33 +908,33 @@ macro_expand (idx, in, m, out, comment_char)
       /* The macro may be called with an optional qualifier, which may
          be referred to in the macro body as \0.  */
       if (idx < in->len && in->ptr[idx] == '.')
-        {
-          /* The Microtec assembler ignores this if followed by a white space.
-                  (Macro invocation with empty extension) */
-          idx++;
-          if (    idx < in->len
-                   && in->ptr[idx] != ' '
-               && in->ptr[idx] != '\t')
-            {
-              formal_entry *n;
-
-              n = (formal_entry *) xmalloc (sizeof (formal_entry));
-              sb_new (&n->name);
-              sb_new (&n->def);
-              sb_new (&n->actual);
-              n->index = QUAL_INDEX;
-
-              n->next = m->formals;
-              m->formals = n;
-
-              idx = get_any_string (idx, in, &n->actual, 1, 0);
-            }
-        }
-  }
+       {
+         /* The Microtec assembler ignores this if followed by a white space.
+            (Macro invocation with empty extension) */
+         idx++;
+         if (    idx < in->len
+                 && in->ptr[idx] != ' '
+                 && in->ptr[idx] != '\t')
+           {
+             formal_entry *n;
+
+             n = (formal_entry *) xmalloc (sizeof (formal_entry));
+             sb_new (&n->name);
+             sb_new (&n->def);
+             sb_new (&n->actual);
+             n->index = QUAL_INDEX;
+
+             n->next = m->formals;
+             m->formals = n;
+
+             idx = get_any_string (idx, in, &n->actual, 1, 0);
+           }
+       }
+    }
 
   /* Peel off the actuals and store them away in the hash tables' actuals.  */
   idx = sb_skip_white (idx, in);
-  while (idx < in->len && in->ptr[idx] != comment_char)
+  while (idx < in->len)
     {
       int scan;
 
@@ -1055,8 +1036,7 @@ macro_expand (idx, in, m, out, comment_char)
       sb_add_string (&ptr->actual, buffer);
     }
 
-  err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash,
-                          comment_char, 1);
+  err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, 1);
   if (err != NULL)
     return err;
 
@@ -1089,14 +1069,12 @@ macro_expand (idx, in, m, out, comment_char)
 }
 
 /* Check for a macro.  If one is found, put the expansion into
-   *EXPAND.  COMMENT_CHAR is the comment character--this is used by
-   gasp.  Return 1 if a macro is found, 0 otherwise.  */
+   *EXPAND.  Return 1 if a macro is found, 0 otherwise.  */
 
 int
-check_macro (line, expand, comment_char, error, info)
+check_macro (line, expand, error, info)
      const char *line;
      sb *expand;
-     int comment_char;
      const char **error;
      macro_entry **info;
 {
@@ -1134,7 +1112,7 @@ check_macro (line, expand, comment_char, error, info)
     sb_add_char (&line_sb, *s++);
 
   sb_new (expand);
-  *error = macro_expand (0, &line_sb, macro, expand, comment_char);
+  *error = macro_expand (0, &line_sb, macro, expand);
 
   sb_kill (&line_sb);
 
@@ -1159,13 +1137,12 @@ delete_macro (name)
    success, or an error message otherwise.  */
 
 const char *
-expand_irp (irpc, idx, in, out, get_line, comment_char)
+expand_irp (irpc, idx, in, out, get_line)
      int irpc;
      int idx;
      sb *in;
      sb *out;
      int (*get_line) PARAMS ((sb *));
-     int comment_char;
 {
   const char *mn;
   sb sub;
@@ -1203,10 +1180,10 @@ expand_irp (irpc, idx, in, out, get_line, comment_char)
   sb_reset (out);
 
   idx = sb_skip_comma (idx, in);
-  if (idx >= in->len || in->ptr[idx] == comment_char)
+  if (idx >= in->len)
     {
       /* Expand once with a null string.  */
-      err = macro_expand_body (&sub, out, &f, h, comment_char, 0);
+      err = macro_expand_body (&sub, out, &f, h, 0);
       if (err != NULL)
        return err;
     }
@@ -1214,7 +1191,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char)
     {
       if (irpc && in->ptr[idx] == '"')
        ++idx;
-      while (idx < in->len && in->ptr[idx] != comment_char)
+      while (idx < in->len)
        {
          if (!irpc)
            idx = get_any_string (idx, in, &f.actual, 1, 0);
@@ -1225,7 +1202,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char)
                  int nxt;
 
                  nxt = sb_skip_white (idx + 1, in);
-                 if (nxt >= in->len || in->ptr[nxt] == comment_char)
+                 if (nxt >= in->len)
                    {
                      idx = nxt;
                      break;
@@ -1235,7 +1212,7 @@ expand_irp (irpc, idx, in, out, get_line, comment_char)
              sb_add_char (&f.actual, in->ptr[idx]);
              ++idx;
            }
-         err = macro_expand_body (&sub, out, &f, h, comment_char, 0);
+         err = macro_expand_body (&sub, out, &f, h, 0);
          if (err != NULL)
            return err;
          if (!irpc)