Next: Conditional constructs, Previous: Diagnostic Macros, Up: Programming in M4sugar
M4sugar makes heavy use of diversions, because it is often the case that text that must appear early in the output is not discovered until late in the input. Additionally, some of the topological sorting algorithms used in resolving macro dependencies use diversions. Therefore, most macros should not need to change diversions directly, but rather rely on higher-level M4sugar macros to manage diversions transparently.
To make diversion management easier, M4sugar uses the concept of named
diversions. Rather than using diversion numbers directly, it is nicer
to associate a name with each diversion; the diversion number associated
with a particular diversion name is an implementation detail, so you
should only use diversion names. In general, you should not output text
to a named diversion until after calling the appropriate initialization
routine for your language (m4_init
, AS_INIT
,
AT_INIT
, ...), although there are some exceptions documented
below.
M4sugar defines two named diversions.
KILL
GROW
AC_REQUIRE
.
M4sh adds several more named diversions.
BINSH
HEADER-REVISION
AC_REVISION
.
HEADER-COMMENT
HEADER-COPYRIGHT
AC_COPYRIGHT
.
M4SH-SANITIZE
M4SH-INIT
BODY
Autotest inherits diversions from M4sh, and changes the default
diversion from BODY
back to KILL
. It also adds several
more named diversions, with the following subset designed for developer
use.
PREPARE_TESTS
AT_INIT
.
For now, the named diversions of Autoconf and Autoheader, and the remaining diversions of Autotest, are not documented. In other words, intentionally outputting text into an undocumented diversion is subject to breakage in a future release of Autoconf.
Similar to
m4_divert_text
, except that content is only output to diversion if this is the first time thatm4_divert_once
has been called with its particular arguments.
If provided, check that the current diversion is indeed diversion. Then change to the diversion located earlier on the stack, giving an error if an attempt is made to pop beyond the initial m4sugar diversion of
KILL
.
Remember the former diversion on the diversion stack, and output subsequent text into diversion. M4sugar maintains a diversion stack, and issues an error if there is not a matching pop for every push.