|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* macro.c - macro support for gas and gasp
|
|
|
|
Copyright (C) 1994, 95, 96, 1997 Free Software Foundation, Inc. |
|
|
|
Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc. |
|
|
|
|
|
|
|
Written by Steve and Judy Chamberlain of Cygnus Support, |
|
|
|
sac@cygnus.com |
|
|
|
@ -25,11 +25,13 @@ |
|
|
|
|
|
|
|
/* AIX requires this to be the first thing in the file. */ |
|
|
|
#ifdef __GNUC__ |
|
|
|
# ifndef alloca |
|
|
|
# ifdef __STDC__ |
|
|
|
extern void *alloca (); |
|
|
|
# else |
|
|
|
extern char *alloca (); |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
#else |
|
|
|
# if HAVE_ALLOCA_H |
|
|
|
# include <alloca.h> |
|
|
|
@ -119,7 +121,8 @@ static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int)); |
|
|
|
|
|
|
|
#define ISSEP(x) \ |
|
|
|
((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \ |
|
|
|
|| (x) == '<' || (x) == '>' || (x) == ')' || (x) == '(') |
|
|
|
|| (x) == ')' || (x) == '(' \ |
|
|
|
|| ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>'))) |
|
|
|
|
|
|
|
#define ISBASE(x) \ |
|
|
|
((x) == 'b' || (x) == 'B' \ |
|
|
|
@ -295,12 +298,10 @@ getstring (idx, in, acc) |
|
|
|
|
|
|
|
while (idx < in->len |
|
|
|
&& (in->ptr[idx] == '"' |
|
|
|
|| in->ptr[idx] == '<' |
|
|
|
|| (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) |
|
|
|
|| (in->ptr[idx] == '\'' && macro_alternate))) |
|
|
|
{ |
|
|
|
if (in->ptr[idx] == '<') |
|
|
|
{ |
|
|
|
if (macro_alternate || macro_mri) |
|
|
|
{ |
|
|
|
int nest = 0; |
|
|
|
idx++; |
|
|
|
@ -323,22 +324,6 @@ getstring (idx, in, acc) |
|
|
|
} |
|
|
|
idx++; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
int code; |
|
|
|
idx++; |
|
|
|
idx = ((*macro_expr) |
|
|
|
("character code in string must be absolute expression", |
|
|
|
idx, in, &code)); |
|
|
|
sb_add_char (acc, code); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if (in->ptr[idx] != '>') |
|
|
|
ERROR ((stderr, "Missing > for character code.\n")); |
|
|
|
#endif |
|
|
|
idx++; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'') |
|
|
|
{ |
|
|
|
char tchar = in->ptr[idx]; |
|
|
|
@ -409,7 +394,7 @@ get_any_string (idx, in, out, expand, pretend_quoted) |
|
|
|
sb_add_string (out, buf); |
|
|
|
} |
|
|
|
else if (in->ptr[idx] == '"' |
|
|
|
|| in->ptr[idx] == '<' |
|
|
|
|| (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) |
|
|
|
|| (macro_alternate && in->ptr[idx] == '\'')) |
|
|
|
{ |
|
|
|
if (macro_alternate |
|
|
|
@ -436,7 +421,8 @@ get_any_string (idx, in, out, expand, pretend_quoted) |
|
|
|
|| (in->ptr[idx] != ' ' |
|
|
|
&& in->ptr[idx] != '\t' |
|
|
|
&& in->ptr[idx] != ',' |
|
|
|
&& in->ptr[idx] != '<'))) |
|
|
|
&& (in->ptr[idx] != '<' |
|
|
|
|| (! macro_alternate && ! macro_mri))))) |
|
|
|
{ |
|
|
|
if (in->ptr[idx] == '"' |
|
|
|
|| in->ptr[idx] == '\'') |
|
|
|
@ -655,6 +641,11 @@ sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere) |
|
|
|
sb_add_sb (out, &ptr->def); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (kind == '&') |
|
|
|
{ |
|
|
|
/* Doing this permits people to use & in macro bodies. */ |
|
|
|
sb_add_char (out, '&'); |
|
|
|
} |
|
|
|
else if (copyifnotthere) |
|
|
|
{ |
|
|
|
sb_add_sb (out, t); |
|
|
|
@ -699,8 +690,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
/* FIXME: Why do we do this? It prevents people from
|
|
|
|
using the & operator in a macro. */ |
|
|
|
/* FIXME: Why do we do this? */ |
|
|
|
src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -731,7 +721,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals) |
|
|
|
{ |
|
|
|
/* Sub in the macro invocation number */ |
|
|
|
|
|
|
|
char buffer[6]; |
|
|
|
char buffer[10]; |
|
|
|
src++; |
|
|
|
sprintf (buffer, "%05d", macro_number); |
|
|
|
sb_add_string (out, buffer); |
|
|
|
@ -977,8 +967,8 @@ macro_expand (idx, in, m, out, comment_char) |
|
|
|
if (scan < in->len && !macro_alternate && in->ptr[scan] == '=') |
|
|
|
{ |
|
|
|
is_keyword = 1; |
|
|
|
if (is_positional) |
|
|
|
return "can't mix positional and keyword arguments"; |
|
|
|
|
|
|
|
/* It's OK to go from positional to keyword. */ |
|
|
|
|
|
|
|
/* This is a keyword arg, fetch the formal name and
|
|
|
|
then the actual stuff */ |
|
|
|
|