From 36abac7fd314a3f73177880e0e2075802671e4bb Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 25 Mar 1998 18:12:52 +0000 Subject: [PATCH] Wed Mar 25 13:10:42 1998 Bruno Haible * 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. --- gas/ChangeLog | 7 +++++ gas/gasp.c | 12 ++++---- gas/macro.c | 84 +++++++++++++++++++++++---------------------------- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index da1bb516171..c40837e0cce 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +Wed Mar 25 13:10:42 1998 Bruno Haible + + * 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. + Wed Mar 25 12:59:07 1998 Ian Lance Taylor Based on patch from H.J. Lu : diff --git a/gas/gasp.c b/gas/gasp.c index 9d2b2d0c67b..80e2a925212 100644 --- a/gas/gasp.c +++ b/gas/gasp.c @@ -105,12 +105,12 @@ FILE *outfile; #define WHITEBIT 8 #define COMMENTBIT 16 #define BASEBIT 32 -#define ISCOMMENTCHAR(x) (chartype[(unsigned)(x)] & COMMENTBIT) -#define ISFIRSTCHAR(x) (chartype[(unsigned)(x)] & FIRSTBIT) -#define ISNEXTCHAR(x) (chartype[(unsigned)(x)] & NEXTBIT) -#define ISSEP(x) (chartype[(unsigned)(x)] & SEPBIT) -#define ISWHITE(x) (chartype[(unsigned)(x)] & WHITEBIT) -#define ISBASE(x) (chartype[(unsigned)(x)] & BASEBIT) +#define ISCOMMENTCHAR(x) (chartype[(unsigned char)(x)] & COMMENTBIT) +#define ISFIRSTCHAR(x) (chartype[(unsigned char)(x)] & FIRSTBIT) +#define ISNEXTCHAR(x) (chartype[(unsigned char)(x)] & NEXTBIT) +#define ISSEP(x) (chartype[(unsigned char)(x)] & SEPBIT) +#define ISWHITE(x) (chartype[(unsigned char)(x)] & WHITEBIT) +#define ISBASE(x) (chartype[(unsigned char)(x)] & BASEBIT) static char chartype[256]; diff --git a/gas/macro.c b/gas/macro.c index e03b0f710b3..02738ddb315 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 @@ -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 */ -- 2.30.2