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