cosmopolitan/third_party/m4/README.txt

381 lines
19 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

M4(1) Cosmopolitan General Commands Manual -*-text-*-
๐๐€๐Œ๐„
๐—บ๐Ÿฐ โ€” macro language processor
๐’๐˜๐๐Ž๐๐’๐ˆ๐’
๐—บ๐Ÿฐ [-๐„๐—ด๐๐˜€] [-๐ƒnฬฒaฬฒmฬฒeฬฒ[=vฬฒaฬฒlฬฒuฬฒeฬฒ]] [-๐—ฑ fฬฒlฬฒaฬฒgฬฒsฬฒ] [-๐ˆ dฬฒiฬฒrฬฒnฬฒaฬฒmฬฒeฬฒ] [-๐—ผ fฬฒiฬฒlฬฒeฬฒnฬฒaฬฒmฬฒeฬฒ]
[-๐˜ mฬฒaฬฒcฬฒrฬฒoฬฒ] [-๐”nฬฒaฬฒmฬฒeฬฒ] [fฬฒiฬฒlฬฒeฬฒ .ฬฒ.ฬฒ.ฬฒ]
๐ƒ๐„๐’๐‚๐‘๐ˆ๐๐“๐ˆ๐Ž๐
The ๐—บ๐Ÿฐ utility is a macro processor that can be used as a front end
to any language (e.g., C, ratfor, fortran, lex, and yacc). If no
input files are given, ๐—บ๐Ÿฐ reads from the standard input, otherwise
files specified on the command line are processed in the given
order. Input files can be regular files, files in the m4 include
paths, or a single dash (โ€˜-โ€™), denoting standard input. ๐—บ๐Ÿฐ writes
the processed text to the standard output, unless told otherwise.
Macro calls have the form name(argument1[, argument2, ..., arguโ€
mentN]).
There cannot be any space following the macro name and the open
parenthesis (โ€˜(โ€™). If the macro name is not followed by an open
parenthesis it is processed with no arguments.
Macro names consist of a leading alphabetic or underscore possibly
followed by alphanumeric or underscore characters, e.g., valid
macro names match the pattern โ€œ[a-zA-Z_][a-zA-Z0-9_]*โ€.
In arguments to macros, leading unquoted space, tab, and newline
(โ€˜\nโ€™) characters are ignored. To quote strings, use left and
right single quotes (e.g., โ€˜ this is a string with a leading
spaceโ€™). You can change the quote characters with the ๐—ฐ๐—ต๐—ฎ๐—ป๐—ด๐—ฒ๐—พ๐˜‚๐—ผ๐˜๐—ฒ
built-in macro.
Most built-ins don't make any sense without arguments, and hence
are not recognized as special when not followed by an open parenโ€
thesis.
The options are as follows:
-๐ƒnฬฒaฬฒmฬฒeฬฒ[=vฬฒaฬฒlฬฒuฬฒeฬฒ]
Define the symbol nฬฒaฬฒmฬฒeฬฒ to have some value (or NULL).
-๐—ฑ fฬฒlฬฒaฬฒgฬฒsฬฒ
Set trace flags. fฬฒlฬฒaฬฒgฬฒsฬฒ may hold the following:
aฬฒ print macro arguments.
cฬฒ print macro expansion over several lines.
eฬฒ print result of macro expansion.
fฬฒ print filename location.
lฬฒ print line number.
qฬฒ quote arguments and expansion with the current
quotes.
tฬฒ start with all macros traced.
xฬฒ number macro expansions.
Vฬฒ turn on all options.
By default, trace is set to "eq".
-๐„ Set warnings to be fatal. When a single -๐„ flag is speciโ€
fied, if warnings are issued, execution continues but ๐—บ๐Ÿฐ
will exit with a non-zero exit status. When multiple -๐„
flags are specified, execution will halt upon issuing the
first warning and ๐—บ๐Ÿฐ will exit with a non-zero exit status.
This behaviour matches GNU-m4 1.4.9 and later.
-๐—ด Activate GNU-m4 compatibility mode. In this mode, translit
handles simple character ranges (e.g., a-z), regular
expressions mimic emacs behavior, multiple m4wrap calls are
handled as a stack, the number of diversions is unlimited,
empty names for macro definitions are allowed, and eval
understands โ€˜0rbase:valueโ€™ numbers.
-๐ˆ dฬฒiฬฒrฬฒnฬฒaฬฒmฬฒeฬฒ
Add directory dฬฒiฬฒrฬฒnฬฒaฬฒmฬฒeฬฒ to the include path.
-๐—ผ fฬฒiฬฒlฬฒeฬฒnฬฒaฬฒmฬฒeฬฒ
Send trace output to fฬฒiฬฒlฬฒeฬฒnฬฒaฬฒmฬฒeฬฒ.
-๐ Prefix all built-in macros with โ€˜m4_โ€™. For example,
instead of writing ๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ, use ๐—บ๐Ÿฐ_๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ.
-๐˜€ Output line synchronization directives, suitable for
cpp(1).
-๐˜ mฬฒaฬฒcฬฒrฬฒoฬฒ
Turn tracing on for mฬฒaฬฒcฬฒrฬฒoฬฒ.
-๐”nฬฒaฬฒmฬฒeฬฒ Undefine the symbol nฬฒaฬฒmฬฒeฬฒ.
๐’๐˜๐๐“๐€๐—
๐—บ๐Ÿฐ provides the following built-in macros. They may be redefined,
losing their original meaning. Return values are null unless othโ€
erwise stated.
๐—ฏ๐˜‚๐—ถ๐—น๐˜๐—ถ๐—ป(nฬฒaฬฒmฬฒeฬฒ)
Calls a built-in by its nฬฒaฬฒmฬฒeฬฒ, overriding possible
redefinitions.
๐—ฐ๐—ต๐—ฎ๐—ป๐—ด๐—ฒ๐—ฐ๐—ผ๐—บ(sฬฒtฬฒaฬฒrฬฒtฬฒcฬฒoฬฒmฬฒmฬฒeฬฒnฬฒtฬฒ, eฬฒnฬฒdฬฒcฬฒoฬฒmฬฒmฬฒeฬฒnฬฒtฬฒ)
Changes the start comment and end comment sequences.
Comment sequences may be up to five characters long.
The default values are the hash sign and the newline
character.
# This is a comment
With no arguments, comments are turned off. With one
single argument, the end comment sequence is set to
the newline character.
๐—ฐ๐—ต๐—ฎ๐—ป๐—ด๐—ฒ๐—พ๐˜‚๐—ผ๐˜๐—ฒ(bฬฒeฬฒgฬฒiฬฒnฬฒqฬฒuฬฒoฬฒtฬฒeฬฒ, eฬฒnฬฒdฬฒqฬฒuฬฒoฬฒtฬฒeฬฒ)
Defines the open quote and close quote sequences.
Quote sequences may be up to five characters long.
The default values are the backquote character and the
quote character.
`Here is a quoted string'
With no arguments, the default quotes are restored.
With one single argument, the close quote sequence is
set to the newline character.
๐—ฑ๐—ฒ๐—ฐ๐—ฟ(aฬฒrฬฒgฬฒ) Decrements the argument aฬฒrฬฒgฬฒ by 1. The argument aฬฒrฬฒgฬฒ
must be a valid numeric string.
๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ(nฬฒaฬฒmฬฒeฬฒ, vฬฒaฬฒlฬฒuฬฒeฬฒ)
Define a new macro named by the first argument nฬฒaฬฒmฬฒeฬฒ to
have the value of the second argument vฬฒaฬฒlฬฒuฬฒeฬฒ. Each
occurrence of โ€˜$nโ€™ (where nฬฒ is 0 through 9) is
replaced by the nฬฒ'th argument. โ€˜$0โ€™ is the name of
the calling macro. Undefined arguments are replaced
by a null string. โ€˜$#โ€™ is replaced by the number of
arguments; โ€˜$*โ€™ is replaced by all arguments comma
separated; โ€˜$@โ€™ is the same as โ€˜$*โ€™ but all arguments
are quoted against further expansion.
๐—ฑ๐—ฒ๐—ณ๐—ป(nฬฒaฬฒmฬฒeฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Returns the quoted definition for each argument. This
can be used to rename macro definitions (even for
built-in macros).
๐—ฑ๐—ถ๐˜ƒ๐—ฒ๐—ฟ๐˜(nฬฒuฬฒmฬฒ) There are 10 output queues (numbered 0-9). At the end
of processing ๐—บ๐Ÿฐ concatenates all the queues in numerโ€
ical order to produce the final output. Initially the
output queue is 0. The divert macro allows you to
select a new output queue (an invalid argument passed
to divert causes output to be discarded).
๐—ฑ๐—ถ๐˜ƒ๐—ป๐˜‚๐—บ Returns the current output queue number.
๐—ฑ๐—ป๐—น Discard input characters up to and including the next
newline.
๐—ฑ๐˜‚๐—บ๐—ฝ๐—ฑ๐—ฒ๐—ณ(nฬฒaฬฒmฬฒeฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Prints the names and definitions for the named items,
or for everything if no arguments are passed.
๐—ฒ๐—ฟ๐—ฟ๐—ฝ๐—ฟ๐—ถ๐—ป๐˜(mฬฒsฬฒgฬฒ)
Prints the first argument on the standard error output
stream.
๐—ฒ๐˜€๐˜†๐˜€๐—ฐ๐—บ๐—ฑ(cฬฒmฬฒdฬฒ)
Passes its first argument to a shell and returns the
shell's standard output. Note that the shell shares
its standard input and standard error with ๐—บ๐Ÿฐ.
๐—ฒ๐˜ƒ๐—ฎ๐—น(eฬฒxฬฒpฬฒrฬฒ[ฬฒ,ฬฒrฬฒaฬฒdฬฒiฬฒxฬฒ[ฬฒ,ฬฒmฬฒiฬฒnฬฒiฬฒmฬฒuฬฒmฬฒ]ฬฒ]ฬฒ)
Computes the first argument as an arithmetic expresโ€
sion using 32-bit arithmetic. Operators are the stanโ€
dard C ternary, arithmetic, logical, shift, relaโ€
tional, bitwise, and parentheses operators. You can
specify octal, decimal, and hexadecimal numbers as in
C. The optional second argument rฬฒaฬฒdฬฒiฬฒxฬฒ specifies the
radix for the result and the optional third argument
mฬฒiฬฒnฬฒiฬฒmฬฒuฬฒmฬฒ specifies the minimum number of digits in the
result.
๐—ฒ๐˜…๐—ฝ๐—ฟ(eฬฒxฬฒpฬฒrฬฒ) This is an alias for ๐—ฒ๐˜ƒ๐—ฎ๐—น.
๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐˜(fฬฒoฬฒrฬฒmฬฒaฬฒtฬฒsฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, aฬฒrฬฒgฬฒ1ฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Returns fฬฒoฬฒrฬฒmฬฒaฬฒtฬฒsฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ with escape sequences substituted
with aฬฒrฬฒgฬฒ1ฬฒ and following arguments, in a way similar to
printf(3). This built-in is only available in GNU-m4
compatibility mode, and the only parameters impleโ€
mented are there for autoconf compatibility: left-padโ€
ding flag, an optional field width, a maximum field
width, *-specified field widths, and the %s and %c
data type.
๐—ถ๐—ณ๐—ฑ๐—ฒ๐—ณ(nฬฒaฬฒmฬฒeฬฒ, yฬฒeฬฒsฬฒ, nฬฒoฬฒ)
If the macro named by the first argument is defined
then return the second argument, otherwise the third.
If there is no third argument, the value is NULL. The
word "unix" is predefined.
๐—ถ๐—ณ๐—ฒ๐—น๐˜€๐—ฒ(aฬฒ, bฬฒ, yฬฒeฬฒsฬฒ, .ฬฒ.ฬฒ.ฬฒ)
If the first argument aฬฒ matches the second argument bฬฒ
then ๐—ถ๐—ณ๐—ฒ๐—น๐˜€๐—ฒ() returns the third argument yฬฒeฬฒsฬฒ. If the
match fails the three arguments are discarded and the
next three arguments are used until there is zero or
one arguments left, either this last argument or NULL
is returned if no other matches were found.
๐—ถ๐—ป๐—ฐ๐—น๐˜‚๐—ฑ๐—ฒ(nฬฒaฬฒmฬฒeฬฒ)
Returns the contents of the file specified in the
first argument. If the file is not found as is, look
through the include path: first the directories speciโ€
fied with -๐ˆ on the command line, then the environment
variable M4PATH, as a colon-separated list of directoโ€
ries. Include aborts with an error message if the
file cannot be included.
๐—ถ๐—ป๐—ฐ๐—ฟ(aฬฒrฬฒgฬฒ) Increments the argument by 1. The argument must be a
valid numeric string.
๐—ถ๐—ป๐—ฑ๐—ฒ๐˜…(sฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, sฬฒuฬฒbฬฒsฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ)
Returns the index of the second argument in the first
argument (e.g., ๐—ถ๐—ป๐—ฑ๐—ฒ๐˜…(๐˜๐—ต๐—ฒ ๐—พ๐˜‚๐—ถ๐—ฐ๐—ธ ๐—ฏ๐—ฟ๐—ผ๐˜„๐—ป ๐—ณ๐—ผ๐˜… ๐—ท๐˜‚๐—บ๐—ฝ๐—ฒ๐—ฑ, ๐—ณ๐—ผ๐˜…)
returns 16). If the second argument is not found
index returns -1.
๐—ถ๐—ป๐—ฑ๐—ถ๐—ฟ(mฬฒaฬฒcฬฒrฬฒoฬฒ, aฬฒrฬฒgฬฒ1ฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Indirectly calls the macro whose name is passed as the
first argument, with the remaining arguments passed as
first, ... arguments.
๐—น๐—ฒ๐—ป(aฬฒrฬฒgฬฒ) Returns the number of characters in the first arguโ€
ment. Extra arguments are ignored.
๐—บ๐Ÿฐ๐—ฒ๐˜…๐—ถ๐˜(cฬฒoฬฒdฬฒeฬฒ)
Immediately exits with the return value specified by
the first argument, 0 if none.
๐—บ๐Ÿฐ๐˜„๐—ฟ๐—ฎ๐—ฝ(tฬฒoฬฒdฬฒoฬฒ)
Allows you to define what happens at the final EOF,
usually for cleanup purposes (e.g.,
๐—บ๐Ÿฐ๐˜„๐—ฟ๐—ฎ๐—ฝ("๐—ฐ๐—น๐—ฒ๐—ฎ๐—ป๐˜‚๐—ฝ(๐˜๐—ฒ๐—บ๐—ฝ๐—ณ๐—ถ๐—น๐—ฒ)") causes the macro cleanup
to be invoked after all other processing is done).
Multiple calls to ๐—บ๐Ÿฐ๐˜„๐—ฟ๐—ฎ๐—ฝ() get inserted in sequence at
the final EOF.
๐—บ๐—ฎ๐—ธ๐—ฒ๐˜๐—ฒ๐—บ๐—ฝ(tฬฒeฬฒmฬฒpฬฒlฬฒaฬฒtฬฒeฬฒ)
Like ๐—บ๐—ธ๐˜€๐˜๐—ฒ๐—บ๐—ฝ.
๐—บ๐—ธ๐˜€๐˜๐—ฒ๐—บ๐—ฝ(tฬฒeฬฒmฬฒpฬฒlฬฒaฬฒtฬฒeฬฒ)
Invokes mkstemp(3) on the first argument, and returns
the modified string. This can be used to create
unique temporary file names.
๐—ฝ๐—ฎ๐˜€๐˜๐—ฒ(fฬฒiฬฒlฬฒeฬฒ) Includes the contents of the file specified by the
first argument without any macro processing. Aborts
with an error message if the file cannot be included.
๐—ฝ๐—ฎ๐˜๐˜€๐˜‚๐—ฏ๐˜€๐˜(sฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, rฬฒeฬฒgฬฒeฬฒxฬฒpฬฒ, rฬฒeฬฒpฬฒlฬฒaฬฒcฬฒeฬฒmฬฒeฬฒnฬฒtฬฒ)
Substitutes a regular expression in a string with a
replacement string. Usual substitution patterns
apply: an ampersand (โ€˜&โ€™) is replaced by the string
matching the regular expression. The string โ€˜\#โ€™,
where โ€˜#โ€™ is a digit, is replaced by the corresponding
back-reference.
๐—ฝ๐—ผ๐—ฝ๐—ฑ๐—ฒ๐—ณ(aฬฒrฬฒgฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Restores the ๐—ฝ๐˜‚๐˜€๐—ต๐—ฑ๐—ฒ๐—ณed definition for each argument.
๐—ฝ๐˜‚๐˜€๐—ต๐—ฑ๐—ฒ๐—ณ(mฬฒaฬฒcฬฒrฬฒoฬฒ, dฬฒeฬฒfฬฒ)
Takes the same arguments as ๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ, but it saves the
definition on a stack for later retrieval by ๐—ฝ๐—ผ๐—ฝ๐—ฑ๐—ฒ๐—ณ().
๐—ฟ๐—ฒ๐—ด๐—ฒ๐˜…๐—ฝ(sฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, rฬฒeฬฒgฬฒeฬฒxฬฒpฬฒ, rฬฒeฬฒpฬฒlฬฒaฬฒcฬฒeฬฒmฬฒeฬฒnฬฒtฬฒ)
Finds a regular expression in a string. If no further
arguments are given, it returns the first match posiโ€
tion or -1 if no match. If a third argument is proโ€
vided, it returns the replacement string, with sub-
patterns replaced.
๐˜€๐—ต๐—ถ๐—ณ๐˜(aฬฒrฬฒgฬฒ1ฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Returns all but the first argument, the remaining
arguments are quoted and pushed back with commas in
between. The quoting nullifies the effect of the
extra scan that will subsequently be performed.
๐˜€๐—ถ๐—ป๐—ฐ๐—น๐˜‚๐—ฑ๐—ฒ(fฬฒiฬฒlฬฒeฬฒ)
Similar to ๐—ถ๐—ป๐—ฐ๐—น๐˜‚๐—ฑ๐—ฒ, except it ignores any errors.
๐˜€๐—ฝ๐—ฎ๐˜€๐˜๐—ฒ(fฬฒiฬฒlฬฒeฬฒ)
Similar to ๐—ฝ๐—ฎ๐˜€๐˜๐—ฒ(), except it ignores any errors.
๐˜€๐˜‚๐—ฏ๐˜€๐˜๐—ฟ(sฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, oฬฒfฬฒfฬฒsฬฒeฬฒtฬฒ, lฬฒeฬฒnฬฒgฬฒtฬฒhฬฒ)
Returns a substring of the first argument starting at
the offset specified by the second argument and the
length specified by the third argument. If no third
argument is present it returns the rest of the string.
๐˜€๐˜†๐˜€๐—ฐ๐—บ๐—ฑ(cฬฒmฬฒdฬฒ) Passes the first argument to the shell. Nothing is
returned.
๐˜€๐˜†๐˜€๐˜ƒ๐—ฎ๐—น Returns the return value from the last ๐˜€๐˜†๐˜€๐—ฐ๐—บ๐—ฑ.
๐˜๐—ฟ๐—ฎ๐—ฐ๐—ฒ๐—ผ๐—ป(aฬฒrฬฒgฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Enables tracing of macro expansions for the given
arguments, or for all macros if no argument is given.
๐˜๐—ฟ๐—ฎ๐—ฐ๐—ฒ๐—ผ๐—ณ๐—ณ(aฬฒrฬฒgฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Disables tracing of macro expansions for the given
arguments, or for all macros if no argument is given.
๐˜๐—ฟ๐—ฎ๐—ป๐˜€๐—น๐—ถ๐˜(sฬฒtฬฒrฬฒiฬฒnฬฒgฬฒ, mฬฒaฬฒpฬฒfฬฒrฬฒoฬฒmฬฒ, mฬฒaฬฒpฬฒtฬฒoฬฒ)
Transliterate the characters in the first argument
from the set given by the second argument to the set
given by the third. You cannot use tr(1) style abbreโ€
viations.
๐˜‚๐—ป๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ(nฬฒaฬฒmฬฒeฬฒ1ฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Removes the definition for the macros specified by its
arguments.
๐˜‚๐—ป๐—ฑ๐—ถ๐˜ƒ๐—ฒ๐—ฟ๐˜(aฬฒrฬฒgฬฒ, .ฬฒ.ฬฒ.ฬฒ)
Flushes the named output queues (or all queues if no
arguments).
๐˜‚๐—ป๐—ถ๐˜… A pre-defined macro for testing the OS platform.
__๐—น๐—ถ๐—ป๐—ฒ__ Returns the current file's line number.
__๐—ณ๐—ถ๐—น๐—ฒ__ Returns the current file's name.
๐„๐—๐ˆ๐“ ๐’๐“๐€๐“๐”๐’
The ๐—บ๐Ÿฐ utility exits 0 on success, and >0 if an error occurs.
But note that the ๐—บ๐Ÿฐ๐—ฒ๐˜…๐—ถ๐˜ macro can modify the exit status, as can
the -๐„ flag.
๐’๐“๐€๐๐ƒ๐€๐‘๐ƒ๐’
The ๐—บ๐Ÿฐ utility is compliant with the IEEE Std 1003.1-2008
(โ€œPOSIX.1โ€) specification.
The flags [-๐—ฑ๐„๐—ด๐ˆ๐๐—ผ๐˜] and the macros ๐—ฏ๐˜‚๐—ถ๐—น๐˜๐—ถ๐—ป, ๐—ฒ๐˜€๐˜†๐˜€๐—ฐ๐—บ๐—ฑ, ๐—ฒ๐˜…๐—ฝ๐—ฟ, ๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐˜,
๐—ถ๐—ป๐—ฑ๐—ถ๐—ฟ, ๐—ฝ๐—ฎ๐˜€๐˜๐—ฒ, ๐—ฝ๐—ฎ๐˜๐˜€๐˜‚๐—ฏ๐˜€๐˜, ๐—ฟ๐—ฒ๐—ด๐—ฒ๐˜…๐—ฝ, ๐˜€๐—ฝ๐—ฎ๐˜€๐˜๐—ฒ, ๐˜‚๐—ป๐—ถ๐˜…, __๐—น๐—ถ๐—ป๐—ฒ__, and
__๐—ณ๐—ถ๐—น๐—ฒ__ are extensions to that specification.
๐—บ๐—ฎ๐—ธ๐—ฒ๐˜๐—ฒ๐—บ๐—ฝ is not supposed to be a synonym for ๐—บ๐—ธ๐˜€๐˜๐—ฒ๐—บ๐—ฝ, but instead
to be an insecure temporary file name creation function. It is
marked by IEEE Std 1003.1-2008 (โ€œPOSIX.1โ€) as being obsolescent and
should not be used if portability is a concern.
The output format of ๐˜๐—ฟ๐—ฎ๐—ฐ๐—ฒ๐—ผ๐—ป and ๐—ฑ๐˜‚๐—บ๐—ฝ๐—ฑ๐—ฒ๐—ณ are not specified in any
standard, are likely to change and should not be relied upon. The
current format of tracing is closely modelled on ๐—ด๐—ป๐˜‚-๐—บ๐Ÿฐ, to allow
๐—ฎ๐˜‚๐˜๐—ผ๐—ฐ๐—ผ๐—ป๐—ณ to work.
The built-ins ๐—ฝ๐˜‚๐˜€๐—ต๐—ฑ๐—ฒ๐—ณ and ๐—ฝ๐—ผ๐—ฝ๐—ฑ๐—ฒ๐—ณ handle macro definitions as a
stack. However, ๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ interacts with the stack in an undefined
way. In this implementation, ๐—ฑ๐—ฒ๐—ณ๐—ถ๐—ป๐—ฒ replaces the top-most definiโ€
tion only. Other implementations may erase all definitions on the
stack instead.
All built-ins do expand without arguments in many other ๐—บ๐Ÿฐ.
Many other ๐—บ๐Ÿฐ have dire size limitations with respect to buffer
sizes.
๐€๐”๐“๐‡๐Ž๐‘๐’
Ozan Yigit <oฬฒzฬฒ@ฬฒsฬฒiฬฒsฬฒ.ฬฒyฬฒoฬฒrฬฒkฬฒuฬฒ.ฬฒcฬฒaฬฒ> and Richard A. O'Keefe
<oฬฒkฬฒ@ฬฒgฬฒoฬฒaฬฒnฬฒnฬฒaฬฒ.ฬฒcฬฒsฬฒ.ฬฒrฬฒmฬฒiฬฒtฬฒ.ฬฒOฬฒZฬฒ.ฬฒAฬฒUฬฒ>.
GNU-m4 compatibility extensions by Marc Espie
<eฬฒsฬฒpฬฒiฬฒeฬฒ@ฬฒcฬฒvฬฒsฬฒ.ฬฒoฬฒpฬฒeฬฒnฬฒbฬฒsฬฒdฬฒ.ฬฒoฬฒrฬฒgฬฒ>.
COSMOPOLITAN June 15, 2017 BSD