diff options
author | Ian Lance Taylor <ian@airs.com> | 1998-03-25 18:12:52 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1998-03-25 18:12:52 +0000 |
commit | 36abac7fd314a3f73177880e0e2075802671e4bb (patch) | |
tree | 86939a743ee5140fb0404cc522a23ef892f91249 /gas/macro.c | |
parent | ee09ab7f8904ab286d37a9aec53ab56a828f7227 (diff) | |
download | gdb-36abac7fd314a3f73177880e0e2075802671e4bb.zip gdb-36abac7fd314a3f73177880e0e2075802671e4bb.tar.gz gdb-36abac7fd314a3f73177880e0e2075802671e4bb.tar.bz2 |
Wed Mar 25 13:10:42 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
* gasp.c (IS*): Cast argument to unsigned char, not unsigned int.
* macro.c (macro_expand_body): Increase buffer size.
* messages.c (as_warn): Likewise.
(as_warn_where, as_bad, as_bad_where): Likewise.
Diffstat (limited to 'gas/macro.c')
-rw-r--r-- | gas/macro.c | 84 |
1 files changed, 37 insertions, 47 deletions
diff --git a/gas/macro.c b/gas/macro.c index e03b0f7..02738dd 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -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__ -#ifdef __STDC__ +# ifndef alloca +# ifdef __STDC__ extern void *alloca (); -#else +# else extern char *alloca (); -#endif +# 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,49 +298,31 @@ 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++; + while ((in->ptr[idx] != '>' || nest) + && idx < in->len) { - int nest = 0; - idx++; - while ((in->ptr[idx] != '>' || nest) - && idx < in->len) + if (in->ptr[idx] == '!') { - if (in->ptr[idx] == '!') - { - idx++ ; - sb_add_char (acc, in->ptr[idx++]); - } - else - { - if (in->ptr[idx] == '>') - nest--; - if (in->ptr[idx] == '<') - nest++; - sb_add_char (acc, in->ptr[idx++]); - } + idx++ ; + sb_add_char (acc, in->ptr[idx++]); + } + else + { + if (in->ptr[idx] == '>') + nest--; + if (in->ptr[idx] == '<') + nest++; + sb_add_char (acc, in->ptr[idx++]); } - 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++; } + idx++; } else if (in->ptr[idx] == '"' || 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 */ |