gas/
[platform/upstream/binutils.git] / gas / macro.c
1 /* macro.c - macro support for gas
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005 Free Software Foundation, Inc.
4
5    Written by Steve and Judy Chamberlain of Cygnus Support,
6       sac@cygnus.com
7
8    This file is part of GAS, the GNU Assembler.
9
10    GAS is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2, or (at your option)
13    any later version.
14
15    GAS is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with GAS; see the file COPYING.  If not, write to the Free
22    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23    02110-1301, USA.  */
24
25 #include "config.h"
26
27 #ifndef __GNUC__
28 # if HAVE_ALLOCA_H
29 #  include <alloca.h>
30 # else
31 #  ifdef _AIX
32 /* Indented so that pre-ansi C compilers will ignore it, rather than
33    choke on it.  Some versions of AIX require this to be the first
34    thing in the file.  */
35  #pragma alloca
36 #  else
37 #   ifndef alloca /* predefined by HP cc +Olibcalls */
38 #    if !defined (__STDC__) && !defined (__hpux)
39 extern char *alloca ();
40 #    else
41 extern void *alloca ();
42 #    endif /* __STDC__, __hpux */
43 #   endif /* alloca */
44 #  endif /* _AIX */
45 # endif /* HAVE_ALLOCA_H */
46 #endif /* __GNUC__ */
47
48 #include <stdio.h>
49 #ifdef HAVE_STRING_H
50 #include <string.h>
51 #else
52 #include <strings.h>
53 #endif
54 #ifdef HAVE_STDLIB_H
55 #include <stdlib.h>
56 #endif
57 #include "as.h"
58 #include "libiberty.h"
59 #include "safe-ctype.h"
60 #include "sb.h"
61 #include "hash.h"
62 #include "macro.h"
63
64 #include "asintl.h"
65
66 /* The routines in this file handle macro definition and expansion.
67    They are called by gas.  */
68
69 /* Internal functions.  */
70
71 static int get_token (int, sb *, sb *);
72 static int getstring (int, sb *, sb *);
73 static int get_any_string (int, sb *, sb *);
74 static formal_entry *new_formal (void);
75 static void del_formal (formal_entry *);
76 static int do_formals (macro_entry *, int, sb *);
77 static int get_apost_token (int, sb *, sb *, int);
78 static int sub_actual (int, sb *, sb *, struct hash_control *, int, sb *, int);
79 static const char *macro_expand_body
80   (sb *, sb *, formal_entry *, struct hash_control *, const macro_entry *);
81 static const char *macro_expand (int, sb *, macro_entry *, sb *);
82 static void free_macro(macro_entry *);
83
84 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
85
86 #define ISSEP(x) \
87  ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
88   || (x) == ')' || (x) == '(' \
89   || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
90
91 #define ISBASE(x) \
92   ((x) == 'b' || (x) == 'B' \
93    || (x) == 'q' || (x) == 'Q' \
94    || (x) == 'h' || (x) == 'H' \
95    || (x) == 'd' || (x) == 'D')
96
97 /* The macro hash table.  */
98
99 struct hash_control *macro_hash;
100
101 /* Whether any macros have been defined.  */
102
103 int macro_defined;
104
105 /* Whether we are in alternate syntax mode.  */
106
107 static int macro_alternate;
108
109 /* Whether we are in MRI mode.  */
110
111 static int macro_mri;
112
113 /* Whether we should strip '@' characters.  */
114
115 static int macro_strip_at;
116
117 /* Function to use to parse an expression.  */
118
119 static int (*macro_expr) (const char *, int, sb *, int *);
120
121 /* Number of macro expansions that have been done.  */
122
123 static int macro_number;
124
125 /* Initialize macro processing.  */
126
127 void
128 macro_init (int alternate, int mri, int strip_at,
129             int (*expr) (const char *, int, sb *, int *))
130 {
131   macro_hash = hash_new ();
132   macro_defined = 0;
133   macro_alternate = alternate;
134   macro_mri = mri;
135   macro_strip_at = strip_at;
136   macro_expr = expr;
137 }
138
139 /* Switch in and out of alternate mode on the fly.  */
140
141 void
142 macro_set_alternate (int alternate)
143 {
144   macro_alternate = alternate;
145 }
146
147 /* Switch in and out of MRI mode on the fly.  */
148
149 void
150 macro_mri_mode (int mri)
151 {
152   macro_mri = mri;
153 }
154
155 /* Read input lines till we get to a TO string.
156    Increase nesting depth if we get a FROM string.
157    Put the results into sb at PTR.
158    FROM may be NULL (or will be ignored) if TO is "ENDR".
159    Add a new input line to an sb using GET_LINE.
160    Return 1 on success, 0 on unexpected EOF.  */
161
162 int
163 buffer_and_nest (const char *from, const char *to, sb *ptr,
164                  int (*get_line) (sb *))
165 {
166   int from_len;
167   int to_len = strlen (to);
168   int depth = 1;
169   int line_start = ptr->len;
170
171   int more = get_line (ptr);
172
173   if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
174     {
175       from = NULL;
176       from_len = 0;
177     }
178   else
179     from_len = strlen (from);
180
181   while (more)
182     {
183       /* Try and find the first pseudo op on the line.  */
184       int i = line_start;
185
186       if (! NO_PSEUDO_DOT && ! flag_m68k_mri)
187         {
188           /* With normal syntax we can suck what we want till we get
189              to the dot.  With the alternate, labels have to start in
190              the first column, since we can't tell what's a label and
191              whats a pseudoop.  */
192
193           if (! LABELS_WITHOUT_COLONS)
194             {
195               /* Skip leading whitespace.  */
196               while (i < ptr->len && ISWHITE (ptr->ptr[i]))
197                 i++;
198             }
199
200           for (;;)
201             {
202               /* Skip over a label, if any.  */
203               if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
204                 break;
205               i++;
206               while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
207                 i++;
208               if (i < ptr->len && is_name_ender (ptr->ptr[i]))
209                 i++;
210               if (LABELS_WITHOUT_COLONS)
211                 break;
212               /* Skip whitespace.  */
213               while (i < ptr->len && ISWHITE (ptr->ptr[i]))
214                 i++;
215               /* Check for the colon.  */
216               if (i >= ptr->len || ptr->ptr[i] != ':')
217                 {
218                   i = line_start;
219                   break;
220                 }
221               i++;
222               line_start = i;
223             }
224
225         }
226       /* Skip trailing whitespace.  */
227       while (i < ptr->len && ISWHITE (ptr->ptr[i]))
228         i++;
229
230       if (i < ptr->len && (ptr->ptr[i] == '.'
231                            || NO_PSEUDO_DOT
232                            || macro_mri))
233         {
234           if (! flag_m68k_mri && ptr->ptr[i] == '.')
235             i++;
236           if (from == NULL
237              && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
238              && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
239              && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
240              && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
241              && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
242              && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
243             from_len = 0;
244           if ((from != NULL
245                ? strncasecmp (ptr->ptr + i, from, from_len) == 0
246                : from_len > 0)
247               && (ptr->len == (i + from_len)
248                   || ! (is_part_of_name (ptr->ptr[i + from_len])
249                         || is_name_ender (ptr->ptr[i + from_len]))))
250             depth++;
251           if (strncasecmp (ptr->ptr + i, to, to_len) == 0
252               && (ptr->len == (i + to_len)
253                   || ! (is_part_of_name (ptr->ptr[i + to_len])
254                         || is_name_ender (ptr->ptr[i + to_len]))))
255             {
256               depth--;
257               if (depth == 0)
258                 {
259                   /* Reset the string to not include the ending rune.  */
260                   ptr->len = line_start;
261                   break;
262                 }
263             }
264         }
265
266       /* Add the original end-of-line char to the end and keep running.  */
267       sb_add_char (ptr, more);
268       line_start = ptr->len;
269       more = get_line (ptr);
270     }
271
272   /* Return 1 on success, 0 on unexpected EOF.  */
273   return depth == 0;
274 }
275
276 /* Pick up a token.  */
277
278 static int
279 get_token (int idx, sb *in, sb *name)
280 {
281   if (idx < in->len
282       && is_name_beginner (in->ptr[idx]))
283     {
284       sb_add_char (name, in->ptr[idx++]);
285       while (idx < in->len
286              && is_part_of_name (in->ptr[idx]))
287         {
288           sb_add_char (name, in->ptr[idx++]);
289         }
290       if (idx < in->len
291              && is_name_ender (in->ptr[idx]))
292         {
293           sb_add_char (name, in->ptr[idx++]);
294         }
295     }
296   /* Ignore trailing &.  */
297   if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
298     idx++;
299   return idx;
300 }
301
302 /* Pick up a string.  */
303
304 static int
305 getstring (int idx, sb *in, sb *acc)
306 {
307   while (idx < in->len
308          && (in->ptr[idx] == '"'
309              || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
310              || (in->ptr[idx] == '\'' && macro_alternate)))
311     {
312       if (in->ptr[idx] == '<')
313         {
314           int nest = 0;
315           idx++;
316           while ((in->ptr[idx] != '>' || nest)
317                  && idx < in->len)
318             {
319               if (in->ptr[idx] == '!')
320                 {
321                   idx++;
322                   sb_add_char (acc, in->ptr[idx++]);
323                 }
324               else
325                 {
326                   if (in->ptr[idx] == '>')
327                     nest--;
328                   if (in->ptr[idx] == '<')
329                     nest++;
330                   sb_add_char (acc, in->ptr[idx++]);
331                 }
332             }
333           idx++;
334         }
335       else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
336         {
337           char tchar = in->ptr[idx];
338           int escaped = 0;
339
340           idx++;
341
342           while (idx < in->len)
343             {
344               if (in->ptr[idx - 1] == '\\')
345                 escaped ^= 1;
346               else
347                 escaped = 0;
348
349               if (macro_alternate && in->ptr[idx] == '!')
350                 {
351                   idx ++;
352
353                   sb_add_char (acc, in->ptr[idx]);
354
355                   idx ++;
356                 }
357               else if (escaped && in->ptr[idx] == tchar)
358                 {
359                   sb_add_char (acc, tchar);
360                   idx ++;
361                 }
362               else
363                 {
364                   if (in->ptr[idx] == tchar)
365                     {
366                       idx ++;
367
368                       if (idx >= in->len || in->ptr[idx] != tchar)
369                         break;
370                     }
371
372                   sb_add_char (acc, in->ptr[idx]);
373                   idx ++;
374                 }
375             }
376         }
377     }
378
379   return idx;
380 }
381
382 /* Fetch string from the input stream,
383    rules:
384     'Bxyx<whitespace>   -> return 'Bxyza
385     %<char>             -> return string of decimal value of x
386     "<string>"          -> return string
387     xyx<whitespace>     -> return xyz
388 */
389
390 static int
391 get_any_string (int idx, sb *in, sb *out)
392 {
393   sb_reset (out);
394   idx = sb_skip_white (idx, in);
395
396   if (idx < in->len)
397     {
398       if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
399         {
400           while (!ISSEP (in->ptr[idx]))
401             sb_add_char (out, in->ptr[idx++]);
402         }
403       else if (in->ptr[idx] == '%' && macro_alternate)
404         {
405           int val;
406           char buf[20];
407           /* Turns the next expression into a string.  */
408           /* xgettext: no-c-format */
409           idx = (*macro_expr) (_("% operator needs absolute expression"),
410                                idx + 1,
411                                in,
412                                &val);
413           sprintf (buf, "%d", val);
414           sb_add_string (out, buf);
415         }
416       else if (in->ptr[idx] == '"'
417                || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
418                || (macro_alternate && in->ptr[idx] == '\''))
419         {
420           if (macro_alternate && ! macro_strip_at)
421             {
422               /* Keep the quotes.  */
423               sb_add_char (out, '\"');
424
425               idx = getstring (idx, in, out);
426               sb_add_char (out, '\"');
427             }
428           else
429             {
430               idx = getstring (idx, in, out);
431             }
432         }
433       else
434         {
435           while (idx < in->len
436                  && in->ptr[idx] != ' '
437                  && in->ptr[idx] != '\t'
438                  && in->ptr[idx] != ','
439                  && (in->ptr[idx] != '<'
440                      || (! macro_alternate && ! macro_mri)))
441             {
442               if (in->ptr[idx] == '"'
443                   || in->ptr[idx] == '\'')
444                 {
445                   char tchar = in->ptr[idx];
446                   sb_add_char (out, in->ptr[idx++]);
447                   while (idx < in->len
448                          && in->ptr[idx] != tchar)
449                     sb_add_char (out, in->ptr[idx++]);
450                   if (idx == in->len)
451                     return idx;
452                 }
453               sb_add_char (out, in->ptr[idx++]);
454             }
455         }
456     }
457
458   return idx;
459 }
460
461 /* Allocate a new formal.  */
462
463 static formal_entry *
464 new_formal (void)
465 {
466   formal_entry *formal;
467
468   formal = xmalloc (sizeof (formal_entry));
469
470   sb_new (&formal->name);
471   sb_new (&formal->def);
472   sb_new (&formal->actual);
473   formal->next = NULL;
474   formal->type = FORMAL_OPTIONAL;
475   return formal;
476 }
477
478 /* Free a formal.  */
479
480 static void
481 del_formal (formal_entry *formal)
482 {
483   sb_kill (&formal->actual);
484   sb_kill (&formal->def);
485   sb_kill (&formal->name);
486   free (formal);
487 }
488
489 /* Pick up the formal parameters of a macro definition.  */
490
491 static int
492 do_formals (macro_entry *macro, int idx, sb *in)
493 {
494   formal_entry **p = &macro->formals;
495   const char *name;
496
497   idx = sb_skip_white (idx, in);
498   while (idx < in->len)
499     {
500       formal_entry *formal = new_formal ();
501       int cidx;
502
503       idx = get_token (idx, in, &formal->name);
504       if (formal->name.len == 0)
505         {
506           if (macro->formal_count)
507             --idx;
508           break;
509         }
510       idx = sb_skip_white (idx, in);
511       /* This is a formal.  */
512       name = sb_terminate (&formal->name);
513       if (! macro_mri
514           && idx < in->len
515           && in->ptr[idx] == ':'
516           && (! is_name_beginner (':')
517               || idx + 1 >= in->len
518               || ! is_part_of_name (in->ptr[idx + 1])))
519         {
520           /* Got a qualifier.  */
521           sb qual;
522
523           sb_new (&qual);
524           idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
525           sb_terminate (&qual);
526           if (qual.len == 0)
527             as_bad_where (macro->file,
528                           macro->line,
529                           _("Missing parameter qualifier for `%s' in macro `%s'"),
530                           name,
531                           macro->name);
532           else if (strcmp (qual.ptr, "req") == 0)
533             formal->type = FORMAL_REQUIRED;
534           else if (strcmp (qual.ptr, "vararg") == 0)
535             formal->type = FORMAL_VARARG;
536           else
537             as_bad_where (macro->file,
538                           macro->line,
539                           _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
540                           qual.ptr,
541                           name,
542                           macro->name);
543           sb_kill (&qual);
544           idx = sb_skip_white (idx, in);
545         }
546       if (idx < in->len && in->ptr[idx] == '=')
547         {
548           /* Got a default.  */
549           idx = get_any_string (idx + 1, in, &formal->def);
550           idx = sb_skip_white (idx, in);
551           if (formal->type == FORMAL_REQUIRED)
552             {
553               sb_reset (&formal->def);
554               as_warn_where (macro->file,
555                             macro->line,
556                             _("Pointless default value for required parameter `%s' in macro `%s'"),
557                             name,
558                             macro->name);
559             }
560         }
561
562       /* Add to macro's hash table.  */
563       if (! hash_find (macro->formal_hash, name))
564         hash_jam (macro->formal_hash, name, formal);
565       else
566         as_bad_where (macro->file,
567                       macro->line,
568                       _("A parameter named `%s' already exists for macro `%s'"),
569                       name,
570                       macro->name);
571
572       formal->index = macro->formal_count++;
573       *p = formal;
574       p = &formal->next;
575       if (formal->type == FORMAL_VARARG)
576         break;
577       cidx = idx;
578       idx = sb_skip_comma (idx, in);
579       if (idx != cidx && idx >= in->len)
580         {
581           idx = cidx;
582           break;
583         }
584     }
585
586   if (macro_mri)
587     {
588       formal_entry *formal = new_formal ();
589
590       /* Add a special NARG formal, which macro_expand will set to the
591          number of arguments.  */
592       /* The same MRI assemblers which treat '@' characters also use
593          the name $NARG.  At least until we find an exception.  */
594       if (macro_strip_at)
595         name = "$NARG";
596       else
597         name = "NARG";
598
599       sb_add_string (&formal->name, name);
600
601       /* Add to macro's hash table.  */
602       if (hash_find (macro->formal_hash, name))
603         as_bad_where (macro->file,
604                       macro->line,
605                       _("Reserved word `%s' used as parameter in macro `%s'"),
606                       name,
607                       macro->name);
608       hash_jam (macro->formal_hash, name, formal);
609
610       formal->index = NARG_INDEX;
611       *p = formal;
612     }
613
614   return idx;
615 }
616
617 /* Define a new macro.  Returns NULL on success, otherwise returns an
618    error message.  If NAMEP is not NULL, *NAMEP is set to the name of
619    the macro which was defined.  */
620
621 const char *
622 define_macro (int idx, sb *in, sb *label,
623               int (*get_line) (sb *),
624               char *file, unsigned int line,
625               const char **namep)
626 {
627   macro_entry *macro;
628   sb name;
629   const char *error = NULL;
630
631   macro = (macro_entry *) xmalloc (sizeof (macro_entry));
632   sb_new (&macro->sub);
633   sb_new (&name);
634   macro->file = file;
635   macro->line = line;
636
637   macro->formal_count = 0;
638   macro->formals = 0;
639   macro->formal_hash = hash_new ();
640
641   idx = sb_skip_white (idx, in);
642   if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
643     error = _("unexpected end of file in macro `%s' definition");
644   if (label != NULL && label->len != 0)
645     {
646       sb_add_sb (&name, label);
647       macro->name = sb_terminate (&name);
648       if (idx < in->len && in->ptr[idx] == '(')
649         {
650           /* It's the label: MACRO (formals,...)  sort  */
651           idx = do_formals (macro, idx + 1, in);
652           if (idx < in->len && in->ptr[idx] == ')')
653             idx = sb_skip_white (idx + 1, in);
654           else if (!error)
655             error = _("missing `)' after formals in macro definition `%s'");
656         }
657       else
658         {
659           /* It's the label: MACRO formals,...  sort  */
660           idx = do_formals (macro, idx, in);
661         }
662     }
663   else
664     {
665       int cidx;
666
667       idx = get_token (idx, in, &name);
668       macro->name = sb_terminate (&name);
669       if (name.len == 0)
670         error = _("Missing macro name");
671       cidx = sb_skip_white (idx, in);
672       idx = sb_skip_comma (cidx, in);
673       if (idx == cidx || idx < in->len)
674         idx = do_formals (macro, idx, in);
675       else
676         idx = cidx;
677     }
678   if (!error && idx < in->len)
679     error = _("Bad parameter list for macro `%s'");
680
681   /* And stick it in the macro hash table.  */
682   for (idx = 0; idx < name.len; idx++)
683     name.ptr[idx] = TOLOWER (name.ptr[idx]);
684   if (hash_find (macro_hash, macro->name))
685     error = _("Macro `%s' was already defined");
686   if (!error)
687     error = hash_jam (macro_hash, macro->name, (PTR) macro);
688
689   if (namep != NULL)
690     *namep = macro->name;
691
692   if (!error)
693     macro_defined = 1;
694   else
695     free_macro (macro);
696
697   return error;
698 }
699
700 /* Scan a token, and then skip KIND.  */
701
702 static int
703 get_apost_token (int idx, sb *in, sb *name, int kind)
704 {
705   idx = get_token (idx, in, name);
706   if (idx < in->len
707       && in->ptr[idx] == kind
708       && (! macro_mri || macro_strip_at)
709       && (! macro_strip_at || kind == '@'))
710     idx++;
711   return idx;
712 }
713
714 /* Substitute the actual value for a formal parameter.  */
715
716 static int
717 sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
718             int kind, sb *out, int copyifnotthere)
719 {
720   int src;
721   formal_entry *ptr;
722
723   src = get_apost_token (start, in, t, kind);
724   /* See if it's in the macro's hash table, unless this is
725      macro_strip_at and kind is '@' and the token did not end in '@'.  */
726   if (macro_strip_at
727       && kind == '@'
728       && (src == start || in->ptr[src - 1] != '@'))
729     ptr = NULL;
730   else
731     ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
732   if (ptr)
733     {
734       if (ptr->actual.len)
735         {
736           sb_add_sb (out, &ptr->actual);
737         }
738       else
739         {
740           sb_add_sb (out, &ptr->def);
741         }
742     }
743   else if (kind == '&')
744     {
745       /* Doing this permits people to use & in macro bodies.  */
746       sb_add_char (out, '&');
747       sb_add_sb (out, t);
748     }
749   else if (copyifnotthere)
750     {
751       sb_add_sb (out, t);
752     }
753   else
754     {
755       sb_add_char (out, '\\');
756       sb_add_sb (out, t);
757     }
758   return src;
759 }
760
761 /* Expand the body of a macro.  */
762
763 static const char *
764 macro_expand_body (sb *in, sb *out, formal_entry *formals,
765                    struct hash_control *formal_hash, const macro_entry *macro)
766 {
767   sb t;
768   int src = 0, inquote = 0, macro_line = 0;
769   formal_entry *loclist = NULL;
770   const char *err = NULL;
771
772   sb_new (&t);
773
774   while (src < in->len && !err)
775     {
776       if (in->ptr[src] == '&')
777         {
778           sb_reset (&t);
779           if (macro_mri)
780             {
781               if (src + 1 < in->len && in->ptr[src + 1] == '&')
782                 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
783               else
784                 sb_add_char (out, in->ptr[src++]);
785             }
786           else
787             {
788               /* FIXME: Why do we do this?  */
789               /* At least in alternate mode this seems correct; without this
790                  one can't append a literal to a parameter.  */
791               src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
792             }
793         }
794       else if (in->ptr[src] == '\\')
795         {
796           src++;
797           if (src < in->len && in->ptr[src] == '(')
798             {
799               /* Sub in till the next ')' literally.  */
800               src++;
801               while (src < in->len && in->ptr[src] != ')')
802                 {
803                   sb_add_char (out, in->ptr[src++]);
804                 }
805               if (src < in->len)
806                 src++;
807               else if (!macro)
808                 err = _("missing `)'");
809               else
810                 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
811             }
812           else if (src < in->len && in->ptr[src] == '@')
813             {
814               /* Sub in the macro invocation number.  */
815
816               char buffer[10];
817               src++;
818               sprintf (buffer, "%d", macro_number);
819               sb_add_string (out, buffer);
820             }
821           else if (src < in->len && in->ptr[src] == '&')
822             {
823               /* This is a preprocessor variable name, we don't do them
824                  here.  */
825               sb_add_char (out, '\\');
826               sb_add_char (out, '&');
827               src++;
828             }
829           else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
830             {
831               int ind;
832               formal_entry *f;
833
834               if (ISDIGIT (in->ptr[src]))
835                 ind = in->ptr[src] - '0';
836               else if (ISUPPER (in->ptr[src]))
837                 ind = in->ptr[src] - 'A' + 10;
838               else
839                 ind = in->ptr[src] - 'a' + 10;
840               ++src;
841               for (f = formals; f != NULL; f = f->next)
842                 {
843                   if (f->index == ind - 1)
844                     {
845                       if (f->actual.len != 0)
846                         sb_add_sb (out, &f->actual);
847                       else
848                         sb_add_sb (out, &f->def);
849                       break;
850                     }
851                 }
852             }
853           else
854             {
855               sb_reset (&t);
856               src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
857             }
858         }
859       else if ((macro_alternate || macro_mri)
860                && is_name_beginner (in->ptr[src])
861                && (! inquote
862                    || ! macro_strip_at
863                    || (src > 0 && in->ptr[src - 1] == '@')))
864         {
865           if (! macro
866               || src + 5 >= in->len
867               || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
868               || ! ISWHITE (in->ptr[src + 5]))
869             {
870               sb_reset (&t);
871               src = sub_actual (src, in, &t, formal_hash,
872                                 (macro_strip_at && inquote) ? '@' : '\'',
873                                 out, 1);
874             }
875           else
876             {
877               src = sb_skip_white (src + 5, in);
878               while (in->ptr[src] != '\n')
879                 {
880                   const char *name;
881                   formal_entry *f = new_formal ();
882
883                   src = get_token (src, in, &f->name);
884                   name = sb_terminate (&f->name);
885                   if (! hash_find (formal_hash, name))
886                     {
887                       static int loccnt;
888                       char buf[20];
889
890                       f->index = LOCAL_INDEX;
891                       f->next = loclist;
892                       loclist = f;
893
894                       sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
895                       sb_add_string (&f->actual, buf);
896
897                       err = hash_jam (formal_hash, name, f);
898                       if (err != NULL)
899                         break;
900                     }
901                   else
902                     {
903                       as_bad_where (macro->file,
904                                     macro->line + macro_line,
905                                     _("`%s' was already used as parameter (or another local) name"),
906                                     name);
907                       del_formal (f);
908                     }
909
910                   src = sb_skip_comma (src, in);
911                 }
912             }
913         }
914       else if (in->ptr[src] == '"'
915                || (macro_mri && in->ptr[src] == '\''))
916         {
917           inquote = !inquote;
918           sb_add_char (out, in->ptr[src++]);
919         }
920       else if (in->ptr[src] == '@' && macro_strip_at)
921         {
922           ++src;
923           if (src < in->len
924               && in->ptr[src] == '@')
925             {
926               sb_add_char (out, '@');
927               ++src;
928             }
929         }
930       else if (macro_mri
931                && in->ptr[src] == '='
932                && src + 1 < in->len
933                && in->ptr[src + 1] == '=')
934         {
935           formal_entry *ptr;
936
937           sb_reset (&t);
938           src = get_token (src + 2, in, &t);
939           ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
940           if (ptr == NULL)
941             {
942               /* FIXME: We should really return a warning string here,
943                  but we can't, because the == might be in the MRI
944                  comment field, and, since the nature of the MRI
945                  comment field depends upon the exact instruction
946                  being used, we don't have enough information here to
947                  figure out whether it is or not.  Instead, we leave
948                  the == in place, which should cause a syntax error if
949                  it is not in a comment.  */
950               sb_add_char (out, '=');
951               sb_add_char (out, '=');
952               sb_add_sb (out, &t);
953             }
954           else
955             {
956               if (ptr->actual.len)
957                 {
958                   sb_add_string (out, "-1");
959                 }
960               else
961                 {
962                   sb_add_char (out, '0');
963                 }
964             }
965         }
966       else
967         {
968           if (in->ptr[src] == '\n')
969             ++macro_line;
970           sb_add_char (out, in->ptr[src++]);
971         }
972     }
973
974   sb_kill (&t);
975
976   while (loclist != NULL)
977     {
978       formal_entry *f;
979
980       f = loclist->next;
981       /* Setting the value to NULL effectively deletes the entry.  We
982          avoid calling hash_delete because it doesn't reclaim memory.  */
983       hash_jam (formal_hash, sb_terminate (&loclist->name), NULL);
984       del_formal (loclist);
985       loclist = f;
986     }
987
988   return err;
989 }
990
991 /* Assign values to the formal parameters of a macro, and expand the
992    body.  */
993
994 static const char *
995 macro_expand (int idx, sb *in, macro_entry *m, sb *out)
996 {
997   sb t;
998   formal_entry *ptr;
999   formal_entry *f;
1000   int is_positional = 0;
1001   int is_keyword = 0;
1002   int narg = 0;
1003   const char *err = NULL;
1004
1005   sb_new (&t);
1006
1007   /* Reset any old value the actuals may have.  */
1008   for (f = m->formals; f; f = f->next)
1009     sb_reset (&f->actual);
1010   f = m->formals;
1011   while (f != NULL && f->index < 0)
1012     f = f->next;
1013
1014   if (macro_mri)
1015     {
1016       /* The macro may be called with an optional qualifier, which may
1017          be referred to in the macro body as \0.  */
1018       if (idx < in->len && in->ptr[idx] == '.')
1019         {
1020           /* The Microtec assembler ignores this if followed by a white space.
1021              (Macro invocation with empty extension) */
1022           idx++;
1023           if (    idx < in->len
1024                   && in->ptr[idx] != ' '
1025                   && in->ptr[idx] != '\t')
1026             {
1027               formal_entry *n = new_formal ();
1028
1029               n->index = QUAL_INDEX;
1030
1031               n->next = m->formals;
1032               m->formals = n;
1033
1034               idx = get_any_string (idx, in, &n->actual);
1035             }
1036         }
1037     }
1038
1039   /* Peel off the actuals and store them away in the hash tables' actuals.  */
1040   idx = sb_skip_white (idx, in);
1041   while (idx < in->len)
1042     {
1043       int scan;
1044
1045       /* Look and see if it's a positional or keyword arg.  */
1046       scan = idx;
1047       while (scan < in->len
1048              && !ISSEP (in->ptr[scan])
1049              && !(macro_mri && in->ptr[scan] == '\'')
1050              && (!macro_alternate && in->ptr[scan] != '='))
1051         scan++;
1052       if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1053         {
1054           is_keyword = 1;
1055
1056           /* It's OK to go from positional to keyword.  */
1057
1058           /* This is a keyword arg, fetch the formal name and
1059              then the actual stuff.  */
1060           sb_reset (&t);
1061           idx = get_token (idx, in, &t);
1062           if (in->ptr[idx] != '=')
1063             {
1064               err = _("confusion in formal parameters");
1065               break;
1066             }
1067
1068           /* Lookup the formal in the macro's list.  */
1069           ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1070           if (!ptr)
1071             as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1072                     t.ptr,
1073                     m->name);
1074           else
1075             {
1076               /* Insert this value into the right place.  */
1077               if (ptr->actual.len)
1078                 {
1079                   as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1080                            ptr->name.ptr,
1081                            m->name);
1082                   sb_reset (&ptr->actual);
1083                 }
1084               idx = get_any_string (idx + 1, in, &ptr->actual);
1085               if (ptr->actual.len > 0)
1086                 ++narg;
1087             }
1088         }
1089       else
1090         {
1091           /* This is a positional arg.  */
1092           is_positional = 1;
1093           if (is_keyword)
1094             {
1095               err = _("can't mix positional and keyword arguments");
1096               break;
1097             }
1098
1099           if (!f)
1100             {
1101               formal_entry **pf;
1102               int c;
1103
1104               if (!macro_mri)
1105                 {
1106                   err = _("too many positional arguments");
1107                   break;
1108                 }
1109
1110               f = new_formal ();
1111
1112               c = -1;
1113               for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1114                 if ((*pf)->index >= c)
1115                   c = (*pf)->index + 1;
1116               if (c == -1)
1117                 c = 0;
1118               *pf = f;
1119               f->index = c;
1120             }
1121
1122           if (f->type != FORMAL_VARARG)
1123             idx = get_any_string (idx, in, &f->actual);
1124           else
1125             {
1126               sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1127               idx = in->len;
1128             }
1129           if (f->actual.len > 0)
1130             ++narg;
1131           do
1132             {
1133               f = f->next;
1134             }
1135           while (f != NULL && f->index < 0);
1136         }
1137
1138       if (! macro_mri)
1139         idx = sb_skip_comma (idx, in);
1140       else
1141         {
1142           if (in->ptr[idx] == ',')
1143             ++idx;
1144           if (ISWHITE (in->ptr[idx]))
1145             break;
1146         }
1147     }
1148
1149   if (! err)
1150     {
1151       for (ptr = m->formals; ptr; ptr = ptr->next)
1152         {
1153           if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1154             as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1155                     ptr->name.ptr,
1156                     m->name);
1157         }
1158
1159       if (macro_mri)
1160         {
1161           char buffer[20];
1162
1163           sb_reset (&t);
1164           sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1165           ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1166           sprintf (buffer, "%d", narg);
1167           sb_add_string (&ptr->actual, buffer);
1168         }
1169
1170       err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1171     }
1172
1173   /* Discard any unnamed formal arguments.  */
1174   if (macro_mri)
1175     {
1176       formal_entry **pf;
1177
1178       pf = &m->formals;
1179       while (*pf != NULL)
1180         {
1181           if ((*pf)->name.len != 0)
1182             pf = &(*pf)->next;
1183           else
1184             {
1185               f = (*pf)->next;
1186               del_formal (*pf);
1187               *pf = f;
1188             }
1189         }
1190     }
1191
1192   sb_kill (&t);
1193   if (!err)
1194     macro_number++;
1195
1196   return err;
1197 }
1198
1199 /* Check for a macro.  If one is found, put the expansion into
1200    *EXPAND.  Return 1 if a macro is found, 0 otherwise.  */
1201
1202 int
1203 check_macro (const char *line, sb *expand,
1204              const char **error, macro_entry **info)
1205 {
1206   const char *s;
1207   char *copy, *cs;
1208   macro_entry *macro;
1209   sb line_sb;
1210
1211   if (! is_name_beginner (*line)
1212       && (! macro_mri || *line != '.'))
1213     return 0;
1214
1215   s = line + 1;
1216   while (is_part_of_name (*s))
1217     ++s;
1218   if (is_name_ender (*s))
1219     ++s;
1220
1221   copy = (char *) alloca (s - line + 1);
1222   memcpy (copy, line, s - line);
1223   copy[s - line] = '\0';
1224   for (cs = copy; *cs != '\0'; cs++)
1225     *cs = TOLOWER (*cs);
1226
1227   macro = (macro_entry *) hash_find (macro_hash, copy);
1228
1229   if (macro == NULL)
1230     return 0;
1231
1232   /* Wrap the line up in an sb.  */
1233   sb_new (&line_sb);
1234   while (*s != '\0' && *s != '\n' && *s != '\r')
1235     sb_add_char (&line_sb, *s++);
1236
1237   sb_new (expand);
1238   *error = macro_expand (0, &line_sb, macro, expand);
1239
1240   sb_kill (&line_sb);
1241
1242   /* Export the macro information if requested.  */
1243   if (info)
1244     *info = macro;
1245
1246   return 1;
1247 }
1248
1249 /* Free the memory allocated to a macro.  */
1250
1251 static void
1252 free_macro(macro_entry *macro)
1253 {
1254   formal_entry *formal;
1255
1256   for (formal = macro->formals; formal; )
1257     {
1258       formal_entry *f;
1259
1260       f = formal;
1261       formal = formal->next;
1262       del_formal (f);
1263     }
1264   hash_die (macro->formal_hash);
1265   sb_kill (&macro->sub);
1266   free (macro);
1267 }
1268
1269 /* Delete a macro.  */
1270
1271 void
1272 delete_macro (const char *name)
1273 {
1274   char *copy;
1275   size_t i, len;
1276   macro_entry *macro;
1277
1278   len = strlen (name);
1279   copy = (char *) alloca (len + 1);
1280   for (i = 0; i < len; ++i)
1281     copy[i] = TOLOWER (name[i]);
1282   copy[i] = '\0';
1283
1284   /* Since hash_delete doesn't free memory, just clear out the entry.  */
1285   if ((macro = hash_find (macro_hash, copy)) != NULL)
1286     {
1287       hash_jam (macro_hash, copy, NULL);
1288       free_macro (macro);
1289     }
1290   else
1291     as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
1292 }
1293
1294 /* Handle the MRI IRP and IRPC pseudo-ops.  These are handled as a
1295    combined macro definition and execution.  This returns NULL on
1296    success, or an error message otherwise.  */
1297
1298 const char *
1299 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
1300 {
1301   sb sub;
1302   formal_entry f;
1303   struct hash_control *h;
1304   const char *err;
1305
1306   idx = sb_skip_white (idx, in);
1307
1308   sb_new (&sub);
1309   if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1310     return _("unexpected end of file in irp or irpc");
1311
1312   sb_new (&f.name);
1313   sb_new (&f.def);
1314   sb_new (&f.actual);
1315
1316   idx = get_token (idx, in, &f.name);
1317   if (f.name.len == 0)
1318     return _("missing model parameter");
1319
1320   h = hash_new ();
1321   err = hash_jam (h, sb_terminate (&f.name), &f);
1322   if (err != NULL)
1323     return err;
1324
1325   f.index = 1;
1326   f.next = NULL;
1327   f.type = FORMAL_OPTIONAL;
1328
1329   sb_reset (out);
1330
1331   idx = sb_skip_comma (idx, in);
1332   if (idx >= in->len)
1333     {
1334       /* Expand once with a null string.  */
1335       err = macro_expand_body (&sub, out, &f, h, 0);
1336     }
1337   else
1338     {
1339       if (irpc && in->ptr[idx] == '"')
1340         ++idx;
1341       while (idx < in->len)
1342         {
1343           if (!irpc)
1344             idx = get_any_string (idx, in, &f.actual);
1345           else
1346             {
1347               if (in->ptr[idx] == '"')
1348                 {
1349                   int nxt;
1350
1351                   nxt = sb_skip_white (idx + 1, in);
1352                   if (nxt >= in->len)
1353                     {
1354                       idx = nxt;
1355                       break;
1356                     }
1357                 }
1358               sb_reset (&f.actual);
1359               sb_add_char (&f.actual, in->ptr[idx]);
1360               ++idx;
1361             }
1362           err = macro_expand_body (&sub, out, &f, h, 0);
1363           if (err != NULL)
1364             break;
1365           if (!irpc)
1366             idx = sb_skip_comma (idx, in);
1367           else
1368             idx = sb_skip_white (idx, in);
1369         }
1370     }
1371
1372   hash_die (h);
1373   sb_kill (&f.actual);
1374   sb_kill (&f.def);
1375   sb_kill (&f.name);
1376   sb_kill (&sub);
1377
1378   return err;
1379 }