General-Purpose Mail Filter
Before compiling the script file,
it. The built-in preprocessor handles only file inclusion
(see include), while the rest of traditional facilities, such as
macro expansion, are supported via
m4, which is used as an
The detailed description of
m4 facilities lies far beyond
the scope of this document. You will find a complete user manual in
GNU M4 in GNU M4 macro processor. For the
rest of this section we assume the reader is sufficiently
m4 macro processor.
The external preprocessor is invoked with -s flag, instructing
it to include line synchronization information in its output, which
is subsequently used by MFL compiler for purposes of error
reporting. The initial set of macro definitions is supplied in file
pp-setup, located in the library search path16,
which is fed to the preprocessor input before the script file itself.
The default pp-setup file renames all
macro names so they all start with the prefix ‘m4_’17. It changes comment characters to ‘/*’, ‘*/’ pair,
and leaves the default quoting characters, grave (‘`’) and acute
(‘'’) accents without change. Finally, pp-setup defines the
The identifier must be the name of an optional abstract
argument to the function. This macro must be used only within a function
definition. It expands to the MFL expression that yields
true if the actual parameter is supplied for identifier.
func rcut(string text; number num) returns string do if (defined(num)) return substr(text, length(text) - num) else return text fi done
This function will return last num characters of text if num is supplied, and entire text otherwise, e.g.:
rcut("text string") ⇒ "text string" rcut("text string", 3) ⇒ "ing"
defined macro with the name of a mandatory argument
printf statement, that formats its optional
parameters in accordance with format and sends the resulting
string to the current log output (see Logging and Debugging).
See String formatting, for a description of format.
printf('Function %s returned %d', funcname, retcode)
A convenience macro. Expands to a call to
gettext (see NLS Functions).
This macro intends to compensate for the lack of array data type in MFL. It splits the string list into segments delimited by string delim. For each segment, the MFL code code is executed. The code can use the variable var to refer to the segment string.
For example, the following fragment prints names of all existing
directories listed in the
PATH environment variable:
string path getenv("PATH") string seg string_list_iterate(path, ":", seg, ` if access(seg, F_OK) echo "%seg exists" fi')
Care should be taken to properly quote its arguments. In the code
below the string
str is treated as a comma-separated list of
values. To avoid interpreting the comma as argument delimiter the
second argument must be quoted:
string_list_iterate(str, `","', seg, ` echo "next segment: " . seg')
A convenience macro, that expands to msgid verbatim. It is
intended to mark the literal strings that should appear in the
.po file, where actual call to
gettext (see NLS Functions) cannot be used. For example:
/* Mark the variable for translation: cannot use gettext here */ string message N_("Mail accepted") prog envfrom do … /* Translate and log the message */ echo gettext(message)
You can obtain the preprocessed output, without starting actual compilation, using -E command line option:
$ mailfromd -E file.mf
The output is in the form of preprocessed source code, which is sent to the standard output. This can be useful, among others, to debug your own macro definitions.
Macro definitions and deletions can be made on the command line, by using the -D and -U options. They have the following format:
Define a symbol name to have a value value. If
value is not supplied, the value is taken to be the empty
string. The value can be any string, and the macro can be
defined to take arguments, just as if it was defined from within the
input using the
For example, the following invocation defines symbol
have a value
$ mailfromf -DCOMPAT=43
A counterpart of the -D option is the option -U
(--undefine). It undefines a preprocessor symbol whose name
is given as its argument. The following example undefines the symbol
$ mailfromf -UCOMPAT
The following two options are supplied mainly for debugging purposes:
Disables the external preprocessor.
Use command as external preprocessor. Be especially careful
with this option, because
mailfromd cannot verify whether
command is actually some kind of a preprocessor or not.
It is usually located in /usr/local/share/mailfromd/8.7/include/pp-setup.
is similar to GNU m4 --prefix-builtin options. This approach
was chosen to allow for using non-GNU
m4 implementations as
This document was generated on January 3, 2019 using makeinfo.Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.