2009-12-02 Rafael Avila de Espindola <espindola@google.com>
[binutils.git] / gas / macro.c
blobf77be59ad7b6e4a0ac6251e72af4936b796f160b
1 /* macro.c - macro support for gas
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
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 3, 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 "as.h"
26 #include "safe-ctype.h"
27 #include "sb.h"
28 #include "macro.h"
30 /* The routines in this file handle macro definition and expansion.
31 They are called by gas. */
33 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
35 #define ISSEP(x) \
36 ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
37 || (x) == ')' || (x) == '(' \
38 || ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
40 #define ISBASE(x) \
41 ((x) == 'b' || (x) == 'B' \
42 || (x) == 'q' || (x) == 'Q' \
43 || (x) == 'h' || (x) == 'H' \
44 || (x) == 'd' || (x) == 'D')
46 /* The macro hash table. */
48 struct hash_control *macro_hash;
50 /* Whether any macros have been defined. */
52 int macro_defined;
54 /* Whether we are in alternate syntax mode. */
56 static int macro_alternate;
58 /* Whether we are in MRI mode. */
60 static int macro_mri;
62 /* Whether we should strip '@' characters. */
64 static int macro_strip_at;
66 /* Function to use to parse an expression. */
68 static int (*macro_expr) (const char *, int, sb *, int *);
70 /* Number of macro expansions that have been done. */
72 static int macro_number;
74 /* Initialize macro processing. */
76 void
77 macro_init (int alternate, int mri, int strip_at,
78 int (*expr) (const char *, int, sb *, int *))
80 macro_hash = hash_new ();
81 macro_defined = 0;
82 macro_alternate = alternate;
83 macro_mri = mri;
84 macro_strip_at = strip_at;
85 macro_expr = expr;
88 /* Switch in and out of alternate mode on the fly. */
90 void
91 macro_set_alternate (int alternate)
93 macro_alternate = alternate;
96 /* Switch in and out of MRI mode on the fly. */
98 void
99 macro_mri_mode (int mri)
101 macro_mri = mri;
104 /* Read input lines till we get to a TO string.
105 Increase nesting depth if we get a FROM string.
106 Put the results into sb at PTR.
107 FROM may be NULL (or will be ignored) if TO is "ENDR".
108 Add a new input line to an sb using GET_LINE.
109 Return 1 on success, 0 on unexpected EOF. */
112 buffer_and_nest (const char *from, const char *to, sb *ptr,
113 int (*get_line) (sb *))
115 int from_len;
116 int to_len = strlen (to);
117 int depth = 1;
118 int line_start = ptr->len;
120 int more = get_line (ptr);
122 if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
124 from = NULL;
125 from_len = 0;
127 else
128 from_len = strlen (from);
130 while (more)
132 /* Try to find the first pseudo op on the line. */
133 int i = line_start;
134 bfd_boolean had_colon = FALSE;
136 /* With normal syntax we can suck what we want till we get
137 to the dot. With the alternate, labels have to start in
138 the first column, since we can't tell what's a label and
139 what's a pseudoop. */
141 if (! LABELS_WITHOUT_COLONS)
143 /* Skip leading whitespace. */
144 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
145 i++;
148 for (;;)
150 /* Skip over a label, if any. */
151 if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
152 break;
153 i++;
154 while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
155 i++;
156 if (i < ptr->len && is_name_ender (ptr->ptr[i]))
157 i++;
158 /* Skip whitespace. */
159 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
160 i++;
161 /* Check for the colon. */
162 if (i >= ptr->len || ptr->ptr[i] != ':')
164 /* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
165 colon after a label. If we do have a colon on the
166 first label then handle more than one label on the
167 line, assuming that each label has a colon. */
168 if (LABELS_WITHOUT_COLONS && !had_colon)
169 break;
170 i = line_start;
171 break;
173 i++;
174 line_start = i;
175 had_colon = TRUE;
178 /* Skip trailing whitespace. */
179 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
180 i++;
182 if (i < ptr->len && (ptr->ptr[i] == '.'
183 || NO_PSEUDO_DOT
184 || macro_mri))
186 if (! flag_m68k_mri && ptr->ptr[i] == '.')
187 i++;
188 if (from == NULL
189 && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
190 && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
191 && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
192 && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
193 && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
194 && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
195 from_len = 0;
196 if ((from != NULL
197 ? strncasecmp (ptr->ptr + i, from, from_len) == 0
198 : from_len > 0)
199 && (ptr->len == (i + from_len)
200 || ! (is_part_of_name (ptr->ptr[i + from_len])
201 || is_name_ender (ptr->ptr[i + from_len]))))
202 depth++;
203 if (strncasecmp (ptr->ptr + i, to, to_len) == 0
204 && (ptr->len == (i + to_len)
205 || ! (is_part_of_name (ptr->ptr[i + to_len])
206 || is_name_ender (ptr->ptr[i + to_len]))))
208 depth--;
209 if (depth == 0)
211 /* Reset the string to not include the ending rune. */
212 ptr->len = line_start;
213 break;
218 /* Add the original end-of-line char to the end and keep running. */
219 sb_add_char (ptr, more);
220 line_start = ptr->len;
221 more = get_line (ptr);
224 /* Return 1 on success, 0 on unexpected EOF. */
225 return depth == 0;
228 /* Pick up a token. */
230 static int
231 get_token (int idx, sb *in, sb *name)
233 if (idx < in->len
234 && is_name_beginner (in->ptr[idx]))
236 sb_add_char (name, in->ptr[idx++]);
237 while (idx < in->len
238 && is_part_of_name (in->ptr[idx]))
240 sb_add_char (name, in->ptr[idx++]);
242 if (idx < in->len
243 && is_name_ender (in->ptr[idx]))
245 sb_add_char (name, in->ptr[idx++]);
248 /* Ignore trailing &. */
249 if (macro_alternate && idx < in->len && in->ptr[idx] == '&')
250 idx++;
251 return idx;
254 /* Pick up a string. */
256 static int
257 getstring (int idx, sb *in, sb *acc)
259 while (idx < in->len
260 && (in->ptr[idx] == '"'
261 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
262 || (in->ptr[idx] == '\'' && macro_alternate)))
264 if (in->ptr[idx] == '<')
266 int nest = 0;
267 idx++;
268 while ((in->ptr[idx] != '>' || nest)
269 && idx < in->len)
271 if (in->ptr[idx] == '!')
273 idx++;
274 sb_add_char (acc, in->ptr[idx++]);
276 else
278 if (in->ptr[idx] == '>')
279 nest--;
280 if (in->ptr[idx] == '<')
281 nest++;
282 sb_add_char (acc, in->ptr[idx++]);
285 idx++;
287 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
289 char tchar = in->ptr[idx];
290 int escaped = 0;
292 idx++;
294 while (idx < in->len)
296 if (in->ptr[idx - 1] == '\\')
297 escaped ^= 1;
298 else
299 escaped = 0;
301 if (macro_alternate && in->ptr[idx] == '!')
303 idx ++;
305 sb_add_char (acc, in->ptr[idx]);
307 idx ++;
309 else if (escaped && in->ptr[idx] == tchar)
311 sb_add_char (acc, tchar);
312 idx ++;
314 else
316 if (in->ptr[idx] == tchar)
318 idx ++;
320 if (idx >= in->len || in->ptr[idx] != tchar)
321 break;
324 sb_add_char (acc, in->ptr[idx]);
325 idx ++;
331 return idx;
334 /* Fetch string from the input stream,
335 rules:
336 'Bxyx<whitespace> -> return 'Bxyza
337 %<expr> -> return string of decimal value of <expr>
338 "string" -> return string
339 (string) -> return (string-including-whitespaces)
340 xyx<whitespace> -> return xyz. */
342 static int
343 get_any_string (int idx, sb *in, sb *out)
345 sb_reset (out);
346 idx = sb_skip_white (idx, in);
348 if (idx < in->len)
350 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
352 while (!ISSEP (in->ptr[idx]))
353 sb_add_char (out, in->ptr[idx++]);
355 else if (in->ptr[idx] == '%' && macro_alternate)
357 int val;
358 char buf[20];
360 /* Turns the next expression into a string. */
361 /* xgettext: no-c-format */
362 idx = (*macro_expr) (_("% operator needs absolute expression"),
363 idx + 1,
365 &val);
366 sprintf (buf, "%d", val);
367 sb_add_string (out, buf);
369 else if (in->ptr[idx] == '"'
370 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
371 || (macro_alternate && in->ptr[idx] == '\''))
373 if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
375 /* Keep the quotes. */
376 sb_add_char (out, '"');
377 idx = getstring (idx, in, out);
378 sb_add_char (out, '"');
380 else
382 idx = getstring (idx, in, out);
385 else
387 char *br_buf = (char *) xmalloc(1);
388 char *in_br = br_buf;
390 *in_br = '\0';
391 while (idx < in->len
392 && (*in_br
393 || (in->ptr[idx] != ' '
394 && in->ptr[idx] != '\t'))
395 && in->ptr[idx] != ','
396 && (in->ptr[idx] != '<'
397 || (! macro_alternate && ! macro_mri)))
399 char tchar = in->ptr[idx];
401 switch (tchar)
403 case '"':
404 case '\'':
405 sb_add_char (out, in->ptr[idx++]);
406 while (idx < in->len
407 && in->ptr[idx] != tchar)
408 sb_add_char (out, in->ptr[idx++]);
409 if (idx == in->len)
410 return idx;
411 break;
412 case '(':
413 case '[':
414 if (in_br > br_buf)
415 --in_br;
416 else
418 br_buf = (char *) xmalloc(strlen(in_br) + 2);
419 strcpy(br_buf + 1, in_br);
420 free(in_br);
421 in_br = br_buf;
423 *in_br = tchar;
424 break;
425 case ')':
426 if (*in_br == '(')
427 ++in_br;
428 break;
429 case ']':
430 if (*in_br == '[')
431 ++in_br;
432 break;
434 sb_add_char (out, tchar);
435 ++idx;
437 free(br_buf);
441 return idx;
444 /* Allocate a new formal. */
446 static formal_entry *
447 new_formal (void)
449 formal_entry *formal;
451 formal = (formal_entry *) xmalloc (sizeof (formal_entry));
453 sb_new (&formal->name);
454 sb_new (&formal->def);
455 sb_new (&formal->actual);
456 formal->next = NULL;
457 formal->type = FORMAL_OPTIONAL;
458 return formal;
461 /* Free a formal. */
463 static void
464 del_formal (formal_entry *formal)
466 sb_kill (&formal->actual);
467 sb_kill (&formal->def);
468 sb_kill (&formal->name);
469 free (formal);
472 /* Pick up the formal parameters of a macro definition. */
474 static int
475 do_formals (macro_entry *macro, int idx, sb *in)
477 formal_entry **p = &macro->formals;
478 const char *name;
480 idx = sb_skip_white (idx, in);
481 while (idx < in->len)
483 formal_entry *formal = new_formal ();
484 int cidx;
486 idx = get_token (idx, in, &formal->name);
487 if (formal->name.len == 0)
489 if (macro->formal_count)
490 --idx;
491 break;
493 idx = sb_skip_white (idx, in);
494 /* This is a formal. */
495 name = sb_terminate (&formal->name);
496 if (! macro_mri
497 && idx < in->len
498 && in->ptr[idx] == ':'
499 && (! is_name_beginner (':')
500 || idx + 1 >= in->len
501 || ! is_part_of_name (in->ptr[idx + 1])))
503 /* Got a qualifier. */
504 sb qual;
506 sb_new (&qual);
507 idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
508 sb_terminate (&qual);
509 if (qual.len == 0)
510 as_bad_where (macro->file,
511 macro->line,
512 _("Missing parameter qualifier for `%s' in macro `%s'"),
513 name,
514 macro->name);
515 else if (strcmp (qual.ptr, "req") == 0)
516 formal->type = FORMAL_REQUIRED;
517 else if (strcmp (qual.ptr, "vararg") == 0)
518 formal->type = FORMAL_VARARG;
519 else
520 as_bad_where (macro->file,
521 macro->line,
522 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
523 qual.ptr,
524 name,
525 macro->name);
526 sb_kill (&qual);
527 idx = sb_skip_white (idx, in);
529 if (idx < in->len && in->ptr[idx] == '=')
531 /* Got a default. */
532 idx = get_any_string (idx + 1, in, &formal->def);
533 idx = sb_skip_white (idx, in);
534 if (formal->type == FORMAL_REQUIRED)
536 sb_reset (&formal->def);
537 as_warn_where (macro->file,
538 macro->line,
539 _("Pointless default value for required parameter `%s' in macro `%s'"),
540 name,
541 macro->name);
545 /* Add to macro's hash table. */
546 if (! hash_find (macro->formal_hash, name))
547 hash_jam (macro->formal_hash, name, formal);
548 else
549 as_bad_where (macro->file,
550 macro->line,
551 _("A parameter named `%s' already exists for macro `%s'"),
552 name,
553 macro->name);
555 formal->index = macro->formal_count++;
556 *p = formal;
557 p = &formal->next;
558 if (formal->type == FORMAL_VARARG)
559 break;
560 cidx = idx;
561 idx = sb_skip_comma (idx, in);
562 if (idx != cidx && idx >= in->len)
564 idx = cidx;
565 break;
569 if (macro_mri)
571 formal_entry *formal = new_formal ();
573 /* Add a special NARG formal, which macro_expand will set to the
574 number of arguments. */
575 /* The same MRI assemblers which treat '@' characters also use
576 the name $NARG. At least until we find an exception. */
577 if (macro_strip_at)
578 name = "$NARG";
579 else
580 name = "NARG";
582 sb_add_string (&formal->name, name);
584 /* Add to macro's hash table. */
585 if (hash_find (macro->formal_hash, name))
586 as_bad_where (macro->file,
587 macro->line,
588 _("Reserved word `%s' used as parameter in macro `%s'"),
589 name,
590 macro->name);
591 hash_jam (macro->formal_hash, name, formal);
593 formal->index = NARG_INDEX;
594 *p = formal;
597 return idx;
600 /* Free the memory allocated to a macro. */
602 static void
603 free_macro (macro_entry *macro)
605 formal_entry *formal;
607 for (formal = macro->formals; formal; )
609 formal_entry *f;
611 f = formal;
612 formal = formal->next;
613 del_formal (f);
615 hash_die (macro->formal_hash);
616 sb_kill (&macro->sub);
617 free (macro);
620 /* Define a new macro. Returns NULL on success, otherwise returns an
621 error message. If NAMEP is not NULL, *NAMEP is set to the name of
622 the macro which was defined. */
624 const char *
625 define_macro (int idx, sb *in, sb *label,
626 int (*get_line) (sb *),
627 char *file, unsigned int line,
628 const char **namep)
630 macro_entry *macro;
631 sb name;
632 const char *error = NULL;
634 macro = (macro_entry *) xmalloc (sizeof (macro_entry));
635 sb_new (&macro->sub);
636 sb_new (&name);
637 macro->file = file;
638 macro->line = line;
640 macro->formal_count = 0;
641 macro->formals = 0;
642 macro->formal_hash = hash_new ();
644 idx = sb_skip_white (idx, in);
645 if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
646 error = _("unexpected end of file in macro `%s' definition");
647 if (label != NULL && label->len != 0)
649 sb_add_sb (&name, label);
650 macro->name = sb_terminate (&name);
651 if (idx < in->len && in->ptr[idx] == '(')
653 /* It's the label: MACRO (formals,...) sort */
654 idx = do_formals (macro, idx + 1, in);
655 if (idx < in->len && in->ptr[idx] == ')')
656 idx = sb_skip_white (idx + 1, in);
657 else if (!error)
658 error = _("missing `)' after formals in macro definition `%s'");
660 else
662 /* It's the label: MACRO formals,... sort */
663 idx = do_formals (macro, idx, in);
666 else
668 int cidx;
670 idx = get_token (idx, in, &name);
671 macro->name = sb_terminate (&name);
672 if (name.len == 0)
673 error = _("Missing macro name");
674 cidx = sb_skip_white (idx, in);
675 idx = sb_skip_comma (cidx, in);
676 if (idx == cidx || idx < in->len)
677 idx = do_formals (macro, idx, in);
678 else
679 idx = cidx;
681 if (!error && idx < in->len)
682 error = _("Bad parameter list for macro `%s'");
684 /* And stick it in the macro hash table. */
685 for (idx = 0; idx < name.len; idx++)
686 name.ptr[idx] = TOLOWER (name.ptr[idx]);
687 if (hash_find (macro_hash, macro->name))
688 error = _("Macro `%s' was already defined");
689 if (!error)
690 error = hash_jam (macro_hash, macro->name, (void *) macro);
692 if (namep != NULL)
693 *namep = macro->name;
695 if (!error)
696 macro_defined = 1;
697 else
698 free_macro (macro);
700 return error;
703 /* Scan a token, and then skip KIND. */
705 static int
706 get_apost_token (int idx, sb *in, sb *name, int kind)
708 idx = get_token (idx, in, name);
709 if (idx < in->len
710 && in->ptr[idx] == kind
711 && (! macro_mri || macro_strip_at)
712 && (! macro_strip_at || kind == '@'))
713 idx++;
714 return idx;
717 /* Substitute the actual value for a formal parameter. */
719 static int
720 sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
721 int kind, sb *out, int copyifnotthere)
723 int src;
724 formal_entry *ptr;
726 src = get_apost_token (start, in, t, kind);
727 /* See if it's in the macro's hash table, unless this is
728 macro_strip_at and kind is '@' and the token did not end in '@'. */
729 if (macro_strip_at
730 && kind == '@'
731 && (src == start || in->ptr[src - 1] != '@'))
732 ptr = NULL;
733 else
734 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
735 if (ptr)
737 if (ptr->actual.len)
739 sb_add_sb (out, &ptr->actual);
741 else
743 sb_add_sb (out, &ptr->def);
746 else if (kind == '&')
748 /* Doing this permits people to use & in macro bodies. */
749 sb_add_char (out, '&');
750 sb_add_sb (out, t);
752 else if (copyifnotthere)
754 sb_add_sb (out, t);
756 else
758 sb_add_char (out, '\\');
759 sb_add_sb (out, t);
761 return src;
764 /* Expand the body of a macro. */
766 static const char *
767 macro_expand_body (sb *in, sb *out, formal_entry *formals,
768 struct hash_control *formal_hash, const macro_entry *macro)
770 sb t;
771 int src = 0, inquote = 0, macro_line = 0;
772 formal_entry *loclist = NULL;
773 const char *err = NULL;
775 sb_new (&t);
777 while (src < in->len && !err)
779 if (in->ptr[src] == '&')
781 sb_reset (&t);
782 if (macro_mri)
784 if (src + 1 < in->len && in->ptr[src + 1] == '&')
785 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
786 else
787 sb_add_char (out, in->ptr[src++]);
789 else
791 /* FIXME: Why do we do this? */
792 /* At least in alternate mode this seems correct; without this
793 one can't append a literal to a parameter. */
794 src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
797 else if (in->ptr[src] == '\\')
799 src++;
800 if (src < in->len && in->ptr[src] == '(')
802 /* Sub in till the next ')' literally. */
803 src++;
804 while (src < in->len && in->ptr[src] != ')')
806 sb_add_char (out, in->ptr[src++]);
808 if (src < in->len)
809 src++;
810 else if (!macro)
811 err = _("missing `)'");
812 else
813 as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
815 else if (src < in->len && in->ptr[src] == '@')
817 /* Sub in the macro invocation number. */
819 char buffer[10];
820 src++;
821 sprintf (buffer, "%d", macro_number);
822 sb_add_string (out, buffer);
824 else if (src < in->len && in->ptr[src] == '&')
826 /* This is a preprocessor variable name, we don't do them
827 here. */
828 sb_add_char (out, '\\');
829 sb_add_char (out, '&');
830 src++;
832 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
834 int ind;
835 formal_entry *f;
837 if (ISDIGIT (in->ptr[src]))
838 ind = in->ptr[src] - '0';
839 else if (ISUPPER (in->ptr[src]))
840 ind = in->ptr[src] - 'A' + 10;
841 else
842 ind = in->ptr[src] - 'a' + 10;
843 ++src;
844 for (f = formals; f != NULL; f = f->next)
846 if (f->index == ind - 1)
848 if (f->actual.len != 0)
849 sb_add_sb (out, &f->actual);
850 else
851 sb_add_sb (out, &f->def);
852 break;
856 else
858 sb_reset (&t);
859 src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
862 else if ((macro_alternate || macro_mri)
863 && is_name_beginner (in->ptr[src])
864 && (! inquote
865 || ! macro_strip_at
866 || (src > 0 && in->ptr[src - 1] == '@')))
868 if (! macro
869 || src + 5 >= in->len
870 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
871 || ! ISWHITE (in->ptr[src + 5]))
873 sb_reset (&t);
874 src = sub_actual (src, in, &t, formal_hash,
875 (macro_strip_at && inquote) ? '@' : '\'',
876 out, 1);
878 else
880 src = sb_skip_white (src + 5, in);
881 while (in->ptr[src] != '\n')
883 const char *name;
884 formal_entry *f = new_formal ();
886 src = get_token (src, in, &f->name);
887 name = sb_terminate (&f->name);
888 if (! hash_find (formal_hash, name))
890 static int loccnt;
891 char buf[20];
893 f->index = LOCAL_INDEX;
894 f->next = loclist;
895 loclist = f;
897 sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
898 sb_add_string (&f->actual, buf);
900 err = hash_jam (formal_hash, name, f);
901 if (err != NULL)
902 break;
904 else
906 as_bad_where (macro->file,
907 macro->line + macro_line,
908 _("`%s' was already used as parameter (or another local) name"),
909 name);
910 del_formal (f);
913 src = sb_skip_comma (src, in);
917 else if (in->ptr[src] == '"'
918 || (macro_mri && in->ptr[src] == '\''))
920 inquote = !inquote;
921 sb_add_char (out, in->ptr[src++]);
923 else if (in->ptr[src] == '@' && macro_strip_at)
925 ++src;
926 if (src < in->len
927 && in->ptr[src] == '@')
929 sb_add_char (out, '@');
930 ++src;
933 else if (macro_mri
934 && in->ptr[src] == '='
935 && src + 1 < in->len
936 && in->ptr[src + 1] == '=')
938 formal_entry *ptr;
940 sb_reset (&t);
941 src = get_token (src + 2, in, &t);
942 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
943 if (ptr == NULL)
945 /* FIXME: We should really return a warning string here,
946 but we can't, because the == might be in the MRI
947 comment field, and, since the nature of the MRI
948 comment field depends upon the exact instruction
949 being used, we don't have enough information here to
950 figure out whether it is or not. Instead, we leave
951 the == in place, which should cause a syntax error if
952 it is not in a comment. */
953 sb_add_char (out, '=');
954 sb_add_char (out, '=');
955 sb_add_sb (out, &t);
957 else
959 if (ptr->actual.len)
961 sb_add_string (out, "-1");
963 else
965 sb_add_char (out, '0');
969 else
971 if (in->ptr[src] == '\n')
972 ++macro_line;
973 sb_add_char (out, in->ptr[src++]);
977 sb_kill (&t);
979 while (loclist != NULL)
981 formal_entry *f;
982 const char *name;
984 f = loclist->next;
985 name = sb_terminate (&loclist->name);
986 hash_delete (formal_hash, name, f == NULL);
987 del_formal (loclist);
988 loclist = f;
991 return err;
994 /* Assign values to the formal parameters of a macro, and expand the
995 body. */
997 static const char *
998 macro_expand (int idx, sb *in, macro_entry *m, sb *out)
1000 sb t;
1001 formal_entry *ptr;
1002 formal_entry *f;
1003 int is_keyword = 0;
1004 int narg = 0;
1005 const char *err = NULL;
1007 sb_new (&t);
1009 /* Reset any old value the actuals may have. */
1010 for (f = m->formals; f; f = f->next)
1011 sb_reset (&f->actual);
1012 f = m->formals;
1013 while (f != NULL && f->index < 0)
1014 f = f->next;
1016 if (macro_mri)
1018 /* The macro may be called with an optional qualifier, which may
1019 be referred to in the macro body as \0. */
1020 if (idx < in->len && in->ptr[idx] == '.')
1022 /* The Microtec assembler ignores this if followed by a white space.
1023 (Macro invocation with empty extension) */
1024 idx++;
1025 if ( idx < in->len
1026 && in->ptr[idx] != ' '
1027 && in->ptr[idx] != '\t')
1029 formal_entry *n = new_formal ();
1031 n->index = QUAL_INDEX;
1033 n->next = m->formals;
1034 m->formals = n;
1036 idx = get_any_string (idx, in, &n->actual);
1041 /* Peel off the actuals and store them away in the hash tables' actuals. */
1042 idx = sb_skip_white (idx, in);
1043 while (idx < in->len)
1045 int scan;
1047 /* Look and see if it's a positional or keyword arg. */
1048 scan = idx;
1049 while (scan < in->len
1050 && !ISSEP (in->ptr[scan])
1051 && !(macro_mri && in->ptr[scan] == '\'')
1052 && (!macro_alternate && in->ptr[scan] != '='))
1053 scan++;
1054 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
1056 is_keyword = 1;
1058 /* It's OK to go from positional to keyword. */
1060 /* This is a keyword arg, fetch the formal name and
1061 then the actual stuff. */
1062 sb_reset (&t);
1063 idx = get_token (idx, in, &t);
1064 if (in->ptr[idx] != '=')
1066 err = _("confusion in formal parameters");
1067 break;
1070 /* Lookup the formal in the macro's list. */
1071 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1072 if (!ptr)
1073 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1074 t.ptr,
1075 m->name);
1076 else
1078 /* Insert this value into the right place. */
1079 if (ptr->actual.len)
1081 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1082 ptr->name.ptr,
1083 m->name);
1084 sb_reset (&ptr->actual);
1086 idx = get_any_string (idx + 1, in, &ptr->actual);
1087 if (ptr->actual.len > 0)
1088 ++narg;
1091 else
1093 if (is_keyword)
1095 err = _("can't mix positional and keyword arguments");
1096 break;
1099 if (!f)
1101 formal_entry **pf;
1102 int c;
1104 if (!macro_mri)
1106 err = _("too many positional arguments");
1107 break;
1110 f = new_formal ();
1112 c = -1;
1113 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1114 if ((*pf)->index >= c)
1115 c = (*pf)->index + 1;
1116 if (c == -1)
1117 c = 0;
1118 *pf = f;
1119 f->index = c;
1122 if (f->type != FORMAL_VARARG)
1123 idx = get_any_string (idx, in, &f->actual);
1124 else
1126 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1127 idx = in->len;
1129 if (f->actual.len > 0)
1130 ++narg;
1133 f = f->next;
1135 while (f != NULL && f->index < 0);
1138 if (! macro_mri)
1139 idx = sb_skip_comma (idx, in);
1140 else
1142 if (in->ptr[idx] == ',')
1143 ++idx;
1144 if (ISWHITE (in->ptr[idx]))
1145 break;
1149 if (! err)
1151 for (ptr = m->formals; ptr; ptr = ptr->next)
1153 if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1154 as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1155 ptr->name.ptr,
1156 m->name);
1159 if (macro_mri)
1161 char buffer[20];
1163 sb_reset (&t);
1164 sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
1165 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1166 sprintf (buffer, "%d", narg);
1167 sb_add_string (&ptr->actual, buffer);
1170 err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
1173 /* Discard any unnamed formal arguments. */
1174 if (macro_mri)
1176 formal_entry **pf;
1178 pf = &m->formals;
1179 while (*pf != NULL)
1181 if ((*pf)->name.len != 0)
1182 pf = &(*pf)->next;
1183 else
1185 f = (*pf)->next;
1186 del_formal (*pf);
1187 *pf = f;
1192 sb_kill (&t);
1193 if (!err)
1194 macro_number++;
1196 return err;
1199 /* Check for a macro. If one is found, put the expansion into
1200 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
1203 check_macro (const char *line, sb *expand,
1204 const char **error, macro_entry **info)
1206 const char *s;
1207 char *copy, *cs;
1208 macro_entry *macro;
1209 sb line_sb;
1211 if (! is_name_beginner (*line)
1212 && (! macro_mri || *line != '.'))
1213 return 0;
1215 s = line + 1;
1216 while (is_part_of_name (*s))
1217 ++s;
1218 if (is_name_ender (*s))
1219 ++s;
1221 copy = (char *) alloca (s - line + 1);
1222 memcpy (copy, line, s - line);
1223 copy[s - line] = '\0';
1224 for (cs = copy; *cs != '\0'; cs++)
1225 *cs = TOLOWER (*cs);
1227 macro = (macro_entry *) hash_find (macro_hash, copy);
1229 if (macro == NULL)
1230 return 0;
1232 /* Wrap the line up in an sb. */
1233 sb_new (&line_sb);
1234 while (*s != '\0' && *s != '\n' && *s != '\r')
1235 sb_add_char (&line_sb, *s++);
1237 sb_new (expand);
1238 *error = macro_expand (0, &line_sb, macro, expand);
1240 sb_kill (&line_sb);
1242 /* Export the macro information if requested. */
1243 if (info)
1244 *info = macro;
1246 return 1;
1249 /* Delete a macro. */
1251 void
1252 delete_macro (const char *name)
1254 char *copy;
1255 size_t i, len;
1256 macro_entry *macro;
1258 len = strlen (name);
1259 copy = (char *) alloca (len + 1);
1260 for (i = 0; i < len; ++i)
1261 copy[i] = TOLOWER (name[i]);
1262 copy[i] = '\0';
1264 /* We can only ask hash_delete to free memory if we are deleting
1265 macros in reverse order to their definition.
1266 So just clear out the entry. */
1267 if ((macro = (macro_entry *) hash_find (macro_hash, copy)) != NULL)
1269 hash_jam (macro_hash, copy, NULL);
1270 free_macro (macro);
1272 else
1273 as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
1276 /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1277 combined macro definition and execution. This returns NULL on
1278 success, or an error message otherwise. */
1280 const char *
1281 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
1283 sb sub;
1284 formal_entry f;
1285 struct hash_control *h;
1286 const char *err;
1288 idx = sb_skip_white (idx, in);
1290 sb_new (&sub);
1291 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1292 return _("unexpected end of file in irp or irpc");
1294 sb_new (&f.name);
1295 sb_new (&f.def);
1296 sb_new (&f.actual);
1298 idx = get_token (idx, in, &f.name);
1299 if (f.name.len == 0)
1300 return _("missing model parameter");
1302 h = hash_new ();
1303 err = hash_jam (h, sb_terminate (&f.name), &f);
1304 if (err != NULL)
1305 return err;
1307 f.index = 1;
1308 f.next = NULL;
1309 f.type = FORMAL_OPTIONAL;
1311 sb_reset (out);
1313 idx = sb_skip_comma (idx, in);
1314 if (idx >= in->len)
1316 /* Expand once with a null string. */
1317 err = macro_expand_body (&sub, out, &f, h, 0);
1319 else
1321 bfd_boolean in_quotes = FALSE;
1323 if (irpc && in->ptr[idx] == '"')
1325 in_quotes = TRUE;
1326 ++idx;
1329 while (idx < in->len)
1331 if (!irpc)
1332 idx = get_any_string (idx, in, &f.actual);
1333 else
1335 if (in->ptr[idx] == '"')
1337 int nxt;
1339 if (irpc)
1340 in_quotes = ! in_quotes;
1342 nxt = sb_skip_white (idx + 1, in);
1343 if (nxt >= in->len)
1345 idx = nxt;
1346 break;
1349 sb_reset (&f.actual);
1350 sb_add_char (&f.actual, in->ptr[idx]);
1351 ++idx;
1354 err = macro_expand_body (&sub, out, &f, h, 0);
1355 if (err != NULL)
1356 break;
1357 if (!irpc)
1358 idx = sb_skip_comma (idx, in);
1359 else if (! in_quotes)
1360 idx = sb_skip_white (idx, in);
1364 hash_die (h);
1365 sb_kill (&f.actual);
1366 sb_kill (&f.def);
1367 sb_kill (&f.name);
1368 sb_kill (&sub);
1370 return err;