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