+2005-04-18 Jan Beulich <jbeulich@novell.com>
+
+ * macro.c (free_token): New, freeing all the memory associated with a
+ macro.
+ (do_formals): Move initializers to ...
+ (define_macro): ... here.
+ (delete_macro): Convert passed in name to lower case. Warn when
+ purging macro that doesn't exist. Use hash_jam instead of hash_delete.
+
2005-04-15 Maciej W. Rozycki <macro@linux-mips.org>
* config/tc-mips.c (normalize_constant_expr): Fix formatting.
static const char *macro_expand_body
(sb *, sb *, formal_entry *, struct hash_control *, int);
static const char *macro_expand (int, sb *, macro_entry *, sb *);
+static void free_macro(macro_entry *);
#define ISWHITE(x) ((x) == ' ' || (x) == '\t')
{
formal_entry **p = ¯o->formals;
- macro->formal_count = 0;
- macro->formal_hash = hash_new ();
idx = sb_skip_white (idx, in);
while (idx < in->len)
{
macro->formal_count = 0;
macro->formals = 0;
+ macro->formal_hash = hash_new ();
idx = sb_skip_white (idx, in);
if (! buffer_and_nest ("MACRO", "ENDM", ¯o->sub, get_line))
return 1;
}
+/* Free the memory allocated to a macro. */
+
+static void
+free_macro(macro_entry *macro)
+{
+ formal_entry *formal;
+
+ for (formal = macro->formals; formal; )
+ {
+ void *ptr;
+
+ sb_kill (&formal->name);
+ sb_kill (&formal->def);
+ sb_kill (&formal->actual);
+ ptr = formal;
+ formal = formal->next;
+ free (ptr);
+ }
+ hash_die (macro->formal_hash);
+ sb_kill (¯o->sub);
+ free (macro);
+}
+
/* Delete a macro. */
void
delete_macro (const char *name)
{
- hash_delete (macro_hash, name);
+ char *copy;
+ size_t i, len;
+ macro_entry *macro;
+
+ len = strlen (name);
+ copy = (char *) alloca (len + 1);
+ for (i = 0; i < len; ++i)
+ copy[i] = TOLOWER (name[i]);
+ copy[i] = '\0';
+
+ /* Since hash_delete doesn't free memory, just clear out the entry. */
+ if ((macro = hash_find (macro_hash, copy)) != NULL)
+ {
+ hash_jam (macro_hash, copy, NULL);
+ free_macro (macro);
+ }
+ else
+ as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
}
/* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
--- /dev/null
+ .macro MACRO1
+ .endm
+ .macro macro2
+ .endm
+ MACRO1
+ MACRO2
+ macro1
+ macro2
+ .purgem MACRO1
+ .purgem macro2
+ MACRO1
+ MACRO2
+ macro1
+ macro2
+ .purgem macro1
+ .purgem MACRO2
+ .macro macro1
+ .endm
+ .macro MACRO2
+ .endm
+ MACRO1
+ MACRO2
+ macro1
+ macro2
+ .purgem MACRO1
+ .purgem macro2
+
+ .irpc a,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ .irpc b,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ .irpc c,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ .irpc d,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ .macro \a\b\c\d arg1=0, arg2=0
+ .if \arg1 + \arg2
+ .purgem \a\b\c\d
+ .endif
+ .endm
+ \a\b\c\d 1, 2
+ .endr
+ .endr
+ .endr
+ .endr