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