* gas/i386/opcode.s: Pad section.
[deliverable/binutils-gdb.git] / gas / macro.c
index 08424317c4a3d023e072e34e47ddd767107407dd..edadcc947ae91cc6b15feb270c54ced642ee5b16 100644 (file)
@@ -1,5 +1,5 @@
-/* macro.c - macro support for gas and gasp
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+/* macro.c - macro support for gas
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
    Free Software Foundation, Inc.
 
    Written by Steve and Judy Chamberlain of Cygnus Support,
@@ -54,6 +54,7 @@ extern void *alloca ();
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
+#include "as.h"
 #include "libiberty.h"
 #include "safe-ctype.h"
 #include "sb.h"
@@ -63,20 +64,19 @@ 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.  */
 
-static int get_token PARAMS ((int, sb *, sb *));
-static int getstring PARAMS ((int, sb *, sb *));
-static int get_any_string PARAMS ((int, sb *, sb *, int, int));
-static int do_formals PARAMS ((macro_entry *, int, sb *));
-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 int get_token (int, sb *, sb *);
+static int getstring (int, sb *, sb *);
+static int get_any_string (int, sb *, sb *, int, int);
+static int do_formals (macro_entry *, int, sb *);
+static int get_apost_token (int, sb *, sb *, int);
+static int sub_actual (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));
+  (sb *, sb *, formal_entry *, struct hash_control *, int);
+static const char *macro_expand (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;
 
@@ -113,7 +113,7 @@ static int macro_strip_at;
 
 /* Function to use to parse an expression.  */
 
-static int (*macro_expr) PARAMS ((const char *, int, sb *, int *));
+static int (*macro_expr) (const char *, int, sb *, int *);
 
 /* Number of macro expansions that have been done.  */
 
@@ -122,11 +122,8 @@ static int macro_number;
 /* Initialize macro processing.  */
 
 void
-macro_init (alternate, mri, strip_at, expr)
-     int alternate;
-     int mri;
-     int strip_at;
-     int (*expr) PARAMS ((const char *, int, sb *, int *));
+macro_init (int alternate, int mri, int strip_at,
+           int (*expr) (const char *, int, sb *, int *))
 {
   macro_hash = hash_new ();
   macro_defined = 0;
@@ -136,11 +133,18 @@ macro_init (alternate, mri, strip_at, expr)
   macro_expr = expr;
 }
 
+/* Switch in and out of alternate mode on the fly.  */
+
+void
+macro_set_alternate (int alternate)
+{
+  macro_alternate = alternate;
+}
+
 /* Switch in and out of MRI mode on the fly.  */
 
 void
-macro_mri_mode (mri)
-     int mri;
+macro_mri_mode (int mri)
 {
   macro_mri = mri;
 }
@@ -152,11 +156,8 @@ macro_mri_mode (mri)
    Return 1 on success, 0 on unexpected EOF.  */
 
 int
-buffer_and_nest (from, to, ptr, get_line)
-     const char *from;
-     const char *to;
-     sb *ptr;
-     int (*get_line) PARAMS ((sb *));
+buffer_and_nest (const char *from, const char *to, sb *ptr,
+                int (*get_line) (sb *))
 {
   int from_len = strlen (from);
   int to_len = strlen (to);
@@ -222,8 +223,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);
     }
@@ -235,10 +236,7 @@ buffer_and_nest (from, to, ptr, get_line)
 /* Pick up a token.  */
 
 static int
