\c %defstr PATH %!PATH ; The operating system PATH variable
+\S{deftok} Defining Tokens: \I\c{%ideftok}\i\c{%deftok}
+
+\c{%deftok}, and its case-insensitive counterpart \c{%ideftok}, define
+or redefine a single-line macro without parameters but converts the
+second parameter, after string conversion, to a sequence of tokens.
+
+For example:
+
+\c %deftok test 'TEST'
+
+is equivalent to
+
+\c %define test TEST
+
+
\H{strlen} \i{String Manipulation in Macros}
It's often useful to be able to handle strings in macros. NASM
\c silly {13,10}, crlf ; crlf: db 13,10
+\S{mlrmacro} \i{Recursive Multi-Line Macros}: \I\c{%irmacro}\i\c{%rmacro}
+
+A multi-line macro cannot be referenced within itself, in order to
+prevent accidental infinite recursion.
+
+Recursive multi-line macros allow for self-referencing, with the
+caveat that the user is aware of the existence, use and purpose of
+recursive multi-line macros. There is also a generous, but sane, upper
+limit to the number of recursions, in order to prevent run-away memory
+consumption in case of accidental infinite recursion.
+
+As with non-recursive multi-line macros, recursive multi-line macros are
+\i{case-sensitive}, unless you define them using the alternative
+directive \c{%irmacro}.
+
+
\S{mlmacover} Overloading Multi-Line Macros\I{overloading, multi-line macros}
As with single-line macros, multi-line macros can be overloaded by
* If we're in a %rep block, another %rep nests, so should be let through.
*/
if (defining && i != PP_MACRO && i != PP_IMACRO &&
- i != PP_RMACRO && i != PP_RIMACRO &&
+ i != PP_RMACRO && i != PP_IRMACRO &&
i != PP_ENDMACRO && i != PP_ENDM &&
(defining->name || (i != PP_ENDREP && i != PP_REP))) {
return NO_DIRECTIVE_FOUND;
if (defining) {
if (i == PP_MACRO || i == PP_IMACRO ||
- i == PP_RMACRO || i == PP_RIMACRO) {
+ i == PP_RMACRO || i == PP_IRMACRO) {
nested_mac_count++;
return NO_DIRECTIVE_FOUND;
} else if (nested_mac_count > 0) {
return DIRECTIVE_FOUND;
case PP_RMACRO:
- case PP_RIMACRO:
+ case PP_IRMACRO:
case PP_MACRO:
case PP_IMACRO:
if (defining) {
"`%%%smacro': already defining a macro",
(i == PP_IMACRO ? "i" :
i == PP_RMACRO ? "r" :
- i == PP_RIMACRO ? "ri" : ""));
+ i == PP_IRMACRO ? "ri" : ""));
return DIRECTIVE_FOUND;
}
defining = nasm_malloc(sizeof(MMacro));
- defining->max_depth = (((i == PP_RMACRO) || (i == PP_RIMACRO))
+ defining->max_depth = (((i == PP_RMACRO) || (i == PP_IRMACRO))
? (DEADMAN_LIMIT) : 0);
defining->casesense = ((i == PP_MACRO) || (i == PP_RMACRO));
if (!parse_mmacro_spec(tline, defining, pp_directives[i])) {