home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d01xx
/
d0160.lha
/
M4
/
M4.man
< prev
next >
Wrap
Text File
|
1988-10-02
|
15KB
|
463 lines
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