-get_token (idx, in, name)
-     int idx;
-     sb *in;
-     sb *name;
+get_token (int idx, sb *in, sb *name)
 {
   if (idx < in->len
       && (ISALPHA (in->ptr[idx])
@@ -263,10 +261,7 @@ get_token (idx, in, name)
 /* Pick up a string.  */
 
 static int
-getstring (idx, in, acc)
-     int idx;
-     sb *in;
-     sb *acc;
+getstring (int idx, sb *in, sb *acc)
 {
   idx = sb_skip_white (idx, in);
 
@@ -354,19 +349,14 @@ getstring (idx, in, acc)
 */
 
 static int
-get_any_string (idx, in, out, expand, pretend_quoted)
-     int idx;
-     sb *in;
-     sb *out;
-     int expand;
-     int pretend_quoted;
+get_any_string (int idx, sb *in, sb *out, int expand, int pretend_quoted)
 {
   sb_reset (out);
   idx = sb_skip_white (idx, in);
 
   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++]);
@@ -439,10 +429,7 @@ get_any_string (idx, in, out, expand, pretend_quoted)
 /* Pick up the formal parameters of a macro definition.  */
 
 static int
-do_formals (macro, idx, in)
-     macro_entry *macro;
-     int idx;
-     sb *in;
+do_formals (macro_entry *macro, int idx, sb *in)
 {
   formal_entry **p = &macro->formals;
 
@@ -522,12 +509,8 @@ do_formals (macro, idx, in)
    the macro which was defined.  */
 
 const char *
-define_macro (idx, in, label, get_line, namep)
-     int idx;
-     sb *in;
-     sb *label;
-     int (*get_line) PARAMS ((sb *));
-     const char **namep;
+define_macro (int idx, sb *in, sb *label,
+             int (*get_line) (sb *), const char **namep)
 {
   macro_entry *macro;
   sb name;
@@ -583,11 +566,7 @@ define_macro (idx, in, label, get_line, namep)
 /* Scan a token, and then skip KIND.  */
 
 static int
-get_apost_token (idx, in, name, kind)
-     int idx;
-     sb *in;
-     sb *name;
-     int kind;
+get_apost_token (int idx, sb *in, sb *name, int kind)
 {
   idx = get_token (idx, in, name);
   if (idx < in->len
@@ -601,14 +580,8 @@ get_apost_token (idx, in, name, kind)
 /* Substitute the actual value for a formal parameter.  */
 
 static int
-sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere)
-     int start;
-     sb *in;
-     sb *t;
-     struct hash_control *formal_hash;
-     int kind;
-     sb *out;
-     int copyifnotthere;
+sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
+           int kind, sb *out, int copyifnotthere)
 {
   int src;
   formal_entry *ptr;
@@ -637,6 +610,7 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere)
     {
       /* Doing this permits people to use & in macro bodies.  */
       sb_add_char (out, '&');
+      sb_add_sb (out, t);
     }
   else if (copyifnotthere)
     {
@@ -653,13 +627,8 @@ 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)
-     sb *in;
-     sb *out;
-     formal_entry *formals;
-     struct hash_control *formal_hash;
-     int comment_char;
-     int locals;
+macro_expand_body (sb *in, sb *out, formal_entry *formals,
+                  struct hash_control *formal_hash, int locals)
 {
   sb t;
   int src = 0;
@@ -689,14 +658,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++;
@@ -779,7 +741,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];
@@ -795,7 +757,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
 
                  src = get_token (src, in, &f->name);
                  ++loccnt;
-                 sprintf (buf, "LL%04x", loccnt);
+                 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", loccnt);
                  sb_add_string (&f->actual, buf);
 
                  err = hash_jam (formal_hash, sb_terminate (&f->name), f);
@@ -806,17 +768,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] == '\''))
        {
@@ -899,12 +850,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
    body.  */
 
 static const char *
-macro_expand (idx, in, m, out, comment_char)
-     int idx;
-     sb *in;
-     macro_entry *m;
-     sb *out;
-     int comment_char;
+macro_expand (int idx, sb *in, macro_entry *m, sb *out)
 {
   sb t;
   formal_entry *ptr;
@@ -954,7 +900,7 @@ macro_expand (idx, in, m, out, comment_char)
 
   /* 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;
 
@@ -1056,8 +1002,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;
 
@@ -1090,16 +1035,11 @@ 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)
-     const char *line;
-     sb *expand;
-     int comment_char;
-     const char **error;
-     macro_entry **info;
+check_macro (const char *line, sb *expand,
+            const char **error, macro_entry **info)
 {
   const char *s;
   char *copy, *cs;
@@ -1135,7 +1075,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);
 
@@ -1149,8 +1089,7 @@ check_macro (line, expand, comment_char, error, info)
 /* Delete a macro.  */
 
 void
-delete_macro (name)
-     const char *name;
+delete_macro (const char *name)
 {
   hash_delete (macro_hash, name);
 }
@@ -1160,13 +1099,7 @@ delete_macro (name)
    success, or an error message otherwise.  */
 
 const char *
-expand_irp (irpc, idx, in, out, get_line, comment_char)
-     int irpc;
-     int idx;
-     sb *in;
-     sb *out;
-     int (*get_line) PARAMS ((sb *));
-     int comment_char;
+expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
 {
   const char *mn;
   sb sub;
@@ -1204,10 +1137,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;
     }
@@ -1215,7 +1148,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);
@@ -1226,7 +1159,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;
@@ -1236,7 +1169,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)
This page took 0.028584 seconds and 4 git commands to generate.