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