[nasm:master] preproc: add %count() function
nasm-bot for H. Peter Anvin
hpa at zytor.com
Mon Nov 14 13:21:05 PST 2022
Commit-ID: 664a79473d73f1fb65eadd75bdc093bc8608a129
Gitweb: http://repo.or.cz/w/nasm.git?a=commitdiff;h=664a79473d73f1fb65eadd75bdc093bc8608a129
Author: H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 14 Nov 2022 01:48:38 -0800
Committer: H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 14 Nov 2022 01:48:38 -0800
preproc: add %count() function
Add %count(), giving a count of the number of arguments.
Signed-off-by: H. Peter Anvin <hpa at zytor.com>
---
asm/preproc.c | 11 +++++++++++
doc/nasmdoc.src | 23 +++++++++++++++++++----
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/asm/preproc.c b/asm/preproc.c
index fdb761b7..a41ed2be 100644
--- a/asm/preproc.c
+++ b/asm/preproc.c
@@ -7013,6 +7013,16 @@ stdmac_cond_sel(const SMacro *s, Token **params, int nparams)
return new_Token(NULL, tok_smac_param(which), "", 0);
}
+/* %count() */
+static Token *
+stdmac_count(const SMacro *s, Token **params, int nparams)
+{
+ (void)s;
+ (void)params;
+
+ return make_tok_num(NULL, nparams);
+}
+
/* Add magic standard macros */
struct magic_macros {
const char *name;
@@ -7028,6 +7038,7 @@ static void pp_add_magic_stdmac(void)
{ "__?LINE?__", true, 0, 0, stdmac_line },
{ "__?BITS?__", true, 0, 0, stdmac_bits },
{ "__?PTR?__", true, 0, 0, stdmac_ptr },
+ { "%count", false, 1, SPARM_VARADIC, stdmac_count },
{ "%eval", false, 1, SPARM_EVAL|SPARM_VARADIC, stdmac_join },
{ "%str", false, 1, SPARM_GREEDY|SPARM_STR, stdmac_join },
{ "%strcat", false, 1, SPARM_GREEDY, stdmac_strcat },
diff --git a/doc/nasmdoc.src b/doc/nasmdoc.src
index 745e6536..111dea36 100644
--- a/doc/nasmdoc.src
+++ b/doc/nasmdoc.src
@@ -2867,13 +2867,28 @@ to \c{%sel(2-!(x),y,z)}.
The argument not selected is never expanded.
+\S{f_count} \i\c{%count()} Function
+
+The \c{%count()} function expands to the number of argments passed to
+the macro. Note that just as for single-line macros, \c{%count()}
+treats an empty argument list as a single empty argument.
+
+\c %xdefine empty %count() ; %define empty 1
+\c %xdefine one %count(1) ; %define one 1
+\c %xdefine two %count(5,q) ; %define two 2
+\c %define list a,b,46
+\c %xdefine lc1 %count(list) ; %define lc 1 (just one argument)
+\c %xdefine lc2 %count(%[list]) ; %define lc 3 (indirection expands)
+
+
\S{f_eval} \i\c{%eval()} Function
The \c{%eval()} function evaluates its argument as a numeric
-expression in much the same way the \i\c{%assign} directive would, see
-\k{assign}. Unlike \c{%assign}, \c{%eval()} supports more than one
-argument; if more than one argument is specified, it is expanded to a
-comma-separated list of values.
+expression and expands to the result as an integer constant in much
+the same way the \i\c{%assign} directive would, see \k{assign}. Unlike
+\c{%assign}, \c{%eval()} supports more than one argument; if more than
+one argument is specified, it is expanded to a comma-separated list of
+values.
\c %assign a 2
\c %assign b 3
More information about the Nasm-commits
mailing list