xref: /freebsd/usr.bin/m4/m4.1 (revision 06c3fb27)
1.\"	$NetBSD: m4.1,v 1.23 2012/04/08 22:00:39 wiz Exp $
2.\"
3.\" Copyright (c) 1989, 1993
4.\"	The Regents of the University of California.  All rights reserved.
5.\"
6.\" This code is derived from software contributed to Berkeley by
7.\" Ozan Yigit at York University.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\" 3. Neither the name of the University nor the names of its contributors
18.\"    may be used to endorse or promote products derived from this software
19.\"    without specific prior written permission.
20.\"
21.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31.\" SUCH DAMAGE.
32.\"
33.Dd June 21, 2023
34.Dt M4 1
35.Os
36.Sh NAME
37.Nm m4
38.Nd macro language processor
39.Sh SYNOPSIS
40.Nm
41.Op Fl EGgPs
42.Oo
43.Sm off
44.Fl D Ar name Op No = Ar value
45.Sm on
46.Oc
47.Op Fl d Oo Oo +- Oc Ns Ar flags Oc
48.Op Fl I Ar dirname
49.Op Fl o Ar filename
50.Op Fl t Ar macro
51.Op Fl U Ns Ar name
52.Op Ar
53.Sh DESCRIPTION
54The
55.Nm
56utility is a macro processor that can be used as a front end to any
57language (e.g., C, ratfor, fortran, lex, and yacc).
58If no input files are given,
59.Nm
60reads from the standard input,
61otherwise files specified on the command line are
62processed in the given order.
63Input files can be regular files, files in the m4 include paths, or a
64single dash
65.Pq Sq - ,
66denoting standard input.
67.Nm
68writes
69the processed text to the standard output, unless told otherwise.
70.Pp
71Macro calls have the form name(argument1[, argument2, ..., argumentN]).
72.Pp
73There cannot be any space following the macro name and the open
74parenthesis
75.Pq Sq \&( .
76If the macro name is not followed by an open
77parenthesis it is processed with no arguments.
78.Pp
79Macro names consist of a leading alphabetic or underscore
80possibly followed by alphanumeric or underscore characters, e.g.,
81valid macro names match the pattern
82.Dq [a-zA-Z_][a-zA-Z0-9_]* .
83.Pp
84In arguments to macros, leading unquoted space, tab, and newline
85.Pq Sq \en
86characters are ignored.
87To quote strings, use left and right single quotes
88.Pq e.g., Sq \ \&this is a string with a leading space .
89You can change the quote characters with the
90.Ic changequote
91built-in macro.
92.Pp
93Most built-ins do not make any sense without arguments, and hence are not
94recognized as special when not followed by an open parenthesis.
95.Pp
96The options are as follows:
97.Bl -tag -width Ds
98.It Fl D Ns Ar name Ns Oo = Ns Ar value Oc , Fl -define Ns = Ns Ar name Ns Oo = Ns Ar value Oc
99Define the symbol
100.Ar name
101to have some value (or
102.Dv NULL ) .
103.It Fl d Oo Oo +|- Oc Ns Ar flags Oc , Fl -debug Ns = Ns Oo Oo +|- Oc Ns Ar flags Oc
104Set or unset trace flags.
105The trace flags are as follows:
106.Bl -tag -width Ds
107.It Ar a
108print macro arguments.
109.It Ar c
110print macro expansion over several lines.
111.It Ar e
112print result of macro expansion.
113.It Ar f
114print filename location.
115.It Ar l
116print line number.
117.It Ar q
118quote arguments and expansion with the current quotes.
119.It Ar t
120start with all macros traced.
121.It Ar x
122number macro expansions.
123.It Ar V
124turn on all options.
125.El
126.Pp
127If
128.Qq +
129or
130.Qq -
131is used, the specified flags are added to or removed from the set of
132active trace flags, respectively; otherwise, the specified flags
133replace the set of active trace flags.
134.Pp
135Specifying this option without an argument is equivalent to specifying
136it with the argument
137.Qq aeq .
138.Pp
139By default, trace is set to
140.Qq eq .
141.It Fl E , Fl -fatal-warnings
142Set warnings to be fatal.
143When a single
144.Fl E
145flag is specified, if warnings are issued, execution
146continues but
147.Nm
148will exit with a non-zero exit status.
149When multiple
150.Fl E
151flags are specified, execution will halt upon issuing the
152first warning and
153.Nm
154will exit with a non-zero exit status.
155This behavior matches GNU m4 1.4.9 and later.
156.It Fl G , Fl -traditional
157Disable GNU compatibility mode (see
158.Fl g
159below).
160.It Fl g , Fl -gnu
161Enable GNU compatibility mode.
162In this mode,
163.Ic translit
164handles simple character ranges (e.g.,
165.Sq a-z ) ,
166regular expressions mimic Emacs behavior,
167multiple
168.Ic m4wrap
169calls are handled as a stack,
170the number of diversions is unlimited,
171empty names for macro definitions are allowed,
172.Ic undivert
173can be used to include files,
174and
175.Ic eval
176understands
177.Sq 0rbase:value
178numbers.
179.It Fl I Ar dirname , Fl -include Ns = Ns Ar dirname
180Add directory
181.Ar dirname
182to the include path.
183.It Fl o Ar filename , Fl -error-output Ns = Ns Ar filename
184Send trace output to
185.Ar filename .
186.It Fl P , Fl -prefix-builtins
187Prefix all built-in macros with
188.Sq m4_ .
189For example, instead of writing
190.Ic define ,
191use
192.Ic m4_define .
193.It Fl s , Fl -synclines
194Output line synchronization directives, suitable for
195.Xr cpp 1 .
196.It Fl t Ar macro , Fl -trace Ns = Ns Ar macro
197Turn tracing on for
198.Ar macro .
199.It Fl U Ns Ar name , Fl -undefine Ns = Ns Ar name
200Undefine the symbol
201.Ar name .
202.El
203.Sh SYNTAX
204.Nm
205provides the following built-in macros.
206They may be redefined, losing their original meaning.
207Return values are null unless otherwise stated.
208.Bl -tag -width changequote
209.It Fn builtin name
210Calls a built-in by its
211.Fa name ,
212overriding possible redefinitions.
213.It Fn changecom startcomment endcomment
214Changes the start comment and end comment sequences.
215Comment sequences may be up to five characters long.
216The default values are the hash sign
217and the newline character.
218.Bd -literal -offset indent
219# This is a comment
220.Ed
221.Pp
222With no arguments, comments are turned off.
223With one single argument, the end comment sequence is set
224to the newline character.
225.It Fn changequote beginquote endquote
226Defines the open quote and close quote sequences.
227Quote sequences may be up to five characters long.
228The default values are the backquote character and the quote
229character.
230.Bd -literal -offset indent
231`Here is a quoted string'
232.Ed
233.Pp
234With no arguments, the default quotes are restored.
235With one single argument, the close quote sequence is set
236to the newline character.
237.It Fn decr arg
238Decrements the argument
239.Fa arg
240by 1.
241The argument
242.Fa arg
243must be a valid numeric string.
244.It Fn define name value
245Define a new macro named by the first argument
246.Fa name
247to have the
248value of the second argument
249.Fa value .
250Each occurrence of
251.Sq $n
252(where
253.Ar n
254is 0 through 9) is replaced by the
255.Ar n Ns 'th
256argument.
257.Sq $0
258is the name of the calling macro.
259Undefined arguments are replaced by a null string.
260.Sq $#
261is replaced by the number of arguments;
262.Sq $*
263is replaced by all arguments comma separated;
264.Sq $@
265is the same as
266.Sq $*
267but all arguments are quoted against further expansion.
268.It Fn defn name ...
269Returns the quoted definition for each argument.
270This can be used to rename
271macro definitions (even for built-in macros).
272.It Fn divert num
273There are 10 output queues (numbered 0-9).
274At the end of processing
275.Nm
276concatenates all the queues in numerical order to produce the
277final output.
278Initially the output queue is 0.
279The divert
280macro allows you to select a new output queue (an invalid argument
281passed to divert causes output to be discarded).
282.It Ic divnum
283Returns the current output queue number.
284.It Ic dnl
285Discard input characters up to and including the next newline.
286.It Fn dumpdef name ...
287Prints the names and definitions for the named items, or for everything
288if no arguments are passed.
289.It Fn errprint msg
290Prints the first argument on the standard error output stream.
291.It Fn esyscmd cmd
292Passes its first argument to a shell and returns the shell's standard output.
293Note that the shell shares its standard input and standard error with
294.Nm .
295.It Fn eval expr[,radix[,minimum]]
296Computes the first argument as an arithmetic expression using 32-bit
297arithmetic.
298Operators are the standard C ternary, arithmetic, logical,
299shift, relational, bitwise, and parentheses operators.
300You can specify
301octal, decimal, and hexadecimal numbers as in C.
302The optional second argument
303.Fa radix
304specifies the radix for the result and the optional third argument
305.Fa minimum
306specifies the minimum number of digits in the result.
307.It Fn expr expr
308This is an alias for
309.Ic eval .
310.It Fn format formatstring arg1 ...
311Returns
312.Fa formatstring
313with escape sequences substituted with
314.Fa arg1
315and following arguments, in a way similar to
316.Xr printf 3 .
317This built-in is only available in GNU-m4 compatibility mode, and the only
318parameters implemented are there for autoconf compatibility:
319left-padding flag, an optional field width, a maximum field width,
320*-specified field widths, and the %s and %c data type.
321.It Fn ifdef name yes no
322If the macro named by the first argument is defined then return the second
323argument, otherwise the third.
324If there is no third argument, the value is
325.Dv NULL .
326The word
327.Qq unix
328is predefined.
329.It Fn ifelse a b yes ...
330If the first argument
331.Fa a
332matches the second argument
333.Fa b
334then
335.Fn ifelse
336returns
337the third argument
338.Fa yes .
339If the match fails the three arguments are
340discarded and the next three arguments are used until there is
341zero or one arguments left, either this last argument or
342.Dv NULL
343is returned if no other matches were found.
344.It Fn include name
345Returns the contents of the file specified in the first argument.
346If the file is not found as is, look through the include path:
347first the directories specified with
348.Fl I
349on the command line, then the environment variable
350.Ev M4PATH ,
351as a colon-separated list of directories.
352Include aborts with an error message if the file cannot be included.
353.It Fn incr arg
354Increments the argument by 1.
355The argument must be a valid numeric string.
356.It Fn index string substring
357Returns the index of the second argument in the first argument (e.g.,
358.Ic index(the quick brown fox jumped, fox)
359returns 16).
360If the second
361argument is not found index returns \-1.
362.It Fn indir macro arg1 ...
363Indirectly calls the macro whose name is passed as the first argument,
364with the remaining arguments passed as first, ... arguments.
365.It Fn len arg
366Returns the number of characters in the first argument.
367Extra arguments
368are ignored.
369.It Fn m4exit code
370Immediately exits with the return value specified by the first argument,
3710 if none.
372.It Fn m4wrap todo
373Allows you to define what happens at the final
374.Dv EOF ,
375usually for cleanup purposes (e.g.,
376.Ic m4wrap("cleanup(tempfile)")
377causes the macro cleanup to be
378invoked after all other processing is done).
379.Pp
380Multiple calls to
381.Fn m4wrap
382get inserted in sequence at the final
383.Dv EOF .
384.It Fn maketemp template
385Like
386.Ic mkstemp .
387.It Fn mkstemp template
388Invokes
389.Xr mkstemp 3
390on the first argument, and returns the modified string.
391This can be used to create unique
392temporary file names.
393.It Fn paste file
394Includes the contents of the file specified by the first argument without
395any macro processing.
396Aborts with an error message if the file cannot be
397included.
398.It Fn patsubst string regexp replacement
399Substitutes a regular expression in a string with a replacement string.
400Usual substitution patterns apply: an ampersand
401.Pq Sq \&&
402is replaced by the string matching the regular expression.
403The string
404.Sq \e# ,
405where
406.Sq #
407is a digit, is replaced by the corresponding back-reference.
408.It Fn popdef arg ...
409Restores the
410.Ic pushdef Ns ed
411definition for each argument.
412.It Fn pushdef macro def
413Takes the same arguments as
414.Ic define ,
415but it saves the definition on a
416stack for later retrieval by
417.Fn popdef .
418.It Fn regexp string regexp replacement
419Finds a regular expression in a string.
420If no further arguments are given,
421it returns the first match position or \-1 if no match.
422If a third argument
423is provided, it returns the replacement string, with sub-patterns replaced.
424.It Fn shift arg1 ...
425Returns all but the first argument, the remaining arguments are
426quoted and pushed back with commas in between.
427The quoting
428nullifies the effect of the extra scan that will subsequently be
429performed.
430.It Fn sinclude file
431Similar to
432.Ic include ,
433except it ignores any errors.
434.It Fn spaste file
435Similar to
436.Fn paste ,
437except it ignores any errors.
438.It Fn substr string offset length
439Returns a substring of the first argument starting at the offset specified
440by the second argument and the length specified by the third argument.
441If no third argument is present it returns the rest of the string.
442.It Fn syscmd cmd
443Passes the first argument to the shell.
444Nothing is returned.
445.It Ic sysval
446Returns the return value from the last
447.Ic syscmd .
448.It Fn traceon arg ...
449Enables tracing of macro expansions for the given arguments, or for all
450macros if no argument is given.
451.It Fn traceoff arg ...
452Disables tracing of macro expansions for the given arguments, or for all
453macros if no argument is given.
454.It Fn translit string mapfrom mapto
455Transliterate the characters in the first argument from the set
456given by the second argument to the set given by the third.
457You cannot use
458.Xr tr 1
459style abbreviations.
460.It Fn undefine name1 ...
461Removes the definition for the macros specified by its arguments.
462.It Fn undivert arg ...
463Flushes the named output queues (or all queues if no arguments).
464.It Ic unix
465A pre-defined macro for testing the OS platform.
466.It Ic __line__
467Returns the current file's line number.
468.It Ic __file__
469Returns the current file's name.
470.El
471.Sh EXIT STATUS
472.Ex -std m4
473.Pp
474But note that the
475.Ic m4exit
476macro can modify the exit status, as can the
477.Fl E
478flag.
479.Sh SEE ALSO
480.Rs
481.\" 4.4BSD PSD:17
482.%A B. W. Kernighan
483.%A D. M. Ritchie
484.%I AT&T Bell Laboratories
485.%T The M4 Macro Processor
486.%R Computing Science Technical Report
487.%N 59
488.%D July 1977
489.Re
490.Sh STANDARDS
491The
492.Nm
493utility is compliant with the
494.St -p1003.1-2008
495specification.
496.Pp
497The flags
498.Op Fl dEGgIPot
499and the macros
500.Ic builtin ,
501.Ic esyscmd ,
502.Ic expr ,
503.Ic format ,
504.Ic indir ,
505.Ic paste ,
506.Ic patsubst ,
507.Ic regexp ,
508.Ic spaste ,
509.Ic unix ,
510.Ic __line__ ,
511and
512.Ic __file__
513are extensions to that specification.
514.Pp
515.Ic maketemp
516is not supposed to be a synonym for
517.Ic mkstemp ,
518but instead to be an insecure temporary file name creation function.
519It is marked by
520.St -p1003.1-2008
521as being obsolescent and should not be used if portability is a concern.
522.Pp
523The output format of
524.Ic traceon
525and
526.Ic dumpdef
527are not specified in any standard,
528are likely to change and should not be relied upon.
529The current format of tracing is closely modelled on
530.Nm gnu-m4 ,
531to allow
532.Nm autoconf
533to work.
534.Pp
535The built-ins
536.Ic pushdef
537and
538.Ic popdef
539handle macro definitions as a stack.
540However,
541.Ic define
542interacts with the stack in an undefined way.
543In this implementation,
544.Ic define
545replaces the top-most definition only.
546Other implementations may erase all definitions on the stack instead.
547.Pp
548All built-ins do expand without arguments in many other
549.Nm .
550.Pp
551Many other
552.Nm
553have dire size limitations with respect to buffer sizes.
554.Sh AUTHORS
555.An -nosplit
556.An Ozan Yigit Aq Mt oz@sis.yorku.ca
557and
558.An Richard A. O'Keefe Aq Mt ok@goanna.cs.rmit.OZ.AU .
559.Pp
560GNU-m4 compatibility extensions by
561.An Marc Espie Aq Mt espie@cvs.openbsd.org .
562