2006-02-14 Paolo Bonzini <bonzini@gnu.org>
[binutils.git] / gas / macro.c
blob23156a1242a42a5185359eaa72c88b75a5d90bda
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 to find the first pseudo op on the line. */
184 int i = line_start;
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. */
191 if (! LABELS_WITHOUT_COLONS)
193 /* Skip leading whitespace. */
194 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
195 i++;
198 for (;;)
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] != ':')
216 i = line_start;
217 break;
219 i++;
220 line_start = i;
223 /* Skip trailing whitespace. */
224 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
225 i++;
227 if (i < ptr->len && (ptr->ptr[i] == '.'
228 || NO_PSEUDO_DOT
229 || macro_mri))
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]))))
253 depth--;
254 if (depth == 0)
256 /* Reset the string to not include the ending rune. */
257 ptr->len = line_start;
258 break;
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);
269 /* Return 1 on success, 0 on unexpected EOF. */
270 return depth == 0;
273 /* Pick up a token. */
275 static int
276 get_token (int idx, sb *in, sb *name)
278 if (idx < in->len
279 && is_name_beginner (in->ptr[idx]))
281 sb_add_char (name, in->ptr[idx++]);
282 while (idx < in->len
283 && is_part_of_name (in->ptr[idx]))
285 sb_add_char (name, in->ptr[idx++]);
287 if (idx < in->len
288 && is_name_ender (in->ptr[idx]))
290 sb_add_char (name, in->ptr[idx++]);
293 /* Ignore trailing &. */
294 if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
295 idx++;
296 return idx;
299 /* Pick up a string. */
301 static int
302 getstring (int idx, sb *in, sb *acc)
304 while (idx < in->len
305 && (in->ptr[idx] == '"'
306 || in->ptr[idx] == '('
307 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
308 || (in->ptr[idx] == '\'' && macro_alternate)))
310 if (in->ptr[idx] == '<')
312 int nest = 0;
313 char start_char = '>';
314 char end_char = '>';
316 idx++;
317 while ((in->ptr[idx] != end_char || nest)
318 && idx < in->len)
320 if (in->ptr[idx] == '!')
322 idx++;
323 sb_add_char (acc, in->ptr[idx++]);
325 else
327 if (in->ptr[idx] == end_char)
328 nest--;
329 if (in->ptr[idx] == start_char)
330 nest++;
331 sb_add_char (acc, in->ptr[idx++]);
334 idx++;
336 else if (in->ptr[idx] == '(')
338 int nest = 0;
339 char c;
343 c = in->ptr[idx];
345 if (c == '!')
346 c = in->ptr[++idx];
347 else if (c == ')')
348 nest--;
349 else if (c == '(')
350 nest++;
352 sb_add_char (acc, c);
353 idx++;
355 while ((c != ')' || nest)
356 && idx < in->len);
358 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
360 char tchar = in->ptr[idx];
361 int escaped = 0;
363 idx++;
365 while (idx < in->len)
367 if (in->ptr[idx - 1] == '\\')
368 escaped ^= 1;
369 else
370 escaped = 0;
372 if (macro_alternate && in->ptr[idx] == '!')
374 idx ++;
376 sb_add_char (acc, in->ptr[idx]);
378 idx ++;
380 else if (escaped && in->ptr[idx] == tchar)
382 sb_add_char (acc, tchar);
383 idx ++;
385 else
387 if (in->ptr[idx] == tchar)
389 idx ++;
391 if (idx >= in->len || in->ptr[idx] != tchar)
392 break;
395 sb_add_char (acc, in->ptr[idx]);
396 idx ++;
402 return idx;
405 /* Fetch string from the input stream,
406 rules:
407 'Bxyx<whitespace> -> return 'Bxyza
408 %<expr> -> return string of decimal value of <expr>
409 "string" -> return string
410 (string) -> return (string-including-whitespaces)
411 xyx<whitespace> -> return xyz. */
413 static int
414 get_any_string (int idx, sb *in, sb *out)
416 sb_reset (out);
417 idx = sb_skip_white (idx, in);
419 if (idx < in->len)
421 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
423 while (!ISSEP (in->ptr[idx]))
424 sb_add_char (out, in->ptr[idx++]);
426 else if (in->ptr[idx] == '%' && macro_alternate)
428 int val;
429 char buf[20];
431 /* Turns the next expression into a string. */
432 /* xgettext: no-c-format */
433 idx = (*macro_expr) (_("% operator needs absolute expression"),
434 idx + 1,
436 &val);
437 sprintf (buf, "%d", val);
438 sb_add_string (out, buf);
440 else if (in->ptr[idx] == '"'
441 || in->ptr[idx] == '('
442 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
443 || (macro_alternate && in->ptr[idx] == '\''))
445 if (macro_alternate && ! macro_strip_at)
447 /* Keep the quotes. */
448 sb_add_char (out, '\"');
450 idx = getstring (idx, in, out);
451 sb_add_char (out, '\"');
453 else
455 idx = getstring (idx, in, out);
458 else
460 while (idx < in->len
461 && in->ptr[idx] != ' '
462 && in->ptr[idx] != '\t'
463 && in->ptr[idx] != ','
464 && (in->ptr[idx] != '<'
465 || (! macro_alternate && ! macro_mri)))
467 if (in->ptr[idx] == '"'
468 || in->ptr[idx] == '\'')
470 char tchar = in->ptr[idx];
472 sb_add_char (out, in->ptr[idx++]);
473 while (idx < in->len
474 && in->ptr[idx] != tchar)
475 sb_add_char (out, in->ptr[idx++]);
476 if (idx == in->len)
477 return idx;
479 sb_add_char (out, in->ptr[idx++]);
484 return idx;
487 /* Allocate a new formal. */
489 static formal_entry *
490 new_formal (void)
492 formal_entry *formal;
494 formal = xmalloc (sizeof (formal_entry));
496 sb_new (&formal->name);
497 sb_new (&formal->def);
498 sb_new (&formal->actual);
499 formal->next = NULL;
500 formal->type = FORMAL_OPTIONAL;
501 return formal;
504 /* Free a formal. */
506 static void
507 del_formal (formal_entry *formal)
509 sb_kill (&formal->actual);
510 sb_kill (&formal->def);
511 sb_kill (&formal->name);
512 free (formal);
515 /* Pick up the formal parameters of a macro definition. */
517 static int
518 do_formals (macro_entry *macro, int idx, sb *in)
520 formal_entry **p = &macro->formals;
521 const char *name;
523 idx = sb_skip_white (idx, in);
524 while (idx < in->len)
526 formal_entry *formal = new_formal ();
527 int cidx;
529 idx = get_token (idx, in, &formal->name);
530 if (formal->name.len == 0)
532 if (macro->formal_count)
533 --idx;
534 break;
536 idx = sb_skip_white (idx, in);
537 /* This is a formal. */
538 name = sb_terminate (&formal->name);
539 if (! macro_mri
540 && idx < in->len
541 && in->ptr[idx] == ':'
542 && (! is_name_beginner (':')
543 || idx + 1 >= in->len
544 || ! is_part_of_name (in->ptr[idx + 1])))
546 /* Got a qualifier. */
547 sb qual;
549 sb_new (&qual);
550 idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
551 sb_terminate (&qual);
552 if (qual.len == 0)
553 as_bad_where (macro->file,
554 macro->line,
555 _("Missing parameter qualifier for `%s' in macro `%s'"),
556 name,
557 macro->name);
558 else if (strcmp (qual.ptr, "req") == 0)
559 formal->type = FORMAL_REQUIRED;
560 else if (strcmp (qual.ptr, "vararg") == 0)
561 formal->type = FORMAL_VARARG;
562 else
563 as_bad_where (macro->file,
564 macro->line,
565 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
566 qual.ptr,
567 name,
568 macro->name);
569 sb_kill (&qual);
570 idx = sb_skip_white (idx, in);
572 if (idx < in->len && in->ptr[idx] == '=')
574 /* Got a default. */
575 idx = get_any_string (idx + 1, in, &formal->def);
576 idx = sb_skip_white (idx, in);
577 if (formal->type == FORMAL_REQUIRED)
579 sb_reset (&formal->def);
580 as_warn_where (macro->file,
581 macro->line,
582 _("Pointless default value for required parameter `%s' in macro `%s'"),
583 name,
584 macro->name);
588 /* Add to macro's hash table. */
589 if (! hash_find (macro->formal_hash, name))
590 hash_jam (macro->formal_hash, name, formal);
591 else
592 as_bad_where (macro->file,
593 macro->line,
594 _("A parameter named `%s' already exists for macro `%s'"),
595 name,
596 macro->name);
598 formal->index = macro->formal_count++;
599 *p = formal;
600 p = &formal->next;
601 if (formal->type == FORMAL_VARARG)
602 break;
603 cidx = idx;
604 idx = sb_skip_comma (idx, in);
605 if (idx != cidx && idx >= in->len)
607 idx = cidx;
608 break;
612 if (macro_mri)
614 formal_entry *formal = new_formal ();
616 /* Add a special NARG formal, which macro_expand will set to the
617 number of arguments. */
618 /* The same MRI assemblers which treat '@' characters also use
619 the name $NARG. At least until we find an exception. */
620 if (macro_strip_at)
621 name = "$NARG";
622 else
623 name = "NARG";
625 sb_add_string (&formal->name, name);
627 /* Add to macro's hash table. */
628 if (hash_find (macro->formal_hash, name))
629 as_bad_where (macro->file,
630 macro->line,
631 _("Reserved word `%s' used as parameter in macro `%s'"),
632 name,
633 macro->name);
634 hash_jam (macro->formal_hash, name, formal);
636 formal->index = NARG_INDEX;
637 *p = formal;
640 return idx;
643 /* Define a new macro. Returns NULL on success, otherwise returns an
644 error message. If NAMEP is not NULL, *NAMEP is set to the name of
645 the macro which was defined. */
647 const char *
648 define_macro (int idx, sb *in, sb *label,
649 int (*get_line) (sb *),
650 char *file, unsigned int line,
651 const char **namep)
653 macro_entry *macro;
654 sb name;
655 const char *error = NULL;
657 macro = (macro_entry *) xmalloc (sizeof (macro_entry));
658 sb_new (&macro->sub);
659 sb_new (&name);
660 macro->file = file;
661 macro->line = line;
663 macro->formal_count = 0;
664 macro->formals = 0;
665 macro->formal_hash = hash_new ();
667 idx = sb_skip_white (idx, in);
668 if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
669 error = _("unexpected end of file in macro `%s' definition");
670 if (label != NULL && label->len != 0)
672 sb_add_sb (&name, label);
673 macro->name = sb_terminate (&name);
674 if (idx < in->len && in->ptr[idx] == '(')
676 /* It's the label: MACRO (formals,...) sort */
677 idx = do_formals (macro, idx + 1, in);
678 if (idx < in->len && in->ptr[idx] == ')')
679 idx = sb_skip_white (idx + 1, in);
680 else if (!error)
681 error = _("missing `)' after formals in macro definition `%s'");
683 else
685 /* It's the label: MACRO formals,... sort */
686 idx = do_formals (macro, idx, in);
689 else
691 int cidx;
693 idx = get_token (idx, in, &name);
694 macro->name = sb_terminate (&name);
695 if (name.len == 0)
696 error = _("Missing macro name");
697 cidx = sb_skip_white (idx, in);
698 idx = sb_skip_comma (cidx, in);
699 if (idx == cidx || idx < in->len)
700 idx = do_formals (macro, idx, in);
701 else
702 idx = cidx;
704 if (!error && idx < in->len)
705 error = _("Bad parameter list for macro `%s'");
707 /* And stick it in the macro hash table. */
708 for (idx = 0; idx < name.len; idx++)
709 name.ptr[idx] = TOLOWER (name.ptr[idx]);
710 if (hash_find (macro_hash, macro->name))
711 error = _("Macro `%s' was already defined");
712 if (!error)
713 error = hash_jam (macro_hash, macro->name, (PTR) macro);
715 if (namep != NULL)
716 *namep = macro->name;
718 if (!error)
719 macro_defined = 1;
720 else
721 free_macro (macro);
723 return error;
726 /* Scan a token, and then skip KIND. */
728 static int
729 get_apost_token (int idx, sb *in, sb *name, int kind)
731 idx = get_token (idx, in, name);
732 if (idx < in->len
733 && in->ptr[idx] == kind
734 && (! macro_mri || macro_strip_at)
735 && (! macro_strip_at || kind == '@'))
736 idx++;
737 return idx;
740 /* Substitute the actual value for a formal parameter. */
742 static int
743 sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
744 int kind, sb *out, int copyifnotthere)
746 int src;
747 formal_entry *ptr;
749 src = get_apost_token (start, in, t, kind);
750 /* See if it's in the macro's hash table, unless this is
751 macro_strip_at and kind is '@' and the token did not end in '@'. */
752 if (macro_strip_at
753 && kind == '@'
754 && (src == start || in->ptr[src - 1] != '@'))
755 ptr = NULL;
756 else
757 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
758 if (ptr)
760 if (ptr->actual.len)
762 sb_add_sb (out, &ptr->actual);
764 else
766 sb_add_sb (out, &ptr->def);
769 else if (kind == '&')
771 /* Doing this permits people to use & in macro bodies. */
772 sb_add_char (out, '&');
773 sb_add_sb (out, t);
775 else if (copyifnotthere)
777 sb_add_sb (out, t);
779 else
781 sb_add_char (out, '\\');
782 sb_add_sb (out, t);
784 return src;
787 /* Expand the body of a macro. */
789 static const char *
790 macro_expand_body (sb *in, sb *out, formal_entry *formals,
791 struct hash_control *formal_hash, const macro_entry *macro)
793 sb t;
794 int src = 0, inquote = 0, macro_line = 0;
795 formal_entry *loclist = NULL;
796 const char *err = NULL;
798 sb_new (&t);
800 while (src < in->len && !err)
802 if (in->ptr[src] == '&')
804 sb_reset (&t);
805 if (macro_mri)
807 if (src + 1 < in->len && in->ptr[src + 1] == '&')
808 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
809 else
810 sb_add_char (out, in->ptr[src++]);
812 else
814 /* FIXME: Why do we do this? */
815 /* At least in alternate mode this seems correct; without this
816 one can't append a literal to a parameter. */
817 src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
820 else if (in->ptr[src] == '\\')
822 src++;
823 if (src < in->len && in->ptr[src] == '(')
825 /* Sub in till the next ')' literally. */
826 src++;
827 while (src < in->len && in->ptr[src] != ')')
829 sb_add_char (out, in->ptr[src++]);
831 if (src < in->len)
832 src++;
833 else if (!macro)
834 err = _("missing `)'");
835 else
836 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
838 else if (src < in->len && in->ptr[src] == '@')
840 /* Sub in the macro invocation number. */
842 char buffer[10];
843 src++;
844 sprintf (buffer, "%d", macro_number);
845 sb_add_string (out, buffer);
847 else if (src < in->len && in->ptr[src] == '&')
849 /* This is a preprocessor variable name, we don't do them
850 here. */
851 sb_add_char (out, '\\');
852 sb_add_char (out, '&');
853 src++;
855 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
857 int ind;
858 formal_entry *f;
860 if (ISDIGIT (in->ptr[src]))
861 ind = in->ptr[src] - '0';
862 else if (ISUPPER (in->ptr[src]))
863 ind = in->ptr[src] - 'A' + 10;
864 else
865 ind = in->ptr[src] - 'a' + 10;
866 ++src;
867 for (f = formals; f != NULL; f = f->next)
869 if (f->index == ind - 1)
871 if (f->actual.len != 0)
872 sb_add_sb (out, &f->actual);
873 else
874 sb_add_sb (out, &f->def);
875 break;
879 else
881 sb_reset (&t);
882 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
885 else if ((macro_alternate || macro_mri)
886 && is_name_beginner (in->ptr[src])
887 && (! inquote
888 || ! macro_strip_at
889 || (src > 0 && in->ptr[src - 1] == '@')))
891 if (! macro
892 || src + 5 >= in->len
893 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
894 || ! ISWHITE (in->ptr[src + 5]))
896 sb_reset (&t);
897 src = sub_actual (src, in, &t, formal_hash,
898 (macro_strip_at && inquote) ? '@' : '\'',
899 out, 1);
901 else
903 src = sb_skip_white (src + 5, in);
904 while (in->ptr[src] != '\n')
906 const char *name;
907 formal_entry *f = new_formal ();
909 src = get_token (src, in, &f->name);
910 name = sb_terminate (&f->name);
911 if (! hash_find (formal_hash, name))
913 static int loccnt;
914 char buf[20];
916 f->index = LOCAL_INDEX;
917 f->next = loclist;
918 loclist = f;
920 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
921 sb_add_string (&f->actual, buf);
923 err = hash_jam (formal_hash, name, f);
924 if (err != NULL)
925 break;
927 else
929 as_bad_where (macro->file,
930 macro->line + macro_line,
931 _("`%s' was already used as parameter (or another local) name"),
932 name);
933 del_formal (f);
936 src = sb_skip_comma (src, in);
940 else if (in->ptr[src] == '"'
941 || (macro_mri && in->ptr[src] == '\''))
943 inquote = !inquote;
944 sb_add_char (out, in->ptr[src++]);
946 else if (in->ptr[src] == '@' && macro_strip_at)
948 ++src;
949 if (src < in->len
950 && in->ptr[src] == '@')
952 sb_add_char (out, '@');
953 ++src;
956 else if (macro_mri
957 && in->ptr[src] == '='
958 && src + 1 < in->len
959 && in->ptr[src + 1] == '=')
961 formal_entry *ptr;
963 sb_reset (&t);
964 src = get_token (src + 2, in, &t);
965 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
966 if (ptr == NULL)
968 /* FIXME: We should really return a warning string here,
969 but we can't, because the == might be in the MRI
970 comment field, and, since the nature of the MRI
971 comment field depends upon the exact instruction
972 being used, we don't have enough information here to
973 figure out whether it is or not. Instead, we leave
974 the == in place, which should cause a syntax error if
975 it is not in a comment. */
976 sb_add_char (out, '=');
977 sb_add_char (out, '=');
978 sb_add_sb (out, &t);
980 else
982 if (ptr->actual.len)
984 sb_add_string (out, "-1");
986 else
988 sb_add_char (out, '0');
992 else
994 if (in->ptr[src] == '\n')
995 ++macro_line;
996 sb_add_char (out, in->ptr[src++]);
1000 sb_kill (&t);
1002 while (loclist != NULL)
1004 formal_entry *f;
1006 f = loclist->next;
1007 /* Setting the value to NULL effectively deletes the entry. We
1008 avoid calling hash_delete because it doesn't reclaim memory. */
1009 hash_jam (formal_hash, sb_terminate (&loclist->name), NULL);
1010 del_formal (loclist);
1011 loclist = f;
1014 return err;
1017 /* Assign values to the formal parameters of a macro, and expand the
1018 body. */
1020 static const char *
1021 macro_expand (int idx, sb *in, macro_entry *m, sb *out)
1023 sb t;
1024 formal_entry *ptr;
1025 formal_entry *f;
1026 int is_positional = 0;
1027 int is_keyword = 0;
1028 int narg = 0;
1029 const char *err = NULL;
1031 sb_new (&t);
1033 /* Reset any old value the actuals may have. */
1034 for (f = m->formals; f; f = f->next)
1035 sb_reset (&f->actual);
1036 f = m->formals;
1037 while (f != NULL && f->index < 0)
1038 f = f->next;
1040 if (macro_mri)
1042 /* The macro may be called with an optional qualifier, which may
1043 be referred to in the macro body as \0. */
1044 if (idx < in->len && in->ptr[idx] == '.')
1046 /* The Microtec assembler ignores this if followed by a white space.
1047 (Macro invocation with empty extension) */
1048 idx++;
1049 if ( idx < in->len
1050 && in->ptr[idx] != ' '
1051 && in->ptr[idx] != '\t')
1053 formal_entry *n = new_formal ();
1055 n->index = QUAL_INDEX;
1057 n->next = m->formals;
1058 m->formals = n;
1060 idx = get_any_string (idx, in, &n->actual);
1065 /* Peel off the actuals and store them away in the hash tables' actuals. */
1066 idx = sb_skip_white (idx, in);
1067 while (idx < in->len)
1069 int scan;
1071 /* Look and see if it's a positional or keyword arg. */
1072 scan = idx;
1073 while (scan < in->len
1074 && !ISSEP (in->ptr[scan])
1075 && !(macro_mri && in->ptr[scan] == '\'')
1076 && (!macro_alternate && in->ptr[scan] != '='))
1077 scan++;
1078 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1080 is_keyword = 1;
1082 /* It's OK to go from positional to keyword. */
1084 /* This is a keyword arg, fetch the formal name and
1085 then the actual stuff. */
1086 sb_reset (&t);
1087 idx = get_token (idx, in, &t);
1088 if (in->ptr[idx] != '=')
1090 err = _("confusion in formal parameters");
1091 break;
1094 /* Lookup the formal in the macro's list. */
1095 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1096 if (!ptr)
1097 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1098 t.ptr,
1099 m->name);
1100 else
1102 /* Insert this value into the right place. */
1103 if (ptr->actual.len)
1105 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1106 ptr->name.ptr,
1107 m->name);
1108 sb_reset (&ptr->actual);
1110 idx = get_any_string (idx + 1, in, &ptr->actual);
1111 if (ptr->actual.len > 0)
1112 ++narg;
1115 else
1117 /* This is a positional arg. */
1118 is_positional = 1;
1119 if (is_keyword)
1121 err = _("can't mix positional and keyword arguments");
1122 break;
1125 if (!f)
1127 formal_entry **pf;
1128 int c;
1130 if (!macro_mri)
1132 err = _("too many positional arguments");
1133 break;
1136 f = new_formal ();
1138 c = -1;
1139 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1140 if ((*pf)->index >= c)
1141 c = (*pf)->index + 1;
1142 if (c == -1)
1143 c = 0;
1144 *pf = f;
1145 f->index = c;
1148 if (f->type != FORMAL_VARARG)
1149 idx = get_any_string (idx, in, &f->actual);
1150 else
1152 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1153 idx = in->len;
1155 if (f->actual.len > 0)
1156 ++narg;
1159 f = f->next;
1161 while (f != NULL && f->index < 0);
1164 if (! macro_mri)
1165 idx = sb_skip_comma (idx, in);
1166 else
1168 if (in->ptr[idx] == ',')
1169 ++idx;
1170 if (ISWHITE (in->ptr[idx]))
1171 break;
1175 if (! err)
1177 for (ptr = m->formals; ptr; ptr = ptr->next)
1179 if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1180 as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1181 ptr->name.ptr,
1182 m->name);
1185 if (macro_mri)
1187 char buffer[20];
1189 sb_reset (&t);
1190 sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1191 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1192 sprintf (buffer, "%d", narg);
1193 sb_add_string (&ptr->actual, buffer);
1196 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1199 /* Discard any unnamed formal arguments. */
1200 if (macro_mri)
1202 formal_entry **pf;
1204 pf = &m->formals;
1205 while (*pf != NULL)
1207 if ((*pf)->name.len != 0)
1208 pf = &(*pf)->next;
1209 else
1211 f = (*pf)->next;
1212 del_formal (*pf);
1213 *pf = f;
1218 sb_kill (&t);
1219 if (!err)
1220 macro_number++;
1222 return err;
1225 /* Check for a macro. If one is found, put the expansion into
1226 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
1229 check_macro (const char *line, sb *expand,
1230 const char **error, macro_entry **info)
1232 const char *s;
1233 char *copy, *cs;
1234 macro_entry *macro;
1235 sb line_sb;
1237 if (! is_name_beginner (*line)
1238 && (! macro_mri || *line != '.'))
1239 return 0;
1241 s = line + 1;
1242 while (is_part_of_name (*s))
1243 ++s;
1244 if (is_name_ender (*s))
1245 ++s;
1247 copy = (char *) alloca (s - line + 1);
1248 memcpy (copy, line, s - line);
1249 copy[s - line] = '\0';
1250 for (cs = copy; *cs != '\0'; cs++)
1251 *cs = TOLOWER (*cs);
1253 macro = (macro_entry *) hash_find (macro_hash, copy);
1255 if (macro == NULL)
1256 return 0;
1258 /* Wrap the line up in an sb. */
1259 sb_new (&line_sb);
1260 while (*s != '\0' && *s != '\n' && *s != '\r')
1261 sb_add_char (&line_sb, *s++);
1263 sb_new (expand);
1264 *error = macro_expand (0, &line_sb, macro, expand);
1266 sb_kill (&line_sb);
1268 /* Export the macro information if requested. */
1269 if (info)
1270 *info = macro;
1272 return 1;
1275 /* Free the memory allocated to a macro. */
1277 static void
1278 free_macro(macro_entry *macro)
1280 formal_entry *formal;
1282 for (formal = macro->formals; formal; )
1284 formal_entry *f;
1286 f = formal;
1287 formal = formal->next;
1288 del_formal (f);
1290 hash_die (macro->formal_hash);
1291 sb_kill (&macro->sub);
1292 free (macro);
1295 /* Delete a macro. */
1297 void
1298 delete_macro (const char *name)
1300 char *copy;
1301 size_t i, len;
1302 macro_entry *macro;
1304 len = strlen (name);
1305 copy = (char *) alloca (len + 1);
1306 for (i = 0; i < len; ++i)
1307 copy[i] = TOLOWER (name[i]);
1308 copy[i] = '\0';
1310 /* Since hash_delete doesn't free memory, just clear out the entry. */
1311 if ((macro = hash_find (macro_hash, copy)) != NULL)
1313 hash_jam (macro_hash, copy, NULL);
1314 free_macro (macro);
1316 else
1317 as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
1320 /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1321 combined macro definition and execution. This returns NULL on
1322 success, or an error message otherwise. */
1324 const char *
1325 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
1327 sb sub;
1328 formal_entry f;
1329 struct hash_control *h;
1330 const char *err;
1332 idx = sb_skip_white (idx, in);
1334 sb_new (&sub);
1335 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1336 return _("unexpected end of file in irp or irpc");
1338 sb_new (&f.name);
1339 sb_new (&f.def);
1340 sb_new (&f.actual);
1342 idx = get_token (idx, in, &f.name);
1343 if (f.name.len == 0)
1344 return _("missing model parameter");
1346 h = hash_new ();
1347 err = hash_jam (h, sb_terminate (&f.name), &f);
1348 if (err != NULL)
1349 return err;
1351 f.index = 1;
1352 f.next = NULL;
1353 f.type = FORMAL_OPTIONAL;
1355 sb_reset (out);
1357 idx = sb_skip_comma (idx, in);
1358 if (idx >= in->len)
1360 /* Expand once with a null string. */
1361 err = macro_expand_body (&sub, out, &f, h, 0);
1363 else
1365 if (irpc && in->ptr[idx] == '"')
1366 ++idx;
1367 while (idx < in->len)
1369 if (!irpc)
1370 idx = get_any_string (idx, in, &f.actual);
1371 else
1373 if (in->ptr[idx] == '"')
1375 int nxt;
1377 nxt = sb_skip_white (idx + 1, in);
1378 if (nxt >= in->len)
1380 idx = nxt;
1381 break;
1384 sb_reset (&f.actual);
1385 sb_add_char (&f.actual, in->ptr[idx]);
1386 ++idx;
1388 err = macro_expand_body (&sub, out, &f, h, 0);
1389 if (err != NULL)
1390 break;
1391 if (!irpc)
1392 idx = sb_skip_comma (idx, in);
1393 else
1394 idx = sb_skip_white (idx, in);
1398 hash_die (h);
1399 sb_kill (&f.actual);
1400 sb_kill (&f.def);
1401 sb_kill (&f.name);
1402 sb_kill (&sub);
1404 return err;