New elseif directive has been added.

This commit is contained in:
Timothy Wall 2000-02-08 14:13:57 +00:00
parent 08ccce3206
commit 3fd9f0476f
5 changed files with 97 additions and 0 deletions

View File

@ -2,6 +2,10 @@
Changes in 2.10:
Support for numbers with suffixes.
New .elseif pseudo-op added.
New --fatal-warnings option.
picoJava architecture support added.

View File

@ -246,6 +246,86 @@ s_ifc (arg)
demand_empty_rest_of_line ();
}
void
s_elseif (arg)
int arg;
{
expressionS operand;
int t;
if (current_cframe == NULL)
{
as_bad (_("\".elseif\" without matching \".if\" - ignored"));
}
else if (current_cframe->else_seen)
{
as_bad (_("\".elseif\" after \".else\" - ignored"));
as_bad_where (current_cframe->else_file_line.file,
current_cframe->else_file_line.line,
_("here is the previous \"else\""));
as_bad_where (current_cframe->if_file_line.file,
current_cframe->if_file_line.line,
_("here is the previous \"if\""));
}
else
{
as_where (&current_cframe->else_file_line.file,
&current_cframe->else_file_line.line);
if (!current_cframe->dead_tree)
{
current_cframe->ignoring = !current_cframe->ignoring;
if (LISTING_SKIP_COND ())
{
if (! current_cframe->ignoring)
listing_list (1);
else
listing_list (2);
}
} /* if not a dead tree */
} /* if error else do it */
SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */
if (current_cframe != NULL && current_cframe->ignoring)
{
operand.X_add_number = 0;
while (! is_end_of_line[(unsigned char) *input_line_pointer])
++input_line_pointer;
}
else
{
expression (&operand);
if (operand.X_op != O_constant)
as_bad (_("non-constant expression in \".elseif\" statement"));
}
switch ((operatorT) arg)
{
case O_eq: t = operand.X_add_number == 0; break;
case O_ne: t = operand.X_add_number != 0; break;
case O_lt: t = operand.X_add_number < 0; break;
case O_le: t = operand.X_add_number <= 0; break;
case O_ge: t = operand.X_add_number >= 0; break;
case O_gt: t = operand.X_add_number > 0; break;
default:
abort ();
return;
}
current_cframe->ignoring = current_cframe->dead_tree || ! t;
if (LISTING_SKIP_COND ()
&& current_cframe->ignoring
&& (current_cframe->previous_cframe == NULL
|| ! current_cframe->previous_cframe->ignoring))
listing_list (2);
demand_empty_rest_of_line ();
}
void
s_endif (arg)
int arg ATTRIBUTE_UNUSED;

View File

@ -3109,6 +3109,7 @@ Some machine configurations provide additional directives.
* Double:: @code{.double @var{flonums}}
* Eject:: @code{.eject}
* Else:: @code{.else}
* Elseif:: @code{.elseif}
* End:: @code{.end}
@ifset COFF
* Endef:: @code{.endef}
@ -3466,6 +3467,14 @@ assembly; @pxref{If,,@code{.if}}. It marks the beginning of a section
of code to be assembled if the condition for the preceding @code{.if}
was false.
@node Elseif
@section @code{.elseif}
@cindex @code{elseif} directive
@code{.elseif} is part of the @code{@value{AS}} support for conditional
assembly; @pxref{If,,@code{.if}}. It is shorthand for beginning a new
@code{.if} block that would otherwise fill the entire @code{.else} section.
@node End
@section @code{.end}
@ -3694,6 +3703,8 @@ considered part of the source program being assembled if the argument
the conditional section of code must be marked by @code{.endif}
(@pxref{Endif,,@code{.endif}}); optionally, you may include code for the
alternative condition, flagged by @code{.else} (@pxref{Else,,@code{.else}}).
If you have several conditions to check, @code{.elseif} may be used to avoid
nesting blocks if/else within each subsequent @code{.else} block.
The following variants of @code{.if} are also supported:
@table @code

View File

@ -306,6 +306,7 @@ static const pseudo_typeS potable[] =
{"eject", listing_eject, 0}, /* Formfeed listing */
{"else", s_else, 0},
{"elsec", s_else, 0},
{"elseif", s_elseif, (int) O_ne},
{"end", s_end, 0},
{"endc", s_endif, 0},
{"endfunc", s_func, 1},

View File

@ -128,6 +128,7 @@ extern void s_comm PARAMS ((int));
extern void s_data PARAMS ((int));
extern void s_desc PARAMS ((int));
extern void s_else PARAMS ((int arg));
extern void s_elseif PARAMS ((int arg));
extern void s_end PARAMS ((int arg));
extern void s_endif PARAMS ((int arg));
extern void s_err PARAMS ((int));