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,
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)
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
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
37 # ifndef alloca /* predefined by HP cc +Olibcalls */
38 # if !defined (__STDC__) && !defined (__hpux)
39 extern char *alloca ();
41 extern void *alloca ();
42 # endif /* __STDC__, __hpux */
45 # endif /* HAVE_ALLOCA_H */
58 #include "libiberty.h"
59 #include "safe-ctype.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')
87 ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
88 || (x) == ')' || (x) == '(' \
89 || ((macro_alternate || macro_mri) && ((x) == '<' || (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. */
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. */
128 macro_init (int alternate, int mri, int strip_at,
129 int (*expr) (const char *, int, sb *, int *))
131 macro_hash = hash_new ();
133 macro_alternate = alternate;
135 macro_strip_at = strip_at;
139 /* Switch in and out of alternate mode on the fly. */
142 macro_set_alternate (int alternate)
144 macro_alternate = alternate;
147 /* Switch in and out of MRI mode on the fly. */
150 macro_mri_mode (int 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 *))
167 int to_len = strlen (to);
169 int line_start = ptr->len;
171 int more = get_line (ptr);
173 if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
179 from_len = strlen (from);
183 /* Try to find the first pseudo op on the line. */
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]))
200 /* Skip over a label, if any. */
201 if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
204 while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
206 if (i < ptr->len && is_name_ender (ptr->ptr[i]))
208 if (LABELS_WITHOUT_COLONS)
210 /* Skip whitespace. */
211 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
213 /* Check for the colon. */
214 if (i >= ptr->len || ptr->ptr[i] != ':')
223 /* Skip trailing whitespace. */
224 while (i < ptr->len && ISWHITE (ptr->ptr[i]))
227 if (i < ptr->len && (ptr->ptr[i] == '.'
231 if (! flag_m68k_mri && ptr->ptr[i] == '.')
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)
242 ? strncasecmp (ptr->ptr + i, from, 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]))))
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]))))
256 /* Reset the string to not include the ending rune. */
257 ptr->len = line_start;
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. */
273 /* Pick up a token. */
276 get_token (int idx, sb *in, sb *name)
279 && is_name_beginner (in->ptr[idx]))
281 sb_add_char (name, in->ptr[idx++]);
283 && is_part_of_name (in->ptr[idx]))
285 sb_add_char (name, in->ptr[idx++]);
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] == '&')
299 /* Pick up a string. */
302 getstring (int idx, sb *in, sb *acc)
305 && (in->ptr[idx] == '"'
306 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
307 || (in->ptr[idx] == '\'' && macro_alternate)))
309 if (in->ptr[idx] == '<')
313 while ((in->ptr[idx] != '>' || nest)
316 if (in->ptr[idx] == '!')
319 sb_add_char (acc, in->ptr[idx++]);
323 if (in->ptr[idx] == '>')
325 if (in->ptr[idx] == '<')
327 sb_add_char (acc, in->ptr[idx++]);
332 else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
334 char tchar = in->ptr[idx];
339 while (idx < in->len)
341 if (in->ptr[idx - 1] == '\\')
346 if (macro_alternate && in->ptr[idx] == '!')
350 sb_add_char (acc, in->ptr[idx]);
354 else if (escaped && in->ptr[idx] == tchar)
356 sb_add_char (acc, tchar);
361 if (in->ptr[idx] == tchar)
365 if (idx >= in->len || in->ptr[idx] != tchar)
369 sb_add_char (acc, in->ptr[idx]);
379 /* Fetch string from the input stream,
381 'Bxyx<whitespace> -> return 'Bxyza
382 %<expr> -> return string of decimal value of <expr>
383 "string" -> return string
384 (string) -> return (string-including-whitespaces)
385 xyx<whitespace> -> return xyz. */
388 get_any_string (int idx, sb *in, sb *out)
391 idx = sb_skip_white (idx, in);
395 if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
397 while (!ISSEP (in->ptr[idx]))
398 sb_add_char (out, in->ptr[idx++]);
400 else if (in->ptr[idx] == '%' && macro_alternate)
405 /* Turns the next expression into a string. */
406 /* xgettext: no-c-format */
407 idx = (*macro_expr) (_("% operator needs absolute expression"),
411 sprintf (buf, "%d", val);
412 sb_add_string (out, buf);
414 else if (in->ptr[idx] == '"'
415 || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
416 || (macro_alternate && in->ptr[idx] == '\''))
418 if (macro_alternate && ! macro_strip_at)
420 /* Keep the quotes. */
421 sb_add_char (out, '\"');
423 idx = getstring (idx, in, out);
424 sb_add_char (out, '\"');
428 idx = getstring (idx, in, out);
433 char *br_buf = xmalloc(1);
434 char *in_br = br_buf;
439 || (in->ptr[idx] != ' '
440 && in->ptr[idx] != '\t'))
441 && in->ptr[idx] != ','
442 && (in->ptr[idx] != '<'
443 || (! macro_alternate && ! macro_mri)))
445 char tchar = in->ptr[idx];
451 sb_add_char (out, in->ptr[idx++]);
453 && in->ptr[idx] != tchar)
454 sb_add_char (out, in->ptr[idx++]);
464 br_buf = xmalloc(strlen(in_br) + 2);
465 strcpy(br_buf + 1, in_br);
480 sb_add_char (out, tchar);
490 /* Allocate a new formal. */
492 static formal_entry *
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);
503 formal->type = FORMAL_OPTIONAL;
510 del_formal (formal_entry *formal)
512 sb_kill (&formal->actual);
513 sb_kill (&formal->def);
514 sb_kill (&formal->name);
518 /* Pick up the formal parameters of a macro definition. */
521 do_formals (macro_entry *macro, int idx, sb *in)
523 formal_entry **p = ¯o->formals;
526 idx = sb_skip_white (idx, in);
527 while (idx < in->len)
529 formal_entry *formal = new_formal ();
532 idx = get_token (idx, in, &formal->name);
533 if (formal->name.len == 0)
535 if (macro->formal_count)
539 idx = sb_skip_white (idx, in);
540 /* This is a formal. */
541 name = sb_terminate (&formal->name);
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. */
553 idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
554 sb_terminate (&qual);
556 as_bad_where (macro->file,
558 _("Missing parameter qualifier for `%s' in macro `%s'"),
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;
566 as_bad_where (macro->file,
568 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
573 idx = sb_skip_white (idx, in);
575 if (idx < in->len && in->ptr[idx] == '=')
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,
585 _("Pointless default value for required parameter `%s' in macro `%s'"),
591 /* Add to macro's hash table. */
592 if (! hash_find (macro->formal_hash, name))
593 hash_jam (macro->formal_hash, name, formal);
595 as_bad_where (macro->file,
597 _("A parameter named `%s' already exists for macro `%s'"),
601 formal->index = macro->formal_count++;
604 if (formal->type == FORMAL_VARARG)
607 idx = sb_skip_comma (idx, in);
608 if (idx != cidx && idx >= in->len)
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. */
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,
634 _("Reserved word `%s' used as parameter in macro `%s'"),
637 hash_jam (macro->formal_hash, name, formal);
639 formal->index = NARG_INDEX;
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. */
651 define_macro (int idx, sb *in, sb *label,
652 int (*get_line) (sb *),
653 char *file, unsigned int line,
658 const char *error = NULL;
660 macro = (macro_entry *) xmalloc (sizeof (macro_entry));
661 sb_new (¯o->sub);
666 macro->formal_count = 0;
668 macro->formal_hash = hash_new ();
670 idx = sb_skip_white (idx, in);
671 if (! buffer_and_nest ("MACRO", "ENDM", ¯o->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);
684 error = _("missing `)' after formals in macro definition `%s'");
688 /* It's the label: MACRO formals,... sort */
689 idx = do_formals (macro, idx, in);
696 idx = get_token (idx, in, &name);
697 macro->name = sb_terminate (&name);
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);
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");
716 error = hash_jam (macro_hash, macro->name, (PTR) macro);
719 *namep = macro->name;
729 /* Scan a token, and then skip KIND. */
732 get_apost_token (int idx, sb *in, sb *name, int kind)
734 idx = get_token (idx, in, name);
736 && in->ptr[idx] == kind
737 && (! macro_mri || macro_strip_at)
738 && (! macro_strip_at || kind == '@'))
743 /* Substitute the actual value for a formal parameter. */
746 sub_actual (int start, sb *in, sb *t, struct hash_control *formal_hash,
747 int kind, sb *out, int copyifnotthere)
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 '@'. */
757 && (src == start || in->ptr[src - 1] != '@'))
760 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
765 sb_add_sb (out, &ptr->actual);
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, '&');
778 else if (copyifnotthere)
784 sb_add_char (out, '\\');
790 /* Expand the body of a macro. */
793 macro_expand_body (sb *in, sb *out, formal_entry *formals,
794 struct hash_control *formal_hash, const macro_entry *macro)
797 int src = 0, inquote = 0, macro_line = 0;
798 formal_entry *loclist = NULL;
799 const char *err = NULL;
803 while (src < in->len && !err)
805 if (in->ptr[src] == '&')
810 if (src + 1 < in->len && in->ptr[src + 1] == '&')
811 src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
813 sb_add_char (out, in->ptr[src++]);
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] == '\\')
826 if (src < in->len && in->ptr[src] == '(')
828 /* Sub in till the next ')' literally. */
830 while (src < in->len && in->ptr[src] != ')')
832 sb_add_char (out, in->ptr[src++]);
837 err = _("missing `)'");
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. */
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
854 sb_add_char (out, '\\');
855 sb_add_char (out, '&');
858 else if (macro_mri && src < in->len && ISALNUM (in->ptr[src]))
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;
868 ind = in->ptr[src] - 'a' + 10;
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);
877 sb_add_sb (out, &f->def);
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])
892 || (src > 0 && in->ptr[src - 1] == '@')))
895 || src + 5 >= in->len
896 || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
897 || ! ISWHITE (in->ptr[src + 5]))
900 src = sub_actual (src, in, &t, formal_hash,
901 (macro_strip_at && inquote) ? '@' : '\'',
906 src = sb_skip_white (src + 5, in);
907 while (in->ptr[src] != '\n')
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))
919 f->index = LOCAL_INDEX;
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);
932 as_bad_where (macro->file,
933 macro->line + macro_line,
934 _("`%s' was already used as parameter (or another local) name"),
939 src = sb_skip_comma (src, in);
943 else if (in->ptr[src] == '"'
944 || (macro_mri && in->ptr[src] == '\''))
947 sb_add_char (out, in->ptr[src++]);
949 else if (in->ptr[src] == '@' && macro_strip_at)
953 && in->ptr[src] == '@')
955 sb_add_char (out, '@');
960 && in->ptr[src] == '='
962 && in->ptr[src + 1] == '=')
967 src = get_token (src + 2, in, &t);
968 ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (&t));
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, '=');
987 sb_add_string (out, "-1");
991 sb_add_char (out, '0');
997 if (in->ptr[src] == '\n')
999 sb_add_char (out, in->ptr[src++]);
1005 while (loclist != NULL)
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);
1020 /* Assign values to the formal parameters of a macro, and expand the
1024 macro_expand (int idx, sb *in, macro_entry *m, sb *out)
1029 int is_positional = 0;
1032 const char *err = NULL;
1036 /* Reset any old value the actuals may have. */
1037 for (f = m->formals; f; f = f->next)
1038 sb_reset (&f->actual);
1040 while (f != NULL && f->index < 0)
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) */
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;
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)
1074 /* Look and see if it's a positional or keyword arg. */
1076 while (scan < in->len
1077 && !ISSEP (in->ptr[scan])
1078 && !(macro_mri && in->ptr[scan] == '\'')
1079 && (!macro_alternate && in->ptr[scan] != '='))
1081 if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
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. */
1090 idx = get_token (idx, in, &t);
1091 if (in->ptr[idx] != '=')
1093 err = _("confusion in formal parameters");
1097 /* Lookup the formal in the macro's list. */
1098 ptr = (formal_entry *) hash_find (m->formal_hash, sb_terminate (&t));
1100 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
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"),
1111 sb_reset (&ptr->actual);
1113 idx = get_any_string (idx + 1, in, &ptr->actual);
1114 if (ptr->actual.len > 0)
1120 /* This is a positional arg. */
1124 err = _("can't mix positional and keyword arguments");
1135 err = _("too many positional arguments");
1142 for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1143 if ((*pf)->index >= c)
1144 c = (*pf)->index + 1;
1151 if (f->type != FORMAL_VARARG)
1152 idx = get_any_string (idx, in, &f->actual);
1155 sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1158 if (f->actual.len > 0)
1164 while (f != NULL && f->index < 0);
1168 idx = sb_skip_comma (idx, in);
1171 if (in->ptr[idx] == ',')
1173 if (ISWHITE (in->ptr[idx]))
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'"),
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. */
1210 if ((*pf)->name.len != 0)
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)
1240 if (! is_name_beginner (*line)
1241 && (! macro_mri || *line != '.'))
1245 while (is_part_of_name (*s))
1247 if (is_name_ender (*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);
1261 /* Wrap the line up in an sb. */
1263 while (*s != '\0' && *s != '\n' && *s != '\r')
1264 sb_add_char (&line_sb, *s++);
1267 *error = macro_expand (0, &line_sb, macro, expand);
1271 /* Export the macro information if requested. */
1278 /* Free the memory allocated to a macro. */
1281 free_macro(macro_entry *macro)
1283 formal_entry *formal;
1285 for (formal = macro->formals; formal; )
1290 formal = formal->next;
1293 hash_die (macro->formal_hash);
1294 sb_kill (¯o->sub);
1298 /* Delete a macro. */
1301 delete_macro (const char *name)
1307 len = strlen (name);
1308 copy = (char *) alloca (len + 1);
1309 for (i = 0; i < len; ++i)
1310 copy[i] = TOLOWER (name[i]);
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);
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. */
1328 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
1332 struct hash_control *h;
1335 idx = sb_skip_white (idx, in);
1338 if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1339 return _("unexpected end of file in irp or irpc");
1345 idx = get_token (idx, in, &f.name);
1346 if (f.name.len == 0)
1347 return _("missing model parameter");
1350 err = hash_jam (h, sb_terminate (&f.name), &f);
1356 f.type = FORMAL_OPTIONAL;
1360 idx = sb_skip_comma (idx, in);
1363 /* Expand once with a null string. */
1364 err = macro_expand_body (&sub, out, &f, h, 0);
1368 if (irpc && in->ptr[idx] == '"')
1370 while (idx < in->len)
1373 idx = get_any_string (idx, in, &f.actual);
1376 if (in->ptr[idx] == '"')
1380 nxt = sb_skip_white (idx + 1, in);
1387 sb_reset (&f.actual);
1388 sb_add_char (&f.actual, in->ptr[idx]);
1391 err = macro_expand_body (&sub, out, &f, h, 0);
1395 idx = sb_skip_comma (idx, in);
1397 idx = sb_skip_white (idx, in);
1402 sb_kill (&f.actual);