Annotation of 43BSDReno/share/doc/ps1/17.m4/m4.ms, revision 1.1.1.1

1.1       root        1: .\"    @(#)m4  6.1 (Berkeley) 5/8/86
                      2: .\"
                      3: .EH 'PS1:17-%''The M4 Macro Processor'
                      4: .OH 'The M4 Macro Processor''PS1:17-%'
                      5: .if n .ls 2
                      6: .tr _\(em
                      7: .tr *\(**
                      8: .de UC
                      9: \&\\$3\s-1\\$1\\s0\&\\$2
                     10: ..
                     11: .de IT
                     12: .if n .ul
                     13: \&\\$3\f2\\$1\fP\&\\$2
                     14: ..
                     15: .de UL
                     16: .if n .ul
                     17: \&\\$3\f3\\$1\fP\&\\$2
                     18: ..
                     19: .de P1
                     20: .DS I 3n
                     21: .if n .ls 2
                     22: .nf
                     23: .if n .ta 5 10 15 20 25 30 35 40 45 50 55 60
                     24: .if t .ta .4i .8i 1.2i 1.6i 2i 2.4i 2.8i 3.2i 3.6i 4i 4.4i 4.8i 5.2i 5.6i
                     25: .if t .tr -\(mi|\(bv'\(fm^\(no*\(**
                     26: .tr `\(ga'\(aa
                     27: .if t .tr _\(ul
                     28: .ft 3
                     29: .lg 0
                     30: ..
                     31: .de P2
                     32: .ps \\n(PS
                     33: .vs \\n(VSp
                     34: .ft R
                     35: .if n .ls 2
                     36: .tr --||''^^!!
                     37: .if t .tr _\(em
                     38: .fi
                     39: .lg
                     40: .DE
                     41: .if t .tr _\(em
                     42: ..
                     43: .hw semi-colon
                     44: .hw estab-lished
                     45: .hy 14
                     46: .              \"2=not last lines; 4= no -xx; 8=no xx-
                     47: .              \"special chars in programs
                     48: .      \" start of text
                     49: .\".RP
                     50: .....TR 59
                     51: .....TM 77-1273-6 39199 39199-11
                     52: .ND "July 1, 1977"
                     53: .TL
                     54: The M4 Macro Processor
                     55: .AU "MH 2C-518" 6021
                     56: Brian W. Kernighan
                     57: .AU "MH 2C-517" 3770
                     58: Dennis M. Ritchie
                     59: .AI
                     60: .MH
                     61: .AB
                     62: .PP
                     63: M4 is a macro processor available on
                     64: .UX
                     65: and
                     66: .UC GCOS .
                     67: Its primary use has been as a
                     68: front end for Ratfor for those
                     69: cases where parameterless macros 
                     70: are not adequately powerful.
                     71: It has also been used for languages as disparate as C and Cobol.
                     72: M4 is particularly suited for functional languages like Fortran, PL/I and C
                     73: since macros are specified in a functional notation.
                     74: .PP
                     75: M4 provides features seldom found even in much larger
                     76: macro processors, 
                     77: including
                     78: .IP "  \(bu"
                     79: arguments
                     80: .IP "  \(bu"
                     81: condition testing
                     82: .IP "  \(bu"
                     83: arithmetic capabilities
                     84: .IP "  \(bu"
                     85: string and substring functions
                     86: .IP "  \(bu"
                     87: file manipulation
                     88: .LP
                     89: .PP
                     90: This paper is a user's manual for M4.
                     91: .AE
                     92: .CS 6 0 6 0 0 1
                     93: .if t .2C
                     94: .SH
                     95: Introduction
                     96: .PP
                     97: A macro processor is a useful way to enhance a programming language,
                     98: to make it more palatable
                     99: or more readable,
                    100: or to tailor it to a particular application.
                    101: The
                    102: .UL #define
                    103: statement in C
                    104: and the analogous
                    105: .UL define
                    106: in Ratfor
                    107: are examples of the basic facility provided by
                    108: any macro processor _
                    109: replacement of text by other text.
                    110: .PP
                    111: The M4 macro processor is an extension of a macro processor called M3
                    112: which was written by D. M. Ritchie
                    113: for the AP-3 minicomputer;
                    114: M3 was in turn based on a macro processor implemented for [1].
                    115: Readers unfamiliar with the basic ideas of macro processing
                    116: may wish to read some of the discussion there.
                    117: .PP
                    118: M4 is a suitable front end for Ratfor and C,
                    119: and has also been used successfully with Cobol.
                    120: Besides the straightforward replacement of one string of text by another,
                    121: it provides
                    122: macros with arguments,
                    123: conditional macro expansion,
                    124: arithmetic,
                    125: file manipulation,
                    126: and some specialized string processing functions.
                    127: .PP
                    128: The basic operation of M4
                    129: is to copy its input to its output.
                    130: As the input is read, however, each alphanumeric ``token''
                    131: (that is, string of letters and digits) is checked.
                    132: If it is the name of a macro,
                    133: then the name of the macro is replaced by its defining text,
                    134: and the resulting string is pushed back onto the
                    135: input to be rescanned.
                    136: Macros may be called with arguments, in which case the arguments are collected
                    137: and substituted into the right places in the defining text
                    138: before it is rescanned.
                    139: .PP
                    140: M4 provides a collection of about twenty built-in
                    141: macros
                    142: which perform various useful operations;
                    143: in addition, the user can define new macros.
                    144: Built-ins and user-defined macros work exactly the same way, except that
                    145: some of the built-in macros have side effects
                    146: on the state of the process.
                    147: .SH
                    148: Usage
                    149: .PP
                    150: On
                    151: .UC UNIX ,
                    152: use
                    153: .P1
                    154: m4 [files]
                    155: .P2
                    156: Each argument file is processed in order;
                    157: if there are no arguments, or if an argument
                    158: is `\-',
                    159: the standard input is read at that point.
                    160: The processed text is written on the standard output,
                    161: which may be captured for subsequent processing with
                    162: .P1
                    163: m4 [files] >outputfile
                    164: .P2
                    165: On
                    166: .UC GCOS ,
                    167: usage is identical, but the program is called
                    168: .UL \&./m4 .
                    169: .SH
                    170: Defining Macros
                    171: .PP
                    172: The primary built-in function of M4
                    173: is
                    174: .UL define ,
                    175: which is used to define new macros.
                    176: The input
                    177: .P1
                    178: define(name, stuff)
                    179: .P2
                    180: causes the string
                    181: .UL name
                    182: to be defined as
                    183: .UL stuff .
                    184: All subsequent occurrences of
                    185: .UL name
                    186: will be replaced by
                    187: .UL stuff .
                    188: .UL name
                    189: must be alphanumeric and must begin with a letter
                    190: (the underscore \(ul counts as a letter).
                    191: .UL stuff
                    192: is any text that contains balanced parentheses;
                    193: it may stretch over multiple lines.
                    194: .PP
                    195: Thus, as a typical example,
                    196: .P1
                    197: define(N, 100)
                    198:  ...
                    199: if (i > N)
                    200: .P2
                    201: defines
                    202: .UL N
                    203: to be 100, and uses this ``symbolic constant'' in a later
                    204: .UL if
                    205: statement.
                    206: .PP
                    207: The left parenthesis must immediately follow the word
                    208: .UL define ,
                    209: to signal that
                    210: .UL define
                    211: has arguments.
                    212: If a macro or built-in name is not followed immediately by `(',
                    213: it is assumed to have no arguments.
                    214: This is the situation for
                    215: .UL N
                    216: above;
                    217: it is actually a macro with no arguments,
                    218: and thus when it is used there need be no (...) following it.
                    219: .PP
                    220: You should also notice that a macro name is only recognized as such
                    221: if it appears surrounded by non-alphanumerics.
                    222: For example, in
                    223: .P1
                    224: define(N, 100)
                    225:  ...
                    226: if (NNN > 100)
                    227: .P2
                    228: the variable 
                    229: .UL NNN
                    230: is absolutely unrelated to the defined macro
                    231: .UL N ,
                    232: even though it contains a lot of
                    233: .UL N 's.
                    234: .PP
                    235: Things may be defined in terms of other things.
                    236: For example,
                    237: .P1
                    238: define(N, 100)
                    239: define(M, N)
                    240: .P2
                    241: defines both M and N to be 100.
                    242: .PP
                    243: What happens if
                    244: .UL N
                    245: is redefined?
                    246: Or, to say it another way, is
                    247: .UL M 
                    248: defined as
                    249: .UL N
                    250: or as 100?
                    251: In M4,
                    252: the latter is true _
                    253: .UL M
                    254: is 100, so even if
                    255: .UL N 
                    256: subsequently changes,
                    257: .UL M
                    258: does not.
                    259: .PP
                    260: This behavior arises because
                    261: M4 expands macro names into their defining text as soon as it possibly can.
                    262: Here, that means that when the string
                    263: .UL N
                    264: is seen as the arguments of
                    265: .UL define
                    266: are being collected, it is immediately replaced by 100;
                    267: it's just as if you had said
                    268: .P1
                    269: define(M, 100)
                    270: .P2
                    271: in the first place.
                    272: .PP
                    273: If this isn't what you really want, there are two ways out of it.
                    274: The first, which is specific to this situation,
                    275: is to interchange the order of the definitions:
                    276: .P1
                    277: define(M, N)
                    278: define(N, 100)
                    279: .P2
                    280: Now
                    281: .UL M
                    282: is defined to be the string
                    283: .UL N ,
                    284: so when you ask for 
                    285: .UL M
                    286: later, you'll always get the value of
                    287: .UL N 
                    288: at that time
                    289: (because the
                    290: .UL M
                    291: will be replaced by
                    292: .UL N
                    293: which will be replaced by 100).
                    294: .SH
                    295: Quoting
                    296: .PP
                    297: The more general solution is to delay the expansion of
                    298: the arguments of
                    299: .UL define 
                    300: by
                    301: .ul
                    302: quoting
                    303: them.
                    304: Any text surrounded by the single quotes \(ga and \(aa
                    305: is not expanded immediately, but has the quotes stripped off.
                    306: If you say
                    307: .P1
                    308: define(N, 100)
                    309: define(M, `N')
                    310: .P2
                    311: the quotes around the
                    312: .UL N
                    313: are stripped off as the argument is being collected,
                    314: but they have served their purpose, and 
                    315: .UL M
                    316: is defined as
                    317: the string
                    318: .UL N ,
                    319: not 100.
                    320: The general rule is that M4 always strips off
                    321: one level of single quotes whenever it evaluates
                    322: something.
                    323: This is true even outside of
                    324: macros.
                    325: If you want the word
                    326: .UL define
                    327: to appear in the output,
                    328: you have to quote it in the input,
                    329: as in
                    330: .P1
                    331:        `define' = 1;
                    332: .P2
                    333: .PP
                    334: As another instance of the same thing, which is a bit more surprising,
                    335: consider redefining
                    336: .UL N :
                    337: .P1
                    338: define(N, 100)
                    339:  ...
                    340: define(N, 200)
                    341: .P2
                    342: Perhaps regrettably, the
                    343: .UL N
                    344: in the second definition is
                    345: evaluated as soon as it's seen;
                    346: that is, it is
                    347: replaced by
                    348: 100, so it's as if you had written
                    349: .P1
                    350: define(100, 200)
                    351: .P2
                    352: This statement is ignored by M4, since you can only define things that look
                    353: like names, but it obviously doesn't have the effect you wanted.
                    354: To really redefine 
                    355: .UL N ,
                    356: you must delay the evaluation by quoting:
                    357: .P1
                    358: define(N, 100)
                    359:  ...
                    360: define(`N', 200)
                    361: .P2
                    362: In M4,
                    363: it is often wise to quote the first argument of a macro.
                    364: .PP
                    365: If \` and \' are not convenient for some reason,
                    366: the quote characters can be changed with the built-in
                    367: .UL changequote :
                    368: .P1
                    369: changequote([, ])
                    370: .P2
                    371: makes the new quote characters the left and right brackets.
                    372: You can restore the original characters with just
                    373: .P1
                    374: changequote
                    375: .P2
                    376: .PP
                    377: There are two additional built-ins related to
                    378: .UL define .
                    379: .UL undefine
                    380: removes the definition of some macro or built-in:
                    381: .P1
                    382: undefine(`N')
                    383: .P2
                    384: removes the definition of
                    385: .UL N .
                    386: (Why are the quotes absolutely necessary?)
                    387: Built-ins can be removed with 
                    388: .UL undefine ,
                    389: as in
                    390: .P1
                    391: undefine(`define')
                    392: .P2
                    393: but once you remove one, you can never get it back.
                    394: .PP
                    395: The built-in 
                    396: .UL ifdef
                    397: provides a way to determine if a macro is currently defined.
                    398: In particular, M4 has pre-defined the names
                    399: .UL unix
                    400: and
                    401: .UL gcos
                    402: on the corresponding systems, so you can
                    403: tell which one you're using:
                    404: .P1
                    405: ifdef(`unix', `define(wordsize,16)' )
                    406: ifdef(`gcos', `define(wordsize,36)' )
                    407: .P2
                    408: makes a definition appropriate for the particular machine.
                    409: Don't forget the quotes!
                    410: .PP
                    411: .UL ifdef
                    412: actually permits three arguments;
                    413: if the name is undefined, the value of
                    414: .UL ifdef
                    415: is then the third argument, as in
                    416: .P1
                    417: ifdef(`unix', on UNIX, not on UNIX)
                    418: .P2
                    419: .SH
                    420: Arguments
                    421: .PP
                    422: So far we have discussed the simplest form of macro processing _
                    423: replacing one string by another (fixed) string.
                    424: User-defined macros may also have arguments, so different invocations
                    425: can have different results.
                    426: Within the replacement text for a macro
                    427: (the second argument of its
                    428: .UL define )
                    429: any occurrence of
                    430: .UL $n
                    431: will be replaced by the 
                    432: .UL n th
                    433: argument when the macro
                    434: is actually used.
                    435: Thus, the macro
                    436: .UL bump ,
                    437: defined as
                    438: .P1
                    439: define(bump, $1 = $1 + 1)
                    440: .P2
                    441: generates code to increment its argument by 1:
                    442: .P1
                    443: bump(x)
                    444: .P2
                    445: is
                    446: .P1
                    447: x = x + 1
                    448: .P2
                    449: .PP
                    450: A macro can have as many arguments as you want,
                    451: but only the first nine are accessible,
                    452: through
                    453: .UL $1
                    454: to
                    455: .UL $9 .
                    456: (The macro name itself is
                    457: .UL $0 ,
                    458: although that is less commonly used.)
                    459: Arguments that are not supplied are replaced by null strings,
                    460: so
                    461: we can define a macro
                    462: .UL cat
                    463: which simply concatenates its arguments, like this:
                    464: .P1
                    465: define(cat, $1$2$3$4$5$6$7$8$9)
                    466: .P2
                    467: Thus
                    468: .P1
                    469: cat(x, y, z)
                    470: .P2
                    471: is equivalent to
                    472: .P1
                    473: xyz
                    474: .P2
                    475: .UL $4
                    476: through
                    477: .UL $9
                    478: are null, since no corresponding arguments were provided.
                    479: .PP
                    480: .PP
                    481: Leading unquoted blanks, tabs, or newlines that occur during argument collection
                    482: are discarded.
                    483: All other white space is retained.
                    484: Thus
                    485: .P1
                    486: define(a,   b   c)
                    487: .P2
                    488: defines
                    489: .UL a
                    490: to be
                    491: .UL b\ \ \ c .
                    492: .PP
                    493: Arguments are separated by commas, but parentheses are counted properly,
                    494: so a comma ``protected'' by parentheses does not terminate an argument.
                    495: That is, in
                    496: .P1
                    497: define(a, (b,c))
                    498: .P2
                    499: there are only two arguments;
                    500: the second is literally
                    501: .UL (b,c) .
                    502: And of course a bare comma or parenthesis can be inserted by quoting it.
                    503: .SH
                    504: Arithmetic Built-ins
                    505: .PP
                    506: M4 provides two built-in functions for doing arithmetic
                    507: on integers (only).
                    508: The simplest is
                    509: .UL incr ,
                    510: which increments its numeric argument by 1.
                    511: Thus to handle the common programming situation
                    512: where you want a variable to be defined as ``one more than N'',
                    513: write
                    514: .P1
                    515: define(N, 100)
                    516: define(N1, `incr(N)')
                    517: .P2
                    518: Then
                    519: .UL N1
                    520: is defined as one more than the current value of
                    521: .UL N .
                    522: .PP
                    523: The more general mechanism for arithmetic is a built-in
                    524: called
                    525: .UL eval ,
                    526: which is capable of arbitrary arithmetic on integers.
                    527: It provides the operators
                    528: (in decreasing order of precedence)
                    529: .DS
                    530: unary + and \(mi
                    531: ** or ^        (exponentiation)
                    532: *  /  % (modulus)
                    533: +  \(mi
                    534: ==  !=  <  <=  >  >=
                    535: !              (not)
                    536: & or &&        (logical and)
                    537: \(or or \(or\(or               (logical or)
                    538: .DE
                    539: Parentheses may be used to group operations where needed.
                    540: All the operands of
                    541: an expression given to
                    542: .UL eval
                    543: must ultimately be numeric.
                    544: The numeric value of a true relation
                    545: (like 1>0)
                    546: is 1, and false is 0.
                    547: The precision in
                    548: .UL eval
                    549: is
                    550: 32 bits on
                    551: .UC UNIX
                    552: and 36 bits on
                    553: .UC GCOS .
                    554: .PP
                    555: As a simple example, suppose we want 
                    556: .UL M
                    557: to be 
                    558: .UL 2**N+1 .
                    559: Then
                    560: .P1
                    561: define(N, 3)   
                    562: define(M, `eval(2**N+1)')
                    563: .P2
                    564: As a matter of principle, it is advisable
                    565: to quote the defining text for a macro
                    566: unless it is very simple indeed
                    567: (say just a number);
                    568: it usually gives the result you want,
                    569: and is a good habit to get into.
                    570: .SH
                    571: File Manipulation
                    572: .PP
                    573: You can include a new file in the input at any time by
                    574: the built-in function
                    575: .UL include :
                    576: .P1
                    577: include(filename)
                    578: .P2
                    579: inserts the contents of
                    580: .UL filename
                    581: in place of the
                    582: .UL include
                    583: command.
                    584: The contents of the file is often a set of definitions.
                    585: The value
                    586: of
                    587: .UL include
                    588: (that is, its replacement text)
                    589: is the contents of the file;
                    590: this can be captured in definitions, etc.
                    591: .PP
                    592: It is a fatal error if the file named in
                    593: .UL include
                    594: cannot be accessed.
                    595: To get some control over this situation, the alternate form
                    596: .UL sinclude
                    597: can be used;
                    598: .UL sinclude 
                    599: (``silent include'')
                    600: says nothing and continues if it can't access the file.
                    601: .PP
                    602: It is also possible to divert the output of M4 to temporary files during processing,
                    603: and output the collected material upon command.
                    604: M4 maintains nine of these diversions, numbered 1 through 9.
                    605: If you say
                    606: .P1
                    607: divert(n)
                    608: .P2
                    609: all subsequent output is put onto the end of a temporary file
                    610: referred to as
                    611: .UL n .
                    612: Diverting to this file is stopped by another 
                    613: .UL divert 
                    614: command;
                    615: in particular,
                    616: .UL divert
                    617: or
                    618: .UL divert(0)
                    619: resumes the normal output process.
                    620: .PP
                    621: Diverted text is normally output all at once
                    622: at the end of processing,
                    623: with the diversions output in numeric order.
                    624: It is possible, however, to bring back diversions
                    625: at any time,
                    626: that is, to append them to the current diversion.
                    627: .P1
                    628: undivert
                    629: .P2
                    630: brings back all diversions in numeric order, and
                    631: .UL undivert
                    632: with arguments brings back the selected diversions
                    633: in the order given.
                    634: The act of undiverting discards the diverted stuff,
                    635: as does diverting into a diversion 
                    636: whose number is not between 0 and 9 inclusive.
                    637: .PP
                    638: The value of
                    639: .UL undivert
                    640: is
                    641: .ul
                    642: not
                    643: the diverted stuff.
                    644: Furthermore, the diverted material is
                    645: .ul
                    646: not
                    647: rescanned for macros.
                    648: .PP
                    649: The built-in
                    650: .UL divnum
                    651: returns the number of the currently active diversion.
                    652: This is zero during normal processing.
                    653: .SH
                    654: System Command
                    655: .PP
                    656: You can run any program in the local operating system
                    657: with the
                    658: .UL syscmd
                    659: built-in.
                    660: For example,
                    661: .P1
                    662: syscmd(date)
                    663: .P2
                    664: on
                    665: .UC UNIX
                    666: runs the
                    667: .UL date
                    668: command.
                    669: Normally
                    670: .UL syscmd
                    671: would be used to create a file
                    672: for a subsequent
                    673: .UL include .
                    674: .PP
                    675: To facilitate making unique file names, the built-in
                    676: .UL maketemp
                    677: is provided, with specifications identical to the system function
                    678: .ul
                    679: mktemp:
                    680: a string of XXXXX in the argument is replaced
                    681: by the process id of the current process.
                    682: .SH
                    683: Conditionals
                    684: .PP
                    685: There is a built-in called
                    686: .UL ifelse
                    687: which enables you to perform arbitrary conditional testing.
                    688: In the simplest form,
                    689: .P1
                    690: ifelse(a, b, c, d)
                    691: .P2
                    692: compares the two strings
                    693: .UL a
                    694: and
                    695: .UL b .
                    696: If these are identical, 
                    697: .UL ifelse
                    698: returns
                    699: the string
                    700: .UL c ;
                    701: otherwise it returns
                    702: .UL d .
                    703: Thus we might define a macro called
                    704: .UL compare
                    705: which compares two strings and returns ``yes'' or ``no''
                    706: if they are the same or different.
                    707: .P1
                    708: define(compare, `ifelse($1, $2, yes, no)')
                    709: .P2
                    710: Note the quotes,
                    711: which prevent too-early evaluation of
                    712: .UL ifelse .
                    713: .PP
                    714: If the fourth argument is missing, it is treated as empty.
                    715: .PP
                    716: .UL ifelse
                    717: can actually have any number of arguments,
                    718: and thus provides a limited form of multi-way decision capability.
                    719: In the input
                    720: .P1
                    721: ifelse(a, b, c, d, e, f, g)
                    722: .P2
                    723: if the string
                    724: .UL a
                    725: matches the string
                    726: .UL b ,
                    727: the result is
                    728: .UL c .
                    729: Otherwise, if
                    730: .UL d
                    731: is the same as
                    732: .UL e ,
                    733: the result is
                    734: .UL f .
                    735: Otherwise the result is
                    736: .UL g .
                    737: If the final argument
                    738: is omitted, the result is null,
                    739: so
                    740: .P1
                    741: ifelse(a, b, c)
                    742: .P2
                    743: is
                    744: .UL c
                    745: if 
                    746: .UL a
                    747: matches
                    748: .UL b ,
                    749: and null otherwise.
                    750: .SH
                    751: String Manipulation
                    752: .PP
                    753: The built-in
                    754: .UL len
                    755: returns the length of the string that makes up its argument.
                    756: Thus
                    757: .P1
                    758: len(abcdef)
                    759: .P2
                    760: is 6, and
                    761: .UL len((a,b))
                    762: is 5.
                    763: .PP
                    764: The built-in
                    765: .UL substr
                    766: can be used to produce substrings of strings.
                    767: .UL substr(s,\ i,\ n)
                    768: returns the substring of
                    769: .UL s
                    770: that starts at the
                    771: .UL i th
                    772: position
                    773: (origin zero),
                    774: and is
                    775: .UL n
                    776: characters long.
                    777: If 
                    778: .UL n
                    779: is omitted, the rest of the string is returned,
                    780: so
                    781: .P1
                    782: substr(`now is the time', 1)
                    783: .P2
                    784: is
                    785: .P1
                    786: ow is the time
                    787: .P2
                    788: If 
                    789: .UL i
                    790: or
                    791: .UL n
                    792: are out of range, various sensible things happen.
                    793: .PP
                    794: .UL index(s1,\ s2)
                    795: returns the index (position) in
                    796: .UL s1
                    797: where the string
                    798: .UL s2
                    799: occurs, or \-1
                    800: if it doesn't occur.
                    801: As with
                    802: .UL substr ,
                    803: the origin for strings is 0.
                    804: .PP
                    805: The built-in
                    806: .UL translit
                    807: performs character transliteration.
                    808: .P1
                    809: translit(s, f, t)
                    810: .P2
                    811: modifies
                    812: .UL s
                    813: by replacing any character found in
                    814: .UL f
                    815: by the corresponding character of
                    816: .UL t .
                    817: That is,
                    818: .P1
                    819: translit(s, aeiou, 12345)
                    820: .P2
                    821: replaces the vowels by the corresponding digits.
                    822: If
                    823: .UL t
                    824: is shorter than
                    825: .UL f ,
                    826: characters which don't have an entry in
                    827: .UL t
                    828: are deleted; as a limiting case,
                    829: if
                    830: .UL t
                    831: is not present at all,
                    832: characters from 
                    833: .UL f
                    834: are deleted from 
                    835: .UL s .
                    836: So
                    837: .P1
                    838: translit(s, aeiou)
                    839: .P2
                    840: deletes vowels from 
                    841: .UL s .
                    842: .PP
                    843: There is also a built-in called
                    844: .UL dnl
                    845: which deletes all characters that follow it up to
                    846: and including the next newline;
                    847: it is useful mainly for throwing away 
                    848: empty lines that otherwise tend to clutter up M4 output.
                    849: For example, if you say
                    850: .P1
                    851: define(N, 100)
                    852: define(M, 200)
                    853: define(L, 300)
                    854: .P2
                    855: the newline at the end of each line is not part of the definition,
                    856: so it is copied into the output, where it may not be wanted.
                    857: If you add
                    858: .UL dnl
                    859: to each of these lines, the newlines will disappear.
                    860: .PP
                    861: Another way to achieve this, due to J. E. Weythman,
                    862: is
                    863: .P1
                    864: divert(-1)
                    865:        define(...)
                    866:        ...
                    867: divert
                    868: .P2
                    869: .SH
                    870: Printing
                    871: .PP
                    872: The built-in
                    873: .UL errprint
                    874: writes its arguments out on the standard error file.
                    875: Thus you can say
                    876: .P1
                    877: errprint(`fatal error')
                    878: .P2
                    879: .PP
                    880: .UL dumpdef
                    881: is a debugging aid which
                    882: dumps the current definitions of defined terms.
                    883: If there are no arguments, you get everything;
                    884: otherwise you get the ones you name as arguments.
                    885: Don't forget to quote the names!
                    886: .SH
                    887: Summary of Built-ins
                    888: .PP
                    889: Each entry is preceded by the
                    890: page number where it is described.
                    891: .DS
                    892: .tr '\'`\`
                    893: .ta .25i
                    894: 3      changequote(L, R)
                    895: 1      define(name, replacement)
                    896: 4      divert(number)
                    897: 4      divnum
                    898: 5      dnl
                    899: 5      dumpdef(`name', `name', ...)
                    900: 5      errprint(s, s, ...)
                    901: 4      eval(numeric expression)
                    902: 3      ifdef(`name', this if true, this if false)
                    903: 5      ifelse(a, b, c, d)
                    904: 4      include(file)
                    905: 3      incr(number)
                    906: 5      index(s1, s2)
                    907: 5      len(string)
                    908: 4      maketemp(...XXXXX...)
                    909: 4      sinclude(file)
                    910: 5      substr(string, position, number)
                    911: 4      syscmd(s)
                    912: 5      translit(str, from, to)
                    913: 3      undefine(`name')
                    914: 4      undivert(number,number,...)
                    915: .DE
                    916: .SH
                    917: Acknowledgements
                    918: .PP
                    919: We are indebted to Rick Becker, John Chambers,
                    920: Doug McIlroy,
                    921: and especially Jim Weythman,
                    922: whose pioneering use of M4 has led to several valuable improvements.
                    923: We are also deeply grateful to Weythman for several substantial contributions
                    924: to the code.
                    925: .SG
                    926: .SH
                    927: References
                    928: .LP
                    929: .IP [1]
                    930: B. W. Kernighan and P. J. Plauger,
                    931: .ul
                    932: Software Tools,
                    933: Addison-Wesley, Inc., 1976.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.