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.
This commit is contained in:
Ian Lance Taylor 1998-03-25 18:12:52 +00:00
parent ee09ab7f89
commit 36abac7fd3
3 changed files with 50 additions and 53 deletions

View file

@ -1,3 +1,10 @@
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.
Wed Mar 25 12:59:07 1998 Ian Lance Taylor <ian@cygnus.com> Wed Mar 25 12:59:07 1998 Ian Lance Taylor <ian@cygnus.com>
Based on patch from H.J. Lu <hjl@gnu.org>: Based on patch from H.J. Lu <hjl@gnu.org>:

View file

@ -105,12 +105,12 @@ FILE *outfile;
#define WHITEBIT 8 #define WHITEBIT 8
#define COMMENTBIT 16 #define COMMENTBIT 16
#define BASEBIT 32 #define BASEBIT 32
#define ISCOMMENTCHAR(x) (chartype[(unsigned)(x)] & COMMENTBIT) #define ISCOMMENTCHAR(x) (chartype[(unsigned char)(x)] & COMMENTBIT)
#define ISFIRSTCHAR(x) (chartype[(unsigned)(x)] & FIRSTBIT) #define ISFIRSTCHAR(x) (chartype[(unsigned char)(x)] & FIRSTBIT)
#define ISNEXTCHAR(x) (chartype[(unsigned)(x)] & NEXTBIT) #define ISNEXTCHAR(x) (chartype[(unsigned char)(x)] & NEXTBIT)
#define ISSEP(x) (chartype[(unsigned)(x)] & SEPBIT) #define ISSEP(x) (chartype[(unsigned char)(x)] & SEPBIT)
#define ISWHITE(x) (chartype[(unsigned)(x)] & WHITEBIT) #define ISWHITE(x) (chartype[(unsigned char)(x)] & WHITEBIT)
#define ISBASE(x) (chartype[(unsigned)(x)] & BASEBIT) #define ISBASE(x) (chartype[(unsigned char)(x)] & BASEBIT)
static char chartype[256]; static char chartype[256];

View file

@ -1,5 +1,5 @@
/* macro.c - macro support for gas and gasp /* 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, Written by Steve and Judy Chamberlain of Cygnus Support,
sac@cygnus.com sac@cygnus.com
@ -25,11 +25,13 @@
/* AIX requires this to be the first thing in the file. */ /* AIX requires this to be the first thing in the file. */
#ifdef __GNUC__ #ifdef __GNUC__
#ifdef __STDC__ # ifndef alloca
# ifdef __STDC__
extern void *alloca (); extern void *alloca ();
#else # else
extern char *alloca (); extern char *alloca ();
#endif # endif
# endif
#else #else
# if HAVE_ALLOCA_H # if HAVE_ALLOCA_H
# include <alloca.h> # include <alloca.h>
@ -119,7 +121,8 @@ static const char *macro_expand PARAMS ((int, sb *, macro_entry *, sb *, int));
#define ISSEP(x) \ #define ISSEP(x) \
((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \ ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
|| (x) == '<' || (x) == '>' || (x) == ')' || (x) == '(') || (x) == ')' || (x) == '(' \
|| ((macro_alternate || macro_mri) && ((x) == '<' || (x) == '>')))
#define ISBASE(x) \ #define ISBASE(x) \
((x) == 'b' || (x) == 'B' \ ((x) == 'b' || (x) == 'B' \
@ -295,49 +298,31 @@ getstring (idx, in, acc)
while (idx < in->len while (idx < in->len
&& (in->ptr[idx] == '"' && (in->ptr[idx] == '"'
|| in->ptr[idx] == '<' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
|| (in->ptr[idx] == '\'' && macro_alternate))) || (in->ptr[idx] == '\'' && macro_alternate)))
{ {
if (in->ptr[idx] == '<') if (in->ptr[idx] == '<')
{ {
if (macro_alternate || macro_mri) int nest = 0;
idx++;
while ((in->ptr[idx] != '>' || nest)
&& idx < in->len)
{ {
int nest = 0; if (in->ptr[idx] == '!')
idx++;
while ((in->ptr[idx] != '>' || nest)
&& idx < in->len)
{ {
if (in->ptr[idx] == '!') idx++ ;
{ sb_add_char (acc, in->ptr[idx++]);
idx++ ; }
sb_add_char (acc, in->ptr[idx++]); else
} {
else if (in->ptr[idx] == '>')
{ nest--;
if (in->ptr[idx] == '>') if (in->ptr[idx] == '<')
nest--; nest++;
if (in->ptr[idx] == '<') sb_add_char (acc, 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] == '\'') 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); sb_add_string (out, buf);
} }
else if (in->ptr[idx] == '"' else if (in->ptr[idx] == '"'
|| in->ptr[idx] == '<' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
|| (macro_alternate && in->ptr[idx] == '\'')) || (macro_alternate && in->ptr[idx] == '\''))
{ {
if (macro_alternate if (macro_alternate
@ -436,7 +421,8 @@ get_any_string (idx, in, out, expand, pretend_quoted)
|| (in->ptr[idx] != ' ' || (in->ptr[idx] != ' '
&& in->ptr[idx] != '\t' && in->ptr[idx] != '\t'
&& in->ptr[idx] != ',' && in->ptr[idx] != ','
&& in->ptr[idx] != '<'))) && (in->ptr[idx] != '<'
|| (! macro_alternate && ! macro_mri)))))
{ {
if (in->ptr[idx] == '"' if (in->ptr[idx] == '"'
|| 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); 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) else if (copyifnotthere)
{ {
sb_add_sb (out, t); sb_add_sb (out, t);
@ -699,8 +690,7 @@ macro_expand_body (in, out, formals, formal_hash, comment_char, locals)
} }
else else
{ {
/* FIXME: Why do we do this? It prevents people from /* FIXME: Why do we do this? */
using the & operator in a macro. */
src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0); 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 */ /* Sub in the macro invocation number */
char buffer[6]; char buffer[10];
src++; src++;
sprintf (buffer, "%05d", macro_number); sprintf (buffer, "%05d", macro_number);
sb_add_string (out, buffer); 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] == '=') if (scan < in->len && !macro_alternate && in->ptr[scan] == '=')
{ {
is_keyword = 1; 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 /* This is a keyword arg, fetch the formal name and
then the actual stuff */ then the actual stuff */