Annotation of 43BSDReno/share/doc/ps1/17.m4/m4.ms, revision 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.