mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-03-19 18:00:23 +08:00
Add %ifempty and variants
This commit is contained in:
parent
3f3bd41de0
commit
134b94665d
1
CHANGES
1
CHANGES
@ -14,6 +14,7 @@
|
||||
* New compile date and time standard macros.
|
||||
* %ifnum now returns true for negative numbers.
|
||||
* New %iftoken test for a single token.
|
||||
* New %ifempty test for empty expansion.
|
||||
* Add support for the XSAVE instruction group.
|
||||
* Makefile for Netware/gcc.
|
||||
* Fix issue with some warnings getting emitted way too many times.
|
||||
|
@ -2736,6 +2736,15 @@ not (\c{-} being an operator.)
|
||||
The usual \i\c{%eliftoken}, \i\c\{%ifntoken}, and \i\c{%elifntoken}
|
||||
variants are also provided.
|
||||
|
||||
\S{ifempty} \i\c{%ifempty}: Test For Empty Expansion
|
||||
|
||||
The conditional assembly construct \c{%ifempty} assembles the
|
||||
subsequent code if and only if the expanded parameters do not contain
|
||||
any tokens at all, whitespace excepted.
|
||||
|
||||
The usual \i\c{%elifempty}, \i\c\{%ifnempty}, and \i\c{%elifnempty}
|
||||
variants are also provided.
|
||||
|
||||
\S{pperror} \i\c{%error}: Reporting \i{User-Defined Errors}
|
||||
|
||||
The preprocessor directive \c{%error} will cause NASM to report an
|
||||
|
@ -5,13 +5,14 @@
|
||||
*
|
||||
*ctx
|
||||
*def
|
||||
*empty
|
||||
*id
|
||||
*idn
|
||||
*idni
|
||||
*macro
|
||||
*num
|
||||
*token
|
||||
*str
|
||||
*token
|
||||
%arg
|
||||
%assign
|
||||
%clear
|
||||
|
11
preproc.c
11
preproc.c
@ -1584,8 +1584,7 @@ static bool if_condition(Token * tline, enum preproc_token ct)
|
||||
goto iftype;
|
||||
|
||||
iftype:
|
||||
tline = expand_smacro(tline);
|
||||
t = tline;
|
||||
t = tline = expand_smacro(tline);
|
||||
|
||||
while (tok_type_(t, TOK_WHITESPACE) ||
|
||||
(needtype == TOK_NUMBER &&
|
||||
@ -1611,6 +1610,14 @@ static bool if_condition(Token * tline, enum preproc_token ct)
|
||||
}
|
||||
break;
|
||||
|
||||
case PPC_IFEMPTY:
|
||||
t = tline = expand_smacro(tline);
|
||||
while (tok_type_(t, TOK_WHITESPACE))
|
||||
t = t->next;
|
||||
|
||||
j = !t; /* Should be empty */
|
||||
break;
|
||||
|
||||
case PPC_IF:
|
||||
t = tline = expand_smacro(tline);
|
||||
tptr = &t;
|
||||
|
315
test/iftoken.asm
315
test/iftoken.asm
@ -1,108 +1,315 @@
|
||||
db 'N "1": '
|
||||
%define ZMACRO
|
||||
%define NMACRO 1
|
||||
%define TMACRO 1 2
|
||||
db 'N "":'
|
||||
%iftoken
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "":'
|
||||
%iftoken ; With a comment!
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "ZMACRO":'
|
||||
%iftoken ZMACRO
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty ZMACRO
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "ZMACRO":'
|
||||
%iftoken ZMACRO ; With a comment!
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty ZMACRO ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "NMACRO":'
|
||||
%iftoken NMACRO
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty NMACRO
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "NMACRO":'
|
||||
%iftoken NMACRO ; With a comment!
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty NMACRO ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "TMACRO":'
|
||||
%iftoken TMACRO
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty TMACRO
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "TMACRO":'
|
||||
%iftoken TMACRO ; With a comment!
|
||||
db ' token'
|
||||
%else
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty TMACRO ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "1":'
|
||||
%iftoken 1
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "1": '
|
||||
%ifempty 1
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "1":'
|
||||
%iftoken 1 ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "+1": '
|
||||
%ifempty 1 ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "+1":'
|
||||
%iftoken +1
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "+1": '
|
||||
%ifempty +1
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "+1":'
|
||||
%iftoken +1 ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "1 2": '
|
||||
%ifempty +1 ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "1 2":'
|
||||
%iftoken 1 2
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "1 2": '
|
||||
%ifempty 1 2
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "1 2":'
|
||||
%iftoken 1 2 ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "1,2": '
|
||||
%ifempty 1 2 ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "1,2":'
|
||||
%iftoken 1,2
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "1,2": '
|
||||
%ifempty 1,2
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "1,2":'
|
||||
%iftoken 1,2 ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "foo": '
|
||||
%ifempty 1,2 ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "foo":'
|
||||
%iftoken foo
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "foo": '
|
||||
%ifempty foo
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "foo":'
|
||||
%iftoken foo ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "foo bar": '
|
||||
%ifempty foo ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "foo bar":'
|
||||
%iftoken foo bar
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "foo bar": '
|
||||
%ifempty foo bar
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "foo bar":'
|
||||
%iftoken foo bar ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "%": '
|
||||
%ifempty foo bar ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "%":'
|
||||
%iftoken %
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "%": '
|
||||
%ifempty %
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "%":'
|
||||
%iftoken % ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "+foo": '
|
||||
%ifempty % ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "+foo":'
|
||||
%iftoken +foo
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "+foo": '
|
||||
%ifempty +foo
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "+foo":'
|
||||
%iftoken +foo ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'N "<<": '
|
||||
%ifempty +foo ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'N "<<":'
|
||||
%iftoken <<
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
db 'C "<<": '
|
||||
%ifempty <<
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
db 'C "<<":'
|
||||
%iftoken << ; With a comment!
|
||||
db 'Yes', 10
|
||||
db ' token'
|
||||
%else
|
||||
db 'No', 10
|
||||
db ' ntoken'
|
||||
%endif
|
||||
%ifempty << ; With a comment!
|
||||
db ' empty'
|
||||
%else
|
||||
db ' nempty'
|
||||
%endif
|
||||
db 10
|
||||
|
@ -1,19 +1,31 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
@list = ('1', '+1', '1 2', '1,2', 'foo', 'foo bar', '%', '+foo', '<<');
|
||||
@list = ('', 'ZMACRO', 'NMACRO', 'TMACRO', '1', '+1', '1 2', '1,2',
|
||||
'foo', 'foo bar', '%', '+foo', '<<');
|
||||
@tests = ('token', 'empty');
|
||||
|
||||
foreach $t (@list) {
|
||||
print "\tdb 'N \"$t\": '\n";
|
||||
print "%iftoken $t\n";
|
||||
print "\tdb 'Yes', 10\n";
|
||||
print "%else\n";
|
||||
print "\tdb 'No', 10\n";
|
||||
print "%endif\n";
|
||||
print "%define ZMACRO\n";
|
||||
print "%define NMACRO 1\n";
|
||||
print "%define TMACRO 1 2\n";
|
||||
|
||||
print "\tdb 'C \"$t\": '\n";
|
||||
print "%iftoken $t ; With a comment!\n";
|
||||
print "\tdb 'Yes', 10\n";
|
||||
print "%else\n";
|
||||
print "\tdb 'No', 10\n";
|
||||
print "%endif\n";
|
||||
foreach $x (@list) {
|
||||
print "\tdb 'N \"$x\":'\n";
|
||||
foreach $t (@tests) {
|
||||
print "%if$t $x\n";
|
||||
print "\tdb ' $t'\n";
|
||||
print "%else\n";
|
||||
print "\tdb ' n$t'\n";
|
||||
print "%endif\n";
|
||||
}
|
||||
print "\tdb 10\n";
|
||||
|
||||
print "\tdb 'C \"$x\":'\n";
|
||||
foreach $t (@tests) {
|
||||
print "%if$t $x ; With a comment!\n";
|
||||
print "\tdb ' $t'\n";
|
||||
print "%else\n";
|
||||
print "\tdb ' n$t'\n";
|
||||
print "%endif\n";
|
||||
}
|
||||
print "\tdb 10\n";
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user