bfd/
[binutils.git] / gas / macro.c
blobeab3e66bbe62d8c47a4643b453ec117bae8b0ee9
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.
5 Written by Steve and Judy Chamberlain of Cygnus Support,
6 sac@cygnus.com
8 This file is part of GAS, the GNU Assembler.
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.
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.
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. */
25 #include "config.h"
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__ */
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"
64 #include "asintl.h"
66 /* The routines in this file handle macro definition and expansion.
67 They are called by gas. */
69 /* Internal functions. */
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 *);
84 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
86 #define ISSEP(x) \
87 ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
88 || (x) == ')' || (x) == '(' \
89 || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
91 #define ISBASE(x) \
92 ((x) == 'b' || (x) == 'B' \
93 || (x) == 'q' || (x) == 'Q' \
94 || (x) == 'h' || (x) == 'H' \
95 || (x) == 'd' || (x) == 'D')
97 /* The macro hash table. */
99 struct hash_control *macro_hash;
101 /* Whether any macros have been defined. */
103 int macro_defined;
105 /* Whether we are in alternate syntax mode. */
107 static int macro_alternate;
109 /* Whether we are in MRI mode. */
111 static int macro_mri;
113 /* Whether we should strip '@' characters. */
115 static int macro_strip_at;
117 /* Function to use to parse an expression. */
119 static int (*macro_expr) (const char *, int, sb *, int *);
121 /* Number of macro expansions that have been done. */
123 static int macro_number;
125 /* Initialize macro processing. */
127 void
128 macro_init (int alternate, int mri, int strip_at,
129 int (*expr) (const char *, int, sb *, int *))
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;
139 /* Switch in and out of alternate mode on the fly. */
141 void
142 macro_set_alternate (int alternate)
144 macro_alternate = alternate;
147 /* Switch in and out of MRI mode on the fly. */
149 void
150 macro_mri_mode (int mri)
152 macro_mri = mri;
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. */
163 buffer_and_nest (const char *from, const char *to, sb *ptr,
164 int (*get_line) (sb *))
166 int from_len;
167 int to_len = strlen (to);
168 int depth = 1;
169 int line_start = ptr->len;
171 int more = get_line (ptr);
173 if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
175 from = NULL;
176 from_len = 0;
178 else
179 from_len = strlen (from);
181 while (more)
183 /* Try and find the first pseudo op on the line. */
184 int i = line_start;
186 if (! NO_PSEUDO_DOT && ! flag_m68k_mri)
188 /* With normal syntax we can suck what we want till we get
189 to the dot. With the alternate, labels have to start in
190 the first column, since we can't tell what's a label and
191 whats a pseudoop. */
193 if (! LABELS_WITHOUT_COLONS)
195 /* Skip leading whitespace. */
196 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
197 i++;
200 for (;;)
202 /* Skip over a label, if any. */
203 if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
204 break;
205 i++;
206 while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
207 i++;
208 if (i < ptr->len && is_name_ender (ptr->ptr[i]))
209 i++;
210 if (LABELS_WITHOUT_COLONS)
211 break;
212 /* Skip whitespace. */
213 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
214 i++;
215 /* Check for the colon. */
216 if (i >= ptr->len || ptr->ptr[i] != ':')
218 i = line_start;
219 break;
221 i++;
222 line_start = i;
226 /* Skip trailing whitespace. */
227 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
228 i++;
230 if (i < ptr->len && (ptr->ptr[i] == '.'
231 || NO_PSEUDO_DOT
232 || macro_mri))
234 if (! flag_m68k_mri && ptr->ptr[i] == '.')
235 i++;
236 if (from == NULL
237 && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
238 && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
239 && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
240 && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
241 && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
242 && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
243 from_len = 0;
244 if ((from != NULL
245 ? strncasecmp (ptr->ptr + i, from, from_len) == 0
246 : from_len > 0)
247 && (ptr->len == (i + from_len)
248 || ! (is_part_of_name (ptr->ptr[i + from_len])
249 || is_name_ender (ptr->ptr[i + from_len]))))
250 depth++;
251 if (strncasecmp (ptr->ptr + i, to, to_len) == 0
252 && (ptr->len == (i + to_len)
253 || ! (is_part_of_name (ptr->ptr[i + to_len])
254 || is_name_ender (ptr->ptr[i + to_len]))))
256 depth--;
257 if (depth == 0)
259 /* Reset the string to not include the ending rune. */
260 ptr->len = line_start;
261 break;
266 /* Add the original end-of-line char to the end and keep running. */
267 sb_add_char (ptr, more);
268 line_start = ptr->len;
269 more = get_line (ptr);
272 /* Return 1 on success, 0 on unexpected EOF. */
273 return depth == 0;
276 /* Pick up a token. */
278 static int
279 get_token (int idx, sb *in, sb *name)
281 if (idx < in->len
282 && is_name_beginner (in->ptr[idx]))
284 sb_add_char (name, in->ptr[idx++]);
285 while (idx < in->len
286 && is_part_of_name (in->ptr[idx]))
288 sb_add_char (name, in->ptr[idx++]);
290 if (idx < in->len
291 && is_name_ender (in->ptr[idx]))
293 sb_add_char (name, in->ptr[idx++]);
296 /* Ignore trailing &. */
297 if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
298 idx++;
299 return idx;
302 /* Pick up a string. */
304 static int
305 getstring (int idx, sb *in, sb *acc)
307 while (idx < in->len
308 && (in->ptr[idx] == '"'
309 || in->ptr[idx] == '('
310 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
311 || (in->ptr[idx] == '\'' && macro_alternate)))
313 if (in->ptr[idx] == '<')
315 int nest = 0;
316 char start_char = '>';
317 char end_char = '>';
319 idx++;
320 while ((in->ptr[idx] != end_char || nest)
321 && idx < in->len)
323 if (in->ptr[idx] == '!')
325 idx++;
326 sb_add_char (acc, in->ptr[idx++]);
328 else
330 if (in->ptr[idx] == end_char)
331 nest--;
332 if (in->ptr[idx] == start_char)
333 nest++;
334 sb_add_char (acc, in->ptr[idx++]);
337 idx++;
339 else if (in->ptr[idx] == '(')
341 int nest = 0;
342 char c;
346 c = in->ptr[idx];
348 if (c == '!')
349 c = in->ptr[++idx];
350 else if (c == ')')
351 nest--;
352 else if (c == '(')
353 nest++;
355 sb_add_char (acc, c);
356 idx++;
358 while ((c != ')' || nest)
359 && idx < in->len);
361 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
363 char tchar = in->ptr[idx];
364 int escaped = 0;
366 idx++;
368 while (idx < in->len)
370 if (in->ptr[idx - 1] == '\\')
371 escaped ^= 1;
372 else
373 escaped = 0;
375 if (macro_alternate && in->ptr[idx] == '!')
377 idx ++;
379 sb_add_char (acc, in->ptr[idx]);
381 idx ++;
383 else if (escaped && in->ptr[idx] == tchar)
385 sb_add_char (acc, tchar);
386 idx ++;
388 else
390 if (in->ptr[idx] == tchar)
392 idx ++;
394 if (idx >= in->len || in->ptr[idx] != tchar)
395 break;
398 sb_add_char (acc, in->ptr[idx]);
399 idx ++;
405 return idx;
408 /* Fetch string from the input stream,
409 rules:
410 'Bxyx<whitespace> -> return 'Bxyza
411 %<expr> -> return string of decimal value of <expr>
412 "string" -> return string
413 (string) -> return (string-including-whitespaces)
414 xyx<whitespace> -> return xyz. */
416 static int
417 get_any_string (int idx, sb *in, sb *out)
419 sb_reset (out);
420 idx = sb_skip_white (idx, in);
422 if (idx < in->len)
424 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
426 while (!ISSEP (in->ptr[idx]))
427 sb_add_char (out, in->ptr[idx++]);
429 else if (in->ptr[idx] == '%' && macro_alternate)
431 int val;
432 char buf[20];
434 /* Turns the next expression into a string. */
435 /* xgettext: no-c-format */
436 idx = (*macro_expr) (_("% operator needs absolute expression"),
437 idx + 1,
439 &val);
440 sprintf (buf, "%d", val);
441 sb_add_string (out, buf);
443 else if (in->ptr[idx] == '"'
444 || in->ptr[idx] == '('
445 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
446 || (macro_alternate && in->ptr[idx] == '\''))
448 if (macro_alternate && ! macro_strip_at)
450 /* Keep the quotes. */
451 sb_add_char (out, '\"');
453 idx = getstring (idx, in, out);
454 sb_add_char (out, '\"');
456 else
458 idx = getstring (idx, in, out);
461 else
463 while (idx < in->len
464 && in->ptr[idx] != ' '
465 && in->ptr[idx] != '\t'
466 && in->ptr[idx] != ','
467 && (in->ptr[idx] != '<'
468 || (! macro_alternate && ! macro_mri)))
470 if (in->ptr[idx] == '"'
471 || in->ptr[idx] == '\'')
473 char tchar = in->ptr[idx];
475 sb_add_char (out, in->ptr[idx++]);
476 while (idx < in->len
477 && in->ptr[idx] != tchar)
478 sb_add_char (out, in->ptr[idx++]);
479 if (idx == in->len)
480 return idx;
482 sb_add_char (out, in->ptr[idx++]);
487 return idx;
490 /* Allocate a new formal. */
492 static formal_entry *
493 new_formal (void)
495 formal_entry *formal;
497 formal = xmalloc (sizeof (formal_entry));
499 sb_new (&formal->name);
500 sb_new (&formal->def);
501 sb_new (&formal->actual);
502 formal->next = NULL;
503 formal->type = FORMAL_OPTIONAL;
504 return formal;
507 /* Free a formal. */
509 static void
510 del_formal (formal_entry *formal)
512 sb_kill (&formal->actual);
513 sb_kill (&formal->def);
514 sb_kill (&formal->name);
515 free (formal);
518 /* Pick up the formal parameters of a macro definition. */
520 static int
521 do_formals (macro_entry *macro, int idx, sb *in)
523 formal_entry **p = &macro->formals;
524 const char *name;
526 idx = sb_skip_white (idx, in);
527 while (idx < in->len)
529 formal_entry *formal = new_formal ();
530 int cidx;
532 idx = get_token (idx, in, &formal->name);
533 if (formal->name.len == 0)
535 if (macro->formal_count)
536 --idx;
537 break;
539 idx = sb_skip_white (idx, in);
540 /* This is a formal. */
541 name = sb_terminate (&formal->name);
542 if (! macro_mri
543 && idx < in->len
544 && in->ptr[idx] == ':'
545 && (! is_name_beginner (':')
546 || idx + 1 >= in->len
547 || ! is_part_of_name (in->ptr[idx + 1])))
549 /* Got a qualifier. */
550 sb qual;
552 sb_new (&qual);
553 idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
554 sb_terminate (&qual);
555 if (qual.len == 0)
556 as_bad_where (macro->file,
557 macro->line,
558 _("Missing parameter qualifier for `%s' in macro `%s'"),
559 name,
560 macro->name);
561 else if (strcmp (qual.ptr, "req") == 0)
562 formal->type = FORMAL_REQUIRED;
563 else if (strcmp (qual.ptr, "vararg") == 0)
564 formal->type = FORMAL_VARARG;
565 else
566 as_bad_where (macro->file,
567 macro->line,
568 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
569 qual.ptr,
570 name,
571 macro->name);
572 sb_kill (&qual);
573 idx = sb_skip_white (idx, in);
575 if (idx < in->len && in->ptr[idx] == '=')
577 /* Got a default. */
578 idx = get_any_string (idx + 1, in, &formal->def);
579 idx = sb_skip_white (idx, in);
580 if (formal->type == FORMAL_REQUIRED)
582 sb_reset (&formal->def);
583 as_warn_where (macro->file,
584 macro->line,
585 _("Pointless default value for required parameter `%s' in macro `%s'"),
586 name,
587 macro->name);
591 /* Add to macro's hash table. */
592 if (! hash_find (macro->formal_hash, name))
593 hash_jam (macro->formal_hash, name, formal);
594 else
595 as_bad_where (macro->file,
596 macro->line,
597 _("A parameter named `%s' already exists for macro `%s'"),
598 name,
599 macro->name);
601 formal->index = macro->formal_count++;
602 *p = formal;
603 p = &formal->next;
604 if (formal->type == FORMAL_VARARG)
605 break;
606 cidx = idx;
607 idx = sb_skip_comma (idx, in);
608 if (idx != cidx && idx >= in->len)
610 idx = cidx;
611 break;
615 if (macro_mri)
617 formal_entry *formal = new_formal ();
619 /* Add a special NARG formal, which macro_expand will set to the
620 number of arguments. */
621 /* The same MRI assemblers which treat '@' characters also use
622 the name $NARG. At least until we find an exception. */
623 if (macro_strip_at)
624 name = "$NARG";
625 else
626 name = "NARG";
628 sb_add_string (&formal->name, name);
630 /* Add to macro's hash table. */
631 if (hash_find (macro->formal_hash, name))
632 as_bad_where (macro->file,
633 macro->line,
634 _("Reserved word `%s' used as parameter in macro `%s'"),
635 name,
636 macro->name);
637 hash_jam (macro->formal_hash, name, formal);
639 formal->index = NARG_INDEX;
640 *p = formal;
643 return idx;
646 /* Define a new macro. Returns NULL on success, otherwise returns an
647 error message. If NAMEP is not NULL, *NAMEP is set to the name of
648 the macro which was defined. */
650 const char *
651 define_macro (int idx, sb *in, sb *label,
652 int (*get_line) (sb *),
653 char *file, unsigned int line,
654 const char **namep)
656 macro_entry *macro;
657 sb name;
658 const char *error = NULL;
660 macro = (macro_entry *) xmalloc (sizeof (macro_entry));
661 sb_new (&macro->sub);
662 sb_new (&name);
663 macro->file = file;
664 macro->line = line;
666 macro->formal_count = 0;
667 macro->formals = 0;
668 macro->formal_hash = hash_new ();
670 idx = sb_skip_white (idx, in);
671 if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
672 error = _("unexpected end of file in macro `%s' definition");
673 if (label != NULL && label->len != 0)
675 sb_add_sb (&name, label);
676 macro->name = sb_terminate (&name);
677 if (idx < in->len && in->ptr[idx] == '(')
679 /* It's the label: MACRO (formals,...) sort */
680 idx = do_formals (macro, idx + 1, in);
681 if (idx < in->len && in->ptr[idx] == ')')
682 idx = sb_skip_white (idx + 1, in);
683 else if (!error)
684 error = _("missing `)' after formals in macro definition `%s'");
686 else
688 /* It's the label: MACRO formals,... sort */
689 idx = do_formals (macro, idx, in);
692 else
694 int cidx;
696 idx = get_token (idx, in, &name);
697 macro->name = sb_terminate (&name);
698 if (name.len == 0)
699 error = _("Missing macro name");
700 cidx = sb_skip_white (idx, in);
701 idx = sb_skip_comma (cidx, in);
702 if (idx == cidx || idx < in->len)
703 idx = do_formals (macro, idx, in);
704 else
705 idx = cidx;
707 if (!error && idx < in->len)
708 error = _("Bad parameter list for macro `%s'");
710 /* And stick it in the macro hash table. */
711 for (idx = 0; idx < name.len; idx++)
712 name.ptr[idx] = TOLOWER (name.ptr[idx]);
713 if (hash_find (macro_hash, macro->name))
714 error = _("Macro `%s' was already defined");
715 if (!error)
716 error = hash_jam (macro_hash, macro->name, (PTR) macro);
718 if (namep != NULL)
719 *namep = macro->name;
721 if (!error)
722 macro_defined = 1;
723 else
724 free_macro (macro);
726 return error;
729 /* Scan a token, and then skip KIND. */
731 static int
732 get_apost_token (int idx, sb *in, sb *name, int kind)
734 idx = get_token (idx, in, name);
735 if (idx < in->len
736 && in->ptr[idx] == kind
737 && (! macro_mri || macro_strip_at)
738 && (! macro_strip_at || kind == '@'))
739 idx++;
740 return idx;
743 /* Substitute the actual value for a formal parameter. */
745 static int
746 sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
747 int kind, sb *out, int copyifnotthere)
749 int src;
750 formal_entry *ptr;
752 src = get_apost_token (start, in, t, kind);
753 /* See if it's in the macro's hash table, unless this is
754 macro_strip_at and kind is '@' and the token did not end in '@'. */
755 if (macro_strip_at
756 && kind == '@'
757 && (src == start || in->ptr[src - 1] != '@'))
758 ptr = NULL;
759 else
760 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
761 if (ptr)
763 if (ptr->actual.len)
765 sb_add_sb (out, &ptr->actual);
767 else
769 sb_add_sb (out, &ptr->def);
772 else if (kind == '&')
774 /* Doing this permits people to use & in macro bodies. */
775 sb_add_char (out, '&');
776 sb_add_sb (out, t);
778 else if (copyifnotthere)
780 sb_add_sb (out, t);
782 else
784 sb_add_char (out, '\\');
785 sb_add_sb (out, t);
787 return src;
790 /* Expand the body of a macro. */
792 static const char *
793 macro_expand_body (sb *in, sb *out, formal_entry *formals,
794 struct hash_control *formal_hash, const macro_entry *macro)
796 sb t;
797 int src = 0, inquote = 0, macro_line = 0;
798 formal_entry *loclist = NULL;
799 const char *err = NULL;
801 sb_new (&t);
803 while (src < in->len && !err)
805 if (in->ptr[src] == '&')
807 sb_reset (&t);
808 if (macro_mri)
810 if (src + 1 < in->len && in->ptr[src + 1] == '&')
811 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
812 else
813 sb_add_char (out, in->ptr[src++]);
815 else
817 /* FIXME: Why do we do this? */
818 /* At least in alternate mode this seems correct; without this
819 one can't append a literal to a parameter. */
820 src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
823 else if (in->ptr[src] == '\\')
825 src++;
826 if (src < in->len && in->ptr[src] == '(')
828 /* Sub in till the next ')' literally. */
829 src++;
830 while (src < in->len && in->ptr[src] != ')')
832 sb_add_char (out, in->ptr[src++]);
834 if (src < in->len)
835 src++;
836 else if (!macro)
837 err = _("missing `)'");
838 else
839 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
841 else if (src < in->len && in->ptr[src] == '@')
843 /* Sub in the macro invocation number. */
845 char buffer[10];
846 src++;
847 sprintf (buffer, "%d", macro_number);
848 sb_add_string (out, buffer);
850 else if (src < in->len && in->ptr[src] == '&')
852 /* This is a preprocessor variable name, we don't do them
853 here. */
854 sb_add_char (out, '\\');
855 sb_add_char (out, '&');
856 src++;
858 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
860 int ind;
861 formal_entry *f;
863 if (ISDIGIT (in->ptr[src]))
864 ind = in->ptr[src] - '0';
865 else if (ISUPPER (in->ptr[src]))
866 ind = in->ptr[src] - 'A' + 10;
867 else
868 ind = in->ptr[src] - 'a' + 10;
869 ++src;
870 for (f = formals; f != NULL; f = f->next)
872 if (f->index == ind - 1)
874 if (f->actual.len != 0)
875 sb_add_sb (out, &f->actual);
876 else
877 sb_add_sb (out, &f->def);
878 break;
882 else
884 sb_reset (&t);
885 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
888 else if ((macro_alternate || macro_mri)
889 && is_name_beginner (in->ptr[src])
890 && (! inquote
891 || ! macro_strip_at
892 || (src > 0 && in->ptr[src - 1] == '@')))
894 if (! macro
895 || src + 5 >= in->len
896 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
897 || ! ISWHITE (in->ptr[src + 5]))
899 sb_reset (&t);
900 src = sub_actual (src, in, &t, formal_hash,
901 (macro_strip_at && inquote) ? '@' : '\'',
902 out, 1);
904 else
906 src = sb_skip_white (src + 5, in);
907 while (in->ptr[src] != '\n')
909 const char *name;
910 formal_entry *f = new_formal ();
912 src = get_token (src, in, &f->name);
913 name = sb_terminate (&f->name);
914 if (! hash_find (formal_hash, name))
916 static int loccnt;
917 char buf[20];
919 f->index = LOCAL_INDEX;
920 f->next = loclist;
921 loclist = f;
923 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
924 sb_add_string (&f->actual, buf);
926 err = hash_jam (formal_hash, name, f);
927 if (err != NULL)
928 break;
930 else
932 as_bad_where (macro->file,
933 macro->line + macro_line,
934 _("`%s' was already used as parameter (or another local) name"),
935 name);
936 del_formal (f);
939 src = sb_skip_comma (src, in);
943 else if (in->ptr[src] == '"'
944 || (macro_mri && in->ptr[src] == '\''))
946 inquote = !inquote;
947 sb_add_char (out, in->ptr[src++]);
949 else if (in->ptr[src] == '@' && macro_strip_at)
951 ++src;
952 if (src < in->len
953 && in->ptr[src] == '@')
955 sb_add_char (out, '@');
956 ++src;
959 else if (macro_mri
960 && in->ptr[src] == '='
961 && src + 1 < in->len
962 && in->ptr[src + 1] == '=')
964 formal_entry *ptr;
966 sb_reset (&t);
967 src = get_token (src + 2, in, &t);
968 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
969 if (ptr == NULL)
971 /* FIXME: We should really return a warning string here,
972 but we can't, because the == might be in the MRI
973 comment field, and, since the nature of the MRI
974 comment field depends upon the exact instruction
975 being used, we don't have enough information here to
976 figure out whether it is or not. Instead, we leave
977 the == in place, which should cause a syntax error if
978 it is not in a comment. */
979 sb_add_char (out, '=');
980 sb_add_char (out, '=');
981 sb_add_sb (out, &t);
983 else
985 if (ptr->actual.len)
987 sb_add_string (out, "-1");
989 else
991 sb_add_char (out, '0');
995 else
997 if (in->ptr[src] == '\n')
998 ++macro_line;
999 sb_add_char (out, in->ptr[src++]);
1003 sb_kill (&t);
1005 while (loclist != NULL)
1007 formal_entry *f;
1009 f = loclist->next;
1010 /* Setting the value to NULL effectively deletes the entry. We
1011 avoid calling hash_delete because it doesn't reclaim memory. */
1012 hash_jam (formal_hash, sb_terminate (&loclist->name), NULL);
1013 del_formal (loclist);
1014 loclist = f;
1017 return err;
1020 /* Assign values to the formal parameters of a macro, and expand the
1021 body. */
1023 static const char *
1024 macro_expand (int idx, sb *in, macro_entry *m, sb *out)
1026 sb t;
1027 formal_entry *ptr;
1028 formal_entry *f;
1029 int is_positional = 0;
1030 int is_keyword = 0;
1031 int narg = 0;
1032 const char *err = NULL;
1034 sb_new (&t);
1036 /* Reset any old value the actuals may have. */
1037 for (f = m->formals; f; f = f->next)
1038 sb_reset (&f->actual);
1039 f = m->formals;
1040 while (f != NULL && f->index < 0)
1041 f = f->next;
1043 if (macro_mri)
1045 /* The macro may be called with an optional qualifier, which may
1046 be referred to in the macro body as \0. */
1047 if (idx < in->len && in->ptr[idx] == '.')
1049 /* The Microtec assembler ignores this if followed by a white space.
1050 (Macro invocation with empty extension) */
1051 idx++;
1052 if ( idx < in->len
1053 && in->ptr[idx] != ' '
1054 && in->ptr[idx] != '\t')
1056 formal_entry *n = new_formal ();
1058 n->index = QUAL_INDEX;
1060 n->next = m->formals;
1061 m->formals = n;
1063 idx = get_any_string (idx, in, &n->actual);
1068 /* Peel off the actuals and store them away in the hash tables' actuals. */
1069 idx = sb_skip_white (idx, in);
1070 while (idx < in->len)
1072 int scan;
1074 /* Look and see if it's a positional or keyword arg. */
1075 scan = idx;
1076 while (scan < in->len
1077 && !ISSEP (in->ptr[scan])
1078 && !(macro_mri && in->ptr[scan] == '\'')
1079 && (!macro_alternate && in->ptr[scan] != '='))
1080 scan++;
1081 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1083 is_keyword = 1;
1085 /* It's OK to go from positional to keyword. */
1087 /* This is a keyword arg, fetch the formal name and
1088 then the actual stuff. */
1089 sb_reset (&t);
1090 idx = get_token (idx, in, &t);
1091 if (in->ptr[idx] != '=')
1093 err = _("confusion in formal parameters");
1094 break;
1097 /* Lookup the formal in the macro's list. */
1098 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1099 if (!ptr)
1100 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1101 t.ptr,
1102 m->name);
1103 else
1105 /* Insert this value into the right place. */
1106 if (ptr->actual.len)
1108 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1109 ptr->name.ptr,
1110 m->name);
1111 sb_reset (&ptr->actual);
1113 idx = get_any_string (idx + 1, in, &ptr->actual);
1114 if (ptr->actual.len > 0)
1115 ++narg;
1118 else
1120 /* This is a positional arg. */
1121 is_positional = 1;
1122 if (is_keyword)
1124 err = _("can't mix positional and keyword arguments");
1125 break;
1128 if (!f)
1130 formal_entry **pf;
1131 int c;
1133 if (!macro_mri)
1135 err = _("too many positional arguments");
1136 break;
1139 f = new_formal ();
1141 c = -1;
1142 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1143 if ((*pf)->index >= c)
1144 c = (*pf)->index + 1;
1145 if (c == -1)
1146 c = 0;
1147 *pf = f;
1148 f->index = c;
1151 if (f->type != FORMAL_VARARG)
1152 idx = get_any_string (idx, in, &f->actual);
1153 else
1155 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1156 idx = in->len;
1158 if (f->actual.len > 0)
1159 ++narg;
1162 f = f->next;
1164 while (f != NULL && f->index < 0);
1167 if (! macro_mri)
1168 idx = sb_skip_comma (idx, in);
1169 else
1171 if (in->ptr[idx] == ',')
1172 ++idx;
1173 if (ISWHITE (in->ptr[idx]))
1174 break;
1178 if (! err)
1180 for (ptr = m->formals; ptr; ptr = ptr->next)
1182 if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1183 as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1184 ptr->name.ptr,
1185 m->name);
1188 if (macro_mri)
1190 char buffer[20];
1192 sb_reset (&t);
1193 sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1194 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1195 sprintf (buffer, "%d", narg);
1196 sb_add_string (&ptr->actual, buffer);
1199 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1202 /* Discard any unnamed formal arguments. */
1203 if (macro_mri)
1205 formal_entry **pf;
1207 pf = &m->formals;
1208 while (*pf != NULL)
1210 if ((*pf)->name.len != 0)
1211 pf = &(*pf)->next;
1212 else
1214 f = (*pf)->next;
1215 del_formal (*pf);
1216 *pf = f;
1221 sb_kill (&t);
1222 if (!err)
1223 macro_number++;
1225 return err;
1228 /* Check for a macro. If one is found, put the expansion into
1229 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
1232 check_macro (const char *line, sb *expand,
1233 const char **error, macro_entry **info)
1235 const char *s;
1236 char *copy, *cs;
1237 macro_entry *macro;
1238 sb line_sb;
1240 if (! is_name_beginner (*line)
1241 && (! macro_mri || *line != '.'))
1242 return 0;
1244 s = line + 1;
1245 while (is_part_of_name (*s))
1246 ++s;
1247 if (is_name_ender (*s))
1248 ++s;
1250 copy = (char *) alloca (s - line + 1);
1251 memcpy (copy, line, s - line);
1252 copy[s - line] = '\0';
1253 for (cs = copy; *cs != '\0'; cs++)
1254 *cs = TOLOWER (*cs);
1256 macro = (macro_entry *) hash_find (macro_hash, copy);
1258 if (macro == NULL)
1259 return 0;
1261 /* Wrap the line up in an sb. */
1262 sb_new (&line_sb);
1263 while (*s != '\0' && *s != '\n' && *s != '\r')
1264 sb_add_char (&line_sb, *s++);
1266 sb_new (expand);
1267 *error = macro_expand (0, &line_sb, macro, expand);
1269 sb_kill (&line_sb);
1271 /* Export the macro information if requested. */
1272 if (info)
1273 *info = macro;
1275 return 1;
1278 /* Free the memory allocated to a macro. */
1280 static void
1281 free_macro(macro_entry *macro)
1283 formal_entry *formal;
1285 for (formal = macro->formals; formal; )
1287 formal_entry *f;
1289 f = formal;
1290 formal = formal->next;
1291 del_formal (f);
1293 hash_die (macro->formal_hash);
1294 sb_kill (&macro->sub);
1295 free (macro);
1298 /* Delete a macro. */
1300 void
1301 delete_macro (const char *name)
1303 char *copy;
1304 size_t i, len;
1305 macro_entry *macro;
1307 len = strlen (name);
1308 copy = (char *) alloca (len + 1);
1309 for (i = 0; i < len; ++i)
1310 copy[i] = TOLOWER (name[i]);
1311 copy[i] = '\0';
1313 /* Since hash_delete doesn't free memory, just clear out the entry. */
1314 if ((macro = hash_find (macro_hash, copy)) != NULL)
1316 hash_jam (macro_hash, copy, NULL);
1317 free_macro (macro);
1319 else
1320 as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
1323 /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1324 combined macro definition and execution. This returns NULL on
1325 success, or an error message otherwise. */
1327 const char *
1328 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
1330 sb sub;
1331 formal_entry f;
1332 struct hash_control *h;
1333 const char *err;
1335 idx = sb_skip_white (idx, in);
1337 sb_new (&sub);
1338 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1339 return _("unexpected end of file in irp or irpc");
1341 sb_new (&f.name);
1342 sb_new (&f.def);
1343 sb_new (&f.actual);
1345 idx = get_token (idx, in, &f.name);
1346 if (f.name.len == 0)
1347 return _("missing model parameter");
1349 h = hash_new ();
1350 err = hash_jam (h, sb_terminate (&f.name), &f);
1351 if (err != NULL)
1352 return err;
1354 f.index = 1;
1355 f.next = NULL;
1356 f.type = FORMAL_OPTIONAL;
1358 sb_reset (out);
1360 idx = sb_skip_comma (idx, in);
1361 if (idx >= in->len)
1363 /* Expand once with a null string. */
1364 err = macro_expand_body (&sub, out, &f, h, 0);
1366 else
1368 if (irpc && in->ptr[idx] == '"')
1369 ++idx;
1370 while (idx < in->len)
1372 if (!irpc)
1373 idx = get_any_string (idx, in, &f.actual);
1374 else
1376 if (in->ptr[idx] == '"')
1378 int nxt;
1380 nxt = sb_skip_white (idx + 1, in);
1381 if (nxt >= in->len)
1383 idx = nxt;
1384 break;
1387 sb_reset (&f.actual);
1388 sb_add_char (&f.actual, in->ptr[idx]);
1389 ++idx;
1391 err = macro_expand_body (&sub, out, &f, h, 0);
1392 if (err != NULL)
1393 break;
1394 if (!irpc)
1395 idx = sb_skip_comma (idx, in);
1396 else
1397 idx = sb_skip_white (idx, in);
1401 hash_die (h);
1402 sb_kill (&f.actual);
1403 sb_kill (&f.def);
1404 sb_kill (&f.name);
1405 sb_kill (&sub);
1407 return err;