home *** CD-ROM | disk | FTP | other *** search
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- NAME
- pd m4 - macro processor
-
- ORIGIN
- MetaSystems
-
- SYNOPSIS
- m4[ _o_p_t_i_o_n_s ]
-
- DESCRIPTION
- _P_d _M_4 is a un*x M4 look-alike macro processor intended as a
- front end for Ratfor, Pascal, and other languages that do
- not have a built-in macro processing capability. Pd M4
- reads standard input, the processed text is written on the
- standard output.
-
- The options and their effects are as follows:
-
- -D_n_a_m_e[=_v_a_l]
- Defines _n_a_m_e to _v_a_l or to null in _v_a_l's absence.
-
- -U_n_a_m_e
- undefines _n_a_m_e.
-
- Macro calls have the form:
-
- name(_a_r_g_1,_a_r_g_2, ..., _a_r_g_n)
-
- The ( must immediately follow the name of the macro. If the
- name of a defined macro is not followed by a (, it is taken
- to be a call of that macro with no arguments, i.e. name().
- Potential macro names consist of alphabetic letters and
- digits.
-
- Leading unquoted blanks, tabs and newlines are ignored while
- collecting arguments. Left and right single quotes are used
- to quote strings. The value of a quoted string is the
- string stripped of the quotes.
-
- When a macro name is recognized, its arguments are collected
- by searching for a matching ). If fewer arguments are sup-
- plied than are in the macro definition, the trailing argu-
- ments are taken to be null. Macro evaluation proceeds nor-
- mally during the collection of the arguments, and any commas
- or right parentheses which happen to turn up within the
- value of a nested call are as effective as those in the ori-
- ginal input text. (This is typically referred as
- _i_n_s_i_d_e-_o_u_t
- macro expansion.) After argument collection, the value of
- the macro is pushed back onto the input stream and res-
- canned.
-
-
-
-
-
- Printed 5/16/88 30 Aug 1987 1
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- _P_d _M_4 makes available the following built-in macros. They
- may be redefined, but once this is done the original meaning
- is lost. Their values are null unless otherwise stated.
-
- define usage: _d_e_f_i_n_e(_n_a_m_e [, _v_a_l])
- the second argument is installed as the value
- of the macro whose name is the first argument.
- If there is no second argument, the value is
- null. Each occurrence of $_n in the replace-
- ment text, where _n is a digit, is replaced by
- the _n-th argument. Argument 0 is the name of
- the macro; missing arguments are replaced by
- the null string.
-
- defn usage: _d_e_f_n(_n_a_m_e [, _n_a_m_e ...])
- returns the quoted definition of its
- argument(s). Useful in renaming macros.
-
- undefine usage: _u_n_d_e_f_i_n_e(_n_a_m_e [, _n_a_m_e
- ...])
- removes the definition of the macro(s) named.
- If there is more than one definition for the
- named macro, (due to previous use of _p_u_s_h_d_e_f)
- all definitions are removed.
-
- pushdef usage: _p_u_s_h_d_e_f(_n_a_m_e [, _v_a_l])
- like _d_e_f_i_n_e, but saves any previous definition
- by stacking the current definition.
-
- popdef usage: _p_o_p_d_e_f(_n_a_m_e [, _n_a_m_e ...])
- removes current definition of its argument(s),
- exposing the previous one if any.
-
- ifdef usage: _i_f_d_e_f(_n_a_m_e, _i_f-_d_e_f [,
- _i_f_n_o_t-_d_e_f])
- if the first argument is defined, the value is
- the second argument, otherwise the third. If
- there is no third argument, the value is null.
- A word indicating the current operating system
- is predefined. (e.g. _u_n_i_x or _v_m_s)
-
- shift usage: _s_h_i_f_t(_a_r_g, _a_r_g, _a_r_g, ...)
- returns all but its first argument. The other
- arguments are quoted and pushed back with com-
- mas in between. The quoting nullifies the
- effect of the extra scan that will subse-
- quently be performed.
-
- changequote usage: _c_h_a_n_g_e_q_u_o_t_e(_l_q_c_h_a_r,
- _r_q_c_h_a_r)
- change quote symbols to the first and second
- arguments. With no arguments, the quotes are
- reset back to the default characters. (i.e.,
- ).
-
-
-
-
- Printed 5/16/88 30 Aug 1987 2
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- changecom usage: _c_h_a_n_g_e_c_o_m(_l_c_c_h_a_r,
- _r_c_c_h_a_r)
- change left and right comment markers from the
- default # and newline. With no arguments, the
- comment mechanism is reset back to the default
- characters. With one argument, the left
- marker becomes the argument and the right
- marker becomes newline. With two arguments,
- both markers are affected.
-
- divert usage: _d_i_v_e_r_t(_d_i_v_n_u_m)
- _m_4 maintains 10 output streams, numbered 0-9.
- initially stream 0 is the current stream. The
- _d_i_v_e_r_t macro changes the current output stream
- to its (digit-string) argument. Output
- diverted to a stream other than 0 through 9
- disappears into bitbucket.
-
- undivert usage: _u_n_d_i_v_e_r_t([_d_i_v_n_u_m [,
- _d_i_v_n_u_m ...]])
- causes immediate output of text from diver-
- sions named as argument(s), or all diversions
- if no argument. Text may be undiverted into
- another diversion. Undiverting discards the
- diverted text. At the end of input processing,
- _M_4 forces an automatic _u_n_d_i_v_e_r_t, unless
- _m_4_w_r_a_p
- is defined.
-
- divnum usage: _d_i_v_n_u_m()
- returns the value of the current output
- stream.
-
- dnl usage: _d_n_l()
- reads and discards characters up to and
- including the next newline.
-
- ifelse usage: _i_f_e_l_s_e(_a_r_g, _a_r_g,
- _i_f-_s_a_m_e [, _i_f_n_o_t-_s_a_m_e
- | _a_r_g, _a_r_g ...])
- has three or more arguments. If the first
- argument is the same string as the second,
- then the value is the third argument. If not,
- and if there are more than four arguments, the
- process is repeated with arguments 4, 5, 6 and
- 7. Otherwise, the value is either the fourth
- string, or, if it is not present, null.
-
- incr usage: _i_n_c_r(_n_u_m)
- returns the value of its argument incremented
- by 1. The value of the argument is calculated
- by interpreting an initial digit-string as a
- decimal number.
-
- decr usage: _d_e_c_r(_n_u_m)
- returns the value of its argument decremented
-
-
-
- Printed 5/16/88 30 Aug 1987 3
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- by 1.
-
- eval usage: _e_v_a_l(_e_x_p_r_e_s_s_i_o_n)
- evaluates its argument as a constant expres-
- sion, using integer arithmetic. The evalua-
- tion mechanism is very similar to that of _c_p_p
- (#if expression). The expression can involve
- only integer constants and character con-
- stants, possibly connected by the binary
- operators
-
- * / % + - >> << < >
- <= >= == != & ^ | && ||
-
- or the unary operators - ~ ! or by the ter-
- nary operator ? : . Parentheses may be used
- for grouping. Octal numbers may be specified
- as in C.
-
- len usage: _l_e_n(_s_t_r_i_n_g)
- returns the number of characters in its argu-
- ment.
-
- index usage: _i_n_d_e_x(_s_e_a_r_c_h-_s_t_r_i_n_g,
- _s_t_r_i_n_g)
- returns the position in its first argument
- where the second argument begins (zero ori-
- gin), or -1 if the second argument does not
- occur.
-
- substr usage: _s_u_b_s_t_r(_s_t_r_i_n_g, _i_n_d_e_x
- [, _l_e_n_g_t_h])
- returns a substring of its first argument.
- The second argument is a zero origin number
- selecting the first character (internally
- treated as an expression); the third argument
- indicates the length of the substring. A
- missing third argument is taken to be large
- enough to extend to the end of the first
- string.
-
- translit usage: _t_r_a_n_s_l_i_t(_s_o_u_r_c_e,
- _f_r_o_m [, _t_o])
- transliterates the characters in its first
- argument from the set given by the second
- argument to the set given by the third. If
- the third argument is shorter than the second,
- all extra characters in the second argument
- are deleted from the first argument. If the
- third argument is missing altogether, all
- characters in the second argument are deleted
- from the first argument.
-
- include usage: _i_n_c_l_u_d_e(_f_i_l_e_n_a_m_e)
- returns the contents of the file named in the
-
-
-
- Printed 5/16/88 30 Aug 1987 4
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- argument.
-
- sinclude usage: _s_i_n_c_l_u_d_e(_f_i_l_e_n_a_m_e)
- is identical to _i_n_c_l_u_d_e, except that it says
- nothing if the file is inaccessible.
-
- paste usage: _p_a_s_t_e(_f_i_l_e_n_a_m_e)
- returns the contents of the file named in the
- argument without any processing, unlike
- _i_n_c_l_u_d_e.
-
- spaste usage: _s_p_a_s_t_e(_f_i_l_e_n_a_m_e)
- is identical to _p_a_s_t_e, except that it says
- nothing if the file is inaccessible.
-
- syscmd usage: _s_y_s_c_m_d(_c_o_m_m_a_n_d)
- executes the UNIX command given in the first
- argument. No value is returned.
-
- sysval usage: _s_y_s_v_a_l()
- is the return code from the last call to
- _s_y_s_c_m_d.
-
- maketemp usage: _m_a_k_e_t_e_m_p(_s_t_r_i_n_g)
- fills in a string of XXXXXX in its argument
- with the current process ID.
-
- m4exit usage: _m_4_e_x_i_t([_e_x_i_t_c_o_d_e])
- causes immediate exit from _m_4. Argument 1, if
- given, is the exit code; the default is 0.
-
- m4wrap usage: _m_4_w_r_a_p
- (_m_4-_m_a_c_r_o-_o_r-_b_u_i_l_t-_i_n)
- argument 1 will be pushed back at final EOF;
- example: m4wrap(`dumptable()').
-
- errprint usage: _e_r_r_p_r_i_n_t(_s_t_r [, _s_t_r,
- _s_t_r, ...])
- prints its argument(s) on stderr. If there is
- more than one argument, each argument is
- separated by a space during the output.
-
- dumpdef usage: _d_u_m_p_d_e_f([_n_a_m_e, _n_a_m_e,
- ...])
- prints current names and definitions, for the
- named items, or for all if no arguments are
- given.
-
- AUTHOR
- Ozan S. Yigit (oz)
-
- BUGS
- Pd M4 is distributed at the source level, and does not
- require an expensive license agreement.
-
-
-
-
- Printed 5/16/88 30 Aug 1987 5
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- A sufficiently complex M4 macro set is about as readable as
- APL.
-
- All complex uses of M4 require the ability to program in
- deep recursion. Previous lisp experience is recommended.
-
- Pd M4 is slower than V7 M4.
-
- EXAMPLES
- The following macro program illustrates the type of things
- that can be done with M4.
-
- changequote(<,>) define(HASHVAL,99) dnl
- define(hash,<expr(str(substr($1,1),0)%HASHVAL)>) dnl
- define(str,
- <ifelse($1,",$2,
- <str(substr(<$1>,1),<expr($2+'substr($1,0,1)')>)>)
- >) dnl
- define(KEYWORD,<$1,hash($1),>) dnl
- define(TSTART,
- <struct prehash {
- char *keyword;
- int hashval;
- } keytab[] = {>) dnl
- define(TEND,< "",0
- };>) dnl
-
- Thus a keyword table containing the keyword string and its
- pre-calculated hash value may be generated thus:
-
- TSTART
- KEYWORD("foo")
- KEYWORD("bar")
- KEYWORD("baz")
- TEND
-
- which will expand into:
- struct prehash {
- char *keyword;
- int hashval;
- } keytab[] = {
- "foo",27,
- "bar",12,
- "baz",20,
- "",0
- };
-
- Presumably, such a table would speed up the installation of
- the keywords into a dynamic hash table. (Note that the above
- macro cannot be used with _M_4, since eval does not handle
- character constants.)
-
-
-
-
- Printed 5/16/88 30 Aug 1987 6
-
-
-
-
-
-
- M4(local) UNIX Programmer's Manual M4(local)
-
-
-
- SEE ALSO
- cc(1), m4(1), cpp(1). _T_h_e _M_4 _M_a_c_r_o
- _P_r_o_c_e_s_s_o_r by B. W. Ker-
- nighan and D. M. Ritchie.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Printed 5/16/88 30 Aug 1987 7
-
-
-
-