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 and find the first pseudo op on the line. */
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
193 if (! LABELS_WITHOUT_COLONS
)
195 /* Skip leading whitespace. */
196 while (i
< ptr
->len
&& ISWHITE (ptr
->ptr
[i
]))
202 /* Skip over a label, if any. */
203 if (i
>= ptr
->len
|| ! is_name_beginner (ptr
->ptr
[i
]))
206 while (i
< ptr
->len
&& is_part_of_name (ptr
->ptr
[i
]))
208 if (i
< ptr
->len
&& is_name_ender (ptr
->ptr
[i
]))
210 if (LABELS_WITHOUT_COLONS
)
212 /* Skip whitespace. */
213 while (i
< ptr
->len
&& ISWHITE (ptr
->ptr
[i
]))
215 /* Check for the colon. */
216 if (i
>= ptr
->len
|| ptr
->ptr
[i
] != ':')
226 /* Skip trailing whitespace. */
227 while (i
< ptr
->len
&& ISWHITE (ptr
->ptr
[i
]))
230 if (i
< ptr
->len
&& (ptr
->ptr
[i
] == '.'
234 if (! flag_m68k_mri
&& ptr
->ptr
[i
] == '.')
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)
245 ? strncasecmp (ptr
->ptr
+ i
, from
, 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
]))))
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
]))))
259 /* Reset the string to not include the ending rune. */
260 ptr
->len
= line_start
;
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. */
276 /* Pick up a token. */
279 get_token (int idx
, sb
*in
, sb
*name
)
282 && is_name_beginner (in
->ptr
[idx
]))
284 sb_add_char (name
, in
->ptr
[idx
++]);
286 && is_part_of_name (in
->ptr
[idx
]))
288 sb_add_char (name
, in
->ptr
[idx
++]);
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
] == '&')
302 /* Pick up a string. */
305 getstring (int idx
, sb
*in
, sb
*acc
)
308 && (in
->ptr
[idx
] == '"'
309 || (in
->ptr
[idx
] == '<' && (macro_alternate
|| macro_mri
))
310 || (in
->ptr
[idx
] == '\'' && macro_alternate
)))
312 if (in
->ptr
[idx
] == '<')
316 while ((in
->ptr
[idx
] != '>' || nest
)
319 if (in
->ptr
[idx
] == '!')
322 sb_add_char (acc
, in
->ptr
[idx
++]);
326 if (in
->ptr
[idx
] == '>')
328 if (in
->ptr
[idx
] == '<')
330 sb_add_char (acc
, in
->ptr
[idx
++]);
335 else if (in
->ptr
[idx
] == '"' || in
->ptr
[idx
] == '\'')
337 char tchar
= in
->ptr
[idx
];
342 while (idx
< in
->len
)
344 if (in
->ptr
[idx
- 1] == '\\')
349 if (macro_alternate
&& in
->ptr
[idx
] == '!')
353 sb_add_char (acc
, in
->ptr
[idx
]);
357 else if (escaped
&& in
->ptr
[idx
] == tchar
)
359 sb_add_char (acc
, tchar
);
364 if (in
->ptr
[idx
] == tchar
)
368 if (idx
>= in
->len
|| in
->ptr
[idx
] != tchar
)
372 sb_add_char (acc
, in
->ptr
[idx
]);
382 /* Fetch string from the input stream,
384 'Bxyx<whitespace> -> return 'Bxyza
385 %<char> -> return string of decimal value of x
386 "<string>" -> return string
387 xyx<whitespace> -> return xyz
391 get_any_string (int idx
, sb
*in
, sb
*out
)
394 idx
= sb_skip_white (idx
, in
);
398 if (in
->len
> idx
+ 2 && in
->ptr
[idx
+ 1] == '\'' && ISBASE (in
->ptr
[idx
]))
400 while (!ISSEP (in
->ptr
[idx
]))
401 sb_add_char (out
, in
->ptr
[idx
++]);
403 else if (in
->ptr
[idx
] == '%' && macro_alternate
)
407 /* Turns the next expression into a string. */
408 /* xgettext: no-c-format */
409 idx
= (*macro_expr
) (_("% operator needs absolute expression"),
413 sprintf (buf
, "%d", val
);
414 sb_add_string (out
, buf
);
416 else if (in
->ptr
[idx
] == '"'
417 || (in
->ptr
[idx
] == '<' && (macro_alternate
|| macro_mri
))
418 || (macro_alternate
&& in
->ptr
[idx
] == '\''))
420 if (macro_alternate
&& ! macro_strip_at
)
422 /* Keep the quotes. */
423 sb_add_char (out
, '\"');
425 idx
= getstring (idx
, in
, out
);
426 sb_add_char (out
, '\"');
430 idx
= getstring (idx
, in
, out
);
436 && in
->ptr
[idx
] != ' '
437 && in
->ptr
[idx
] != '\t'
438 && in
->ptr
[idx
] != ','
439 && (in
->ptr
[idx
] != '<'
440 || (! macro_alternate
&& ! macro_mri
)))
442 if (in
->ptr
[idx
] == '"'
443 || in
->ptr
[idx
] == '\'')
445 char tchar
= in
->ptr
[idx
];
446 sb_add_char (out
, in
->ptr
[idx
++]);
448 && in
->ptr
[idx
] != tchar
)
449 sb_add_char (out
, in
->ptr
[idx
++]);
453 sb_add_char (out
, in
->ptr
[idx
++]);
461 /* Allocate a new formal. */
463 static formal_entry
*
466 formal_entry
*formal
;
468 formal
= xmalloc (sizeof (formal_entry
));
470 sb_new (&formal
->name
);
471 sb_new (&formal
->def
);
472 sb_new (&formal
->actual
);
474 formal
->type
= FORMAL_OPTIONAL
;
481 del_formal (formal_entry
*formal
)
483 sb_kill (&formal
->actual
);
484 sb_kill (&formal
->def
);
485 sb_kill (&formal
->name
);
489 /* Pick up the formal parameters of a macro definition. */
492 do_formals (macro_entry
*macro
, int idx
, sb
*in
)
494 formal_entry
**p
= ¯o
->formals
;
497 idx
= sb_skip_white (idx
, in
);
498 while (idx
< in
->len
)
500 formal_entry
*formal
= new_formal ();
503 idx
= get_token (idx
, in
, &formal
->name
);
504 if (formal
->name
.len
== 0)
506 if (macro
->formal_count
)
510 idx
= sb_skip_white (idx
, in
);
511 /* This is a formal. */
512 name
= sb_terminate (&formal
->name
);
515 && in
->ptr
[idx
] == ':'
516 && (! is_name_beginner (':')
517 || idx
+ 1 >= in
->len
518 || ! is_part_of_name (in
->ptr
[idx
+ 1])))
520 /* Got a qualifier. */
524 idx
= get_token (sb_skip_white (idx
+ 1, in
), in
, &qual
);
525 sb_terminate (&qual
);
527 as_bad_where (macro
->file
,
529 _("Missing parameter qualifier for `%s' in macro `%s'"),
532 else if (strcmp (qual
.ptr
, "req") == 0)
533 formal
->type
= FORMAL_REQUIRED
;
534 else if (strcmp (qual
.ptr
, "vararg") == 0)
535 formal
->type
= FORMAL_VARARG
;
537 as_bad_where (macro
->file
,
539 _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
544 idx
= sb_skip_white (idx
, in
);
546 if (idx
< in
->len
&& in
->ptr
[idx
] == '=')
549 idx
= get_any_string (idx
+ 1, in
, &formal
->def
);
550 idx
= sb_skip_white (idx
, in
);
551 if (formal
->type
== FORMAL_REQUIRED
)
553 sb_reset (&formal
->def
);
554 as_warn_where (macro
->file
,
556 _("Pointless default value for required parameter `%s' in macro `%s'"),
562 /* Add to macro's hash table. */
563 if (! hash_find (macro
->formal_hash
, name
))
564 hash_jam (macro
->formal_hash
, name
, formal
);
566 as_bad_where (macro
->file
,
568 _("A parameter named `%s' already exists for macro `%s'"),
572 formal
->index
= macro
->formal_count
++;
575 if (formal
->type
== FORMAL_VARARG
)
578 idx
= sb_skip_comma (idx
, in
);
579 if (idx
!= cidx
&& idx
>= in
->len
)
588 formal_entry
*formal
= new_formal ();
590 /* Add a special NARG formal, which macro_expand will set to the
591 number of arguments. */
592 /* The same MRI assemblers which treat '@' characters also use
593 the name $NARG. At least until we find an exception. */
599 sb_add_string (&formal
->name
, name
);
601 /* Add to macro's hash table. */
602 if (hash_find (macro
->formal_hash
, name
))
603 as_bad_where (macro
->file
,
605 _("Reserved word `%s' used as parameter in macro `%s'"),
608 hash_jam (macro
->formal_hash
, name
, formal
);
610 formal
->index
= NARG_INDEX
;
617 /* Define a new macro. Returns NULL on success, otherwise returns an
618 error message. If NAMEP is not NULL, *NAMEP is set to the name of
619 the macro which was defined. */
622 define_macro (int idx
, sb
*in
, sb
*label
,
623 int (*get_line
) (sb
*),
624 char *file
, unsigned int line
,
629 const char *error
= NULL
;
631 macro
= (macro_entry
*) xmalloc (sizeof (macro_entry
));
632 sb_new (¯o
->sub
);
637 macro
->formal_count
= 0;
639 macro
->formal_hash
= hash_new ();
641 idx
= sb_skip_white (idx
, in
);
642 if (! buffer_and_nest ("MACRO", "ENDM", ¯o
->sub
, get_line
))
643 error
= _("unexpected end of file in macro `%s' definition");
644 if (label
!= NULL
&& label
->len
!= 0)
646 sb_add_sb (&name
, label
);
647 macro
->name
= sb_terminate (&name
);
648 if (idx
< in
->len
&& in
->ptr
[idx
] == '(')
650 /* It's the label: MACRO (formals,...) sort */
651 idx
= do_formals (macro
, idx
+ 1, in
);
652 if (idx
< in
->len
&& in
->ptr
[idx
] == ')')
653 idx
= sb_skip_white (idx
+ 1, in
);
655 error
= _("missing `)' after formals in macro definition `%s'");
659 /* It's the label: MACRO formals,... sort */
660 idx
= do_formals (macro
, idx
, in
);
667 idx
= get_token (idx
, in
, &name
);
668 macro
->name
= sb_terminate (&name
);
670 error
= _("Missing macro name");
671 cidx
= sb_skip_white (idx
, in
);
672 idx
= sb_skip_comma (cidx
, in
);
673 if (idx
== cidx
|| idx
< in
->len
)
674 idx
= do_formals (macro
, idx
, in
);
678 if (!error
&& idx
< in
->len
)
679 error
= _("Bad parameter list for macro `%s'");
681 /* And stick it in the macro hash table. */
682 for (idx
= 0; idx
< name
.len
; idx
++)
683 name
.ptr
[idx
] = TOLOWER (name
.ptr
[idx
]);
684 if (hash_find (macro_hash
, macro
->name
))
685 error
= _("Macro `%s' was already defined");
687 error
= hash_jam (macro_hash
, macro
->name
, (PTR
) macro
);
690 *namep
= macro
->name
;
700 /* Scan a token, and then skip KIND. */
703 get_apost_token (int idx
, sb
*in
, sb
*name
, int kind
)
705 idx
= get_token (idx
, in
, name
);
707 && in
->ptr
[idx
] == kind
708 && (! macro_mri
|| macro_strip_at
)
709 && (! macro_strip_at
|| kind
== '@'))
714 /* Substitute the actual value for a formal parameter. */
717 sub_actual (int start
, sb
*in
, sb
*t
, struct hash_control
*formal_hash
,
718 int kind
, sb
*out
, int copyifnotthere
)
723 src
= get_apost_token (start
, in
, t
, kind
);
724 /* See if it's in the macro's hash table, unless this is
725 macro_strip_at and kind is '@' and the token did not end in '@'. */
728 && (src
== start
|| in
->ptr
[src
- 1] != '@'))
731 ptr
= (formal_entry
*) hash_find (formal_hash
, sb_terminate (t
));
736 sb_add_sb (out
, &ptr
->actual
);
740 sb_add_sb (out
, &ptr
->def
);
743 else if (kind
== '&')
745 /* Doing this permits people to use & in macro bodies. */
746 sb_add_char (out
, '&');
749 else if (copyifnotthere
)
755 sb_add_char (out
, '\\');
761 /* Expand the body of a macro. */
764 macro_expand_body (sb
*in
, sb
*out
, formal_entry
*formals
,
765 struct hash_control
*formal_hash
, const macro_entry
*macro
)
768 int src
= 0, inquote
= 0, macro_line
= 0;
769 formal_entry
*loclist
= NULL
;
770 const char *err
= NULL
;
774 while (src
< in
->len
&& !err
)
776 if (in
->ptr
[src
] == '&')
781 if (src
+ 1 < in
->len
&& in
->ptr
[src
+ 1] == '&')
782 src
= sub_actual (src
+ 2, in
, &t
, formal_hash
, '\'', out
, 1);
784 sb_add_char (out
, in
->ptr
[src
++]);
788 /* FIXME: Why do we do this? */
789 /* At least in alternate mode this seems correct; without this
790 one can't append a literal to a parameter. */
791 src
= sub_actual (src
+ 1, in
, &t
, formal_hash
, '&', out
, 0);
794 else if (in
->ptr
[src
] == '\\')
797 if (src
< in
->len
&& in
->ptr
[src
] == '(')
799 /* Sub in till the next ')' literally. */
801 while (src
< in
->len
&& in
->ptr
[src
] != ')')
803 sb_add_char (out
, in
->ptr
[src
++]);
808 err
= _("missing `)'");
810 as_bad_where (macro
->file
, macro
->line
+ macro_line
, _("missing `)'"));
812 else if (src
< in
->len
&& in
->ptr
[src
] == '@')
814 /* Sub in the macro invocation number. */
818 sprintf (buffer
, "%d", macro_number
);
819 sb_add_string (out
, buffer
);
821 else if (src
< in
->len
&& in
->ptr
[src
] == '&')
823 /* This is a preprocessor variable name, we don't do them
825 sb_add_char (out
, '\\');
826 sb_add_char (out
, '&');
829 else if (macro_mri
&& src
< in
->len
&& ISALNUM (in
->ptr
[src
]))
834 if (ISDIGIT (in
->ptr
[src
]))
835 ind
= in
->ptr
[src
] - '0';
836 else if (ISUPPER (in
->ptr
[src
]))
837 ind
= in
->ptr
[src
] - 'A' + 10;
839 ind
= in
->ptr
[src
] - 'a' + 10;
841 for (f
= formals
; f
!= NULL
; f
= f
->next
)
843 if (f
->index
== ind
- 1)
845 if (f
->actual
.len
!= 0)
846 sb_add_sb (out
, &f
->actual
);
848 sb_add_sb (out
, &f
->def
);
856 src
= sub_actual (src
, in
, &t
, formal_hash
, '\'', out
, 0);
859 else if ((macro_alternate
|| macro_mri
)
860 && is_name_beginner (in
->ptr
[src
])
863 || (src
> 0 && in
->ptr
[src
- 1] == '@')))
866 || src
+ 5 >= in
->len
867 || strncasecmp (in
->ptr
+ src
, "LOCAL", 5) != 0
868 || ! ISWHITE (in
->ptr
[src
+ 5]))
871 src
= sub_actual (src
, in
, &t
, formal_hash
,
872 (macro_strip_at
&& inquote
) ? '@' : '\'',
877 src
= sb_skip_white (src
+ 5, in
);
878 while (in
->ptr
[src
] != '\n')
881 formal_entry
*f
= new_formal ();
883 src
= get_token (src
, in
, &f
->name
);
884 name
= sb_terminate (&f
->name
);
885 if (! hash_find (formal_hash
, name
))
890 f
->index
= LOCAL_INDEX
;
894 sprintf (buf
, IS_ELF
? ".LL%04x" : "LL%04x", ++loccnt
);
895 sb_add_string (&f
->actual
, buf
);
897 err
= hash_jam (formal_hash
, name
, f
);
903 as_bad_where (macro
->file
,
904 macro
->line
+ macro_line
,
905 _("`%s' was already used as parameter (or another local) name"),
910 src
= sb_skip_comma (src
, in
);
914 else if (in
->ptr
[src
] == '"'
915 || (macro_mri
&& in
->ptr
[src
] == '\''))
918 sb_add_char (out
, in
->ptr
[src
++]);
920 else if (in
->ptr
[src
] == '@' && macro_strip_at
)
924 && in
->ptr
[src
] == '@')
926 sb_add_char (out
, '@');
931 && in
->ptr
[src
] == '='
933 && in
->ptr
[src
+ 1] == '=')
938 src
= get_token (src
+ 2, in
, &t
);
939 ptr
= (formal_entry
*) hash_find (formal_hash
, sb_terminate (&t
));
942 /* FIXME: We should really return a warning string here,
943 but we can't, because the == might be in the MRI
944 comment field, and, since the nature of the MRI
945 comment field depends upon the exact instruction
946 being used, we don't have enough information here to
947 figure out whether it is or not. Instead, we leave
948 the == in place, which should cause a syntax error if
949 it is not in a comment. */
950 sb_add_char (out
, '=');
951 sb_add_char (out
, '=');
958 sb_add_string (out
, "-1");
962 sb_add_char (out
, '0');
968 if (in
->ptr
[src
] == '\n')
970 sb_add_char (out
, in
->ptr
[src
++]);
976 while (loclist
!= NULL
)
981 /* Setting the value to NULL effectively deletes the entry. We
982 avoid calling hash_delete because it doesn't reclaim memory. */
983 hash_jam (formal_hash
, sb_terminate (&loclist
->name
), NULL
);
984 del_formal (loclist
);
991 /* Assign values to the formal parameters of a macro, and expand the
995 macro_expand (int idx
, sb
*in
, macro_entry
*m
, sb
*out
)
1000 int is_positional
= 0;
1003 const char *err
= NULL
;
1007 /* Reset any old value the actuals may have. */
1008 for (f
= m
->formals
; f
; f
= f
->next
)
1009 sb_reset (&f
->actual
);
1011 while (f
!= NULL
&& f
->index
< 0)
1016 /* The macro may be called with an optional qualifier, which may
1017 be referred to in the macro body as \0. */
1018 if (idx
< in
->len
&& in
->ptr
[idx
] == '.')
1020 /* The Microtec assembler ignores this if followed by a white space.
1021 (Macro invocation with empty extension) */
1024 && in
->ptr
[idx
] != ' '
1025 && in
->ptr
[idx
] != '\t')
1027 formal_entry
*n
= new_formal ();
1029 n
->index
= QUAL_INDEX
;
1031 n
->next
= m
->formals
;
1034 idx
= get_any_string (idx
, in
, &n
->actual
);
1039 /* Peel off the actuals and store them away in the hash tables' actuals. */
1040 idx
= sb_skip_white (idx
, in
);
1041 while (idx
< in
->len
)
1045 /* Look and see if it's a positional or keyword arg. */
1047 while (scan
< in
->len
1048 && !ISSEP (in
->ptr
[scan
])
1049 && !(macro_mri
&& in
->ptr
[scan
] == '\'')
1050 && (!macro_alternate
&& in
->ptr
[scan
] != '='))
1052 if (scan
< in
->len
&& !macro_alternate
&& in
->ptr
[scan
] == '=')
1056 /* It's OK to go from positional to keyword. */
1058 /* This is a keyword arg, fetch the formal name and
1059 then the actual stuff. */
1061 idx
= get_token (idx
, in
, &t
);
1062 if (in
->ptr
[idx
] != '=')
1064 err
= _("confusion in formal parameters");
1068 /* Lookup the formal in the macro's list. */
1069 ptr
= (formal_entry
*) hash_find (m
->formal_hash
, sb_terminate (&t
));
1071 as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1076 /* Insert this value into the right place. */
1077 if (ptr
->actual
.len
)
1079 as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1082 sb_reset (&ptr
->actual
);
1084 idx
= get_any_string (idx
+ 1, in
, &ptr
->actual
);
1085 if (ptr
->actual
.len
> 0)
1091 /* This is a positional arg. */
1095 err
= _("can't mix positional and keyword arguments");
1106 err
= _("too many positional arguments");
1113 for (pf
= &m
->formals
; *pf
!= NULL
; pf
= &(*pf
)->next
)
1114 if ((*pf
)->index
>= c
)
1115 c
= (*pf
)->index
+ 1;
1122 if (f
->type
!= FORMAL_VARARG
)
1123 idx
= get_any_string (idx
, in
, &f
->actual
);
1126 sb_add_buffer (&f
->actual
, in
->ptr
+ idx
, in
->len
- idx
);
1129 if (f
->actual
.len
> 0)
1135 while (f
!= NULL
&& f
->index
< 0);
1139 idx
= sb_skip_comma (idx
, in
);
1142 if (in
->ptr
[idx
] == ',')
1144 if (ISWHITE (in
->ptr
[idx
]))
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'"),
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. */
1181 if ((*pf
)->name
.len
!= 0)
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
)
1211 if (! is_name_beginner (*line
)
1212 && (! macro_mri
|| *line
!= '.'))
1216 while (is_part_of_name (*s
))
1218 if (is_name_ender (*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
);
1232 /* Wrap the line up in an sb. */
1234 while (*s
!= '\0' && *s
!= '\n' && *s
!= '\r')
1235 sb_add_char (&line_sb
, *s
++);
1238 *error
= macro_expand (0, &line_sb
, macro
, expand
);
1242 /* Export the macro information if requested. */
1249 /* Free the memory allocated to a macro. */
1252 free_macro(macro_entry
*macro
)
1254 formal_entry
*formal
;
1256 for (formal
= macro
->formals
; formal
; )
1261 formal
= formal
->next
;
1264 hash_die (macro
->formal_hash
);
1265 sb_kill (¯o
->sub
);
1269 /* Delete a macro. */
1272 delete_macro (const char *name
)
1278 len
= strlen (name
);
1279 copy
= (char *) alloca (len
+ 1);
1280 for (i
= 0; i
< len
; ++i
)
1281 copy
[i
] = TOLOWER (name
[i
]);
1284 /* Since hash_delete doesn't free memory, just clear out the entry. */
1285 if ((macro
= hash_find (macro_hash
, copy
)) != NULL
)
1287 hash_jam (macro_hash
, copy
, NULL
);
1291 as_warn (_("Attempt to purge non-existant macro `%s'"), copy
);
1294 /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a
1295 combined macro definition and execution. This returns NULL on
1296 success, or an error message otherwise. */
1299 expand_irp (int irpc
, int idx
, sb
*in
, sb
*out
, int (*get_line
) (sb
*))
1303 struct hash_control
*h
;
1306 idx
= sb_skip_white (idx
, in
);
1309 if (! buffer_and_nest (NULL
, "ENDR", &sub
, get_line
))
1310 return _("unexpected end of file in irp or irpc");
1316 idx
= get_token (idx
, in
, &f
.name
);
1317 if (f
.name
.len
== 0)
1318 return _("missing model parameter");
1321 err
= hash_jam (h
, sb_terminate (&f
.name
), &f
);
1327 f
.type
= FORMAL_OPTIONAL
;
1331 idx
= sb_skip_comma (idx
, in
);
1334 /* Expand once with a null string. */
1335 err
= macro_expand_body (&sub
, out
, &f
, h
, 0);
1339 if (irpc
&& in
->ptr
[idx
] == '"')
1341 while (idx
< in
->len
)
1344 idx
= get_any_string (idx
, in
, &f
.actual
);
1347 if (in
->ptr
[idx
] == '"')
1351 nxt
= sb_skip_white (idx
+ 1, in
);
1358 sb_reset (&f
.actual
);
1359 sb_add_char (&f
.actual
, in
->ptr
[idx
]);
1362 err
= macro_expand_body (&sub
, out
, &f
, h
, 0);
1366 idx
= sb_skip_comma (idx
, in
);
1368 idx
= sb_skip_white (idx
, in
);
1373 sb_kill (&f
.actual
);