/* The routines in this file handle macro definition and expansion.
They are called by gas. */
-#define ISWHITE(x) ((x) == ' ' || (x) == '\t')
-
#define ISSEP(x) \
- ((x) == ' ' || (x) == '\t' || (x) == ',' || (x) == '"' || (x) == ';' \
+ (is_whitespace (x) || (x) == ',' || (x) == '"' || (x) == ';' \
|| (x) == ')' || (x) == '(' \
|| ((flag_macro_alternate || flag_mri) && ((x) == '<' || (x) == '>')))
if (! LABELS_WITHOUT_COLONS)
{
/* Skip leading whitespace. */
- while (i < ptr->len && ISWHITE (ptr->ptr[i]))
- i++;
+ i = sb_skip_white (i, ptr);
}
for (;;)
if (i < ptr->len && is_name_ender (ptr->ptr[i]))
i++;
/* Skip whitespace. */
- while (i < ptr->len && ISWHITE (ptr->ptr[i]))
- i++;
+ i = sb_skip_white (i, ptr);
/* Check for the colon. */
if (i >= ptr->len || ptr->ptr[i] != ':')
{
}
/* Skip trailing whitespace. */
- while (i < ptr->len && ISWHITE (ptr->ptr[i]))
- i++;
+ i = sb_skip_white (i, ptr);
if (i < ptr->len && (ptr->ptr[i] == '.'
|| NO_PSEUDO_DOT
*in_br = '\0';
while (idx < in->len
- && (*in_br
- || (in->ptr[idx] != ' '
- && in->ptr[idx] != '\t'))
+ && (*in_br || !is_whitespace (in->ptr[idx]))
&& in->ptr[idx] != ','
&& (in->ptr[idx] != '<'
|| (! flag_macro_alternate && ! flag_mri)))
if (! macro
|| src + 5 >= in->len
|| strncasecmp (in->ptr + src, "LOCAL", 5) != 0
- || ! ISWHITE (in->ptr[src + 5])
+ || ! is_whitespace (in->ptr[src + 5])
/* PR 11507: Skip keyword LOCAL if it is found inside a quoted string. */
|| inquote)
{
/* The Microtec assembler ignores this if followed by a white space.
(Macro invocation with empty extension) */
idx++;
- if ( idx < in->len
- && in->ptr[idx] != ' '
- && in->ptr[idx] != '\t')
+ if (idx < in->len && !is_whitespace (in->ptr[idx]))
{
formal_entry *n = new_formal ();
{
if (idx < in->len && in->ptr[idx] == ',')
++idx;
- if (idx < in->len && ISWHITE (in->ptr[idx]))
+ if (idx < in->len && is_whitespace (in->ptr[idx]))
break;
}
}
die horribly;
#endif
+#ifndef CR_EOL
+#define LEX_CR LEX_WHITE
+#else
+#define LEX_CR 0
+#endif
+
#ifndef LEX_AT
#define LEX_AT 0
#endif
/* Used by is_... macros. our ctype[]. */
char lex_type[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, LEX_CR, 0, 0, /* @ABCDEFGHIJKLMNO */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
- 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
+ 8, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
if (*rest == ':')
++rest;
- if (*rest == ' ' || *rest == '\t')
+ if (is_whitespace (*rest))
++rest;
if ((strncasecmp (rest, "EQU", 3) == 0
|| strncasecmp (rest, "SET", 3) == 0)
- && (rest[3] == ' ' || rest[3] == '\t'))
+ && is_whitespace (rest[3]))
{
input_line_pointer = rest + 3;
equals (line_start,
continue;
}
if (strncasecmp (rest, "MACRO", 5) == 0
- && (rest[5] == ' '
- || rest[5] == '\t'
+ && (is_whitespace (rest[5])
|| is_end_of_line[(unsigned char) rest[5]]))
mri_line_macro = 1;
}
level. */
do
nul_char = next_char = *input_line_pointer++;
- while (next_char == '\t' || next_char == ' ' || next_char == '\f');
+ while (is_whitespace (next_char) || next_char == '\f');
/* C is the 1st significant character.
Input_line_pointer points after that character. */
if (*rest == ':')
++rest;
- if (*rest == ' ' || *rest == '\t')
+ if (is_whitespace (*rest))
++rest;
if ((strncasecmp (rest, "EQU", 3) == 0
|| strncasecmp (rest, "SET", 3) == 0)
- && (rest[3] == ' ' || rest[3] == '\t'))
+ && is_whitespace (rest[3]))
{
input_line_pointer = rest + 3;
equals (s, 1);
SKIP_WHITESPACE ();
}
else if ((next_char == '=' && *rest == '=')
- || ((next_char == ' ' || next_char == '\t')
+ || (is_whitespace (next_char)
&& rest[0] == '='
&& rest[1] == '='))
{
demand_empty_rest_of_line ();
}
else if ((next_char == '='
- || ((next_char == ' ' || next_char == '\t')
+ || (is_whitespace (next_char)
&& *rest == '='))
#ifdef TC_EQUAL_IN_INSN
&& !TC_EQUAL_IN_INSN (next_char, s)
/* The following skip of whitespace is compulsory.
A well shaped space is sometimes all that separates
keyword from operands. */
- if (next_char == ' ' || next_char == '\t')
+ if (is_whitespace (next_char))
input_line_pointer++;
/* Input_line is restored.
know (flag_m68k_mri);
for (s = input_line_pointer;
- ((!is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
+ ((!is_end_of_line[(unsigned char) *s] && !is_whitespace (*s))
|| inquote);
s++)
{
if (reassign < 0 && *input_line_pointer == '=')
input_line_pointer++;
- while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
+ while (is_whitespace (*input_line_pointer))
input_line_pointer++;
if (flag_mri)
SKIP_WHITESPACE ();
i = 0;
while (!is_end_of_line[(unsigned char) *input_line_pointer]
- && *input_line_pointer != ' '
- && *input_line_pointer != '\t')
+ && !is_whitespace (*input_line_pointer))
{
obstack_1grow (¬es, *input_line_pointer);
++input_line_pointer;
#ifdef PERMIT_WHITESPACE
#define SKIP_WHITESPACE() \
- ((*input_line_pointer == ' ') ? ++input_line_pointer : 0)
+ (is_whitespace (*input_line_pointer) ? ++input_line_pointer : 0)
#define SKIP_ALL_WHITESPACE() \
- while (*input_line_pointer == ' ') ++input_line_pointer
+ while (is_whitespace (*input_line_pointer)) ++input_line_pointer
#else
-#define SKIP_WHITESPACE() know (*input_line_pointer != ' ' )
+#define SKIP_WHITESPACE() know (!is_whitespace (*input_line_pointer))
#define SKIP_ALL_WHITESPACE() SKIP_WHITESPACE()
#endif
-#define LEX_NAME (1) /* may continue a name */
+#define LEX_NAME (1) /* may continue a name */
#define LEX_BEGIN_NAME (2) /* may begin a name */
#define LEX_END_NAME (4) /* ends a name */
+#define LEX_WHITE (8) /* whitespace */
#define is_name_beginner(c) \
( lex_type[(unsigned char) (c)] & LEX_BEGIN_NAME )
( lex_type[(unsigned char) (c)] & LEX_NAME )
#define is_name_ender(c) \
( lex_type[(unsigned char) (c)] & LEX_END_NAME )
+#define is_whitespace(c) \
+ ( lex_type[(unsigned char) (c)] & LEX_WHITE )
/* The distinction of "line" and "statement" sadly is blurred by unhelpful
naming of e.g. the underlying array. Most users really mean "end of