4
This is a very primitive line based preprocessor, for times when using
5
a C preprocessor isn't an option.
11
Any line starting with a hash # and a letter is considered to be a
12
preprocessor instruction. Other lines starting with a hash are ignored
15
The following preprocessor instructions are recognised.
18
#define VARIABLE STRING
31
#elif VARIABLE==STRING
32
#elif VARIABLE!=STRING
36
#includesubst @VAR@FILENAME
39
#filter FILTER1 FILTER2 ... FILTERn
40
#unfilter FILTER1 FILTER2 ... FILTERn
42
Whitespace is significant -- for instance, '#define TEST foo' is not
43
the same as '#define TEST foo '. The first defines TEST to be a three
44
character string, the second defines it to be four characters long.
46
The conditionals (#ifdef, #ifndef, #if, #else, #elifdef, #elifndef,
47
#elif, #endif) can be nested to arbitrary depth.
49
An #else section can be followed by an #else section, as in:
59
Whether this is wise or not is left up to the reader to decide.
61
The #elifdef, #elifndef, and #elif instructions are equivalent to
62
#else instructions combined with the relevant conditional. For
71
...could be written as:
81
#else blocks need not come last, which can lead to some odd
85
included if foo is defined
87
included if foo is not defined
89
included if foo is defined and bar is defined
91
included if either foo or bar are not defined
94
Note in particular the following holds:
104
That is to say, #else is relative to whether the previous conditional
105
was included _only_. It isn't an "and" relationship with previous
106
conditionals. This is arguably a bug.
108
The #error instruction stops execution at this point with a fatal
109
error. The error message will include the given STRING.
111
The #include instruction causes the specified file FILENAME to be
112
recursively processed, as if it was inserted at the current position
113
in the file. This means conditionals can be started in one file and
114
ended in another, although this practice is strongly discouraged.
115
There is no predefined limit to the depth of #includes, and there is
116
no restriction on self-inclusion, so care should be taken to avoid
119
The #includesubst instruction behaves like #include, except that any
120
variables in @ATSIGNS@ are expanded, like the substitution filter.
122
The #expand instruction will print the given STRING with variable
123
substitutions. See the substitution section below.
125
The #literal instruction will print the given STRING with a newline,
126
with absolutely no other fixups, guaranteed. This can be used to
127
output lines starting with a #, which would otherwise be stripped out
130
The #filter instruction enables the specified filters. You can turn
131
off filters using #unfilter. See the Filters section below.
137
Variables consist of any alphanumeric string. They are defined using
138
the -D command line argument and the #define instruction.
140
To define all environment variables, so that you can use __HOME__,
141
etc, with #expand, use the -E argument. Note that arguments that use
142
non-word characters (like "!") are not included. (In particular,
143
cygwin is known to include all kinds of weird characters in its
144
environment variables.)
146
Two special variables are predefined, FILE and LINE. They can be
147
passed to #define and #undef, but FILE is automatically redefined at
148
the top of each file, and LINE is increased by one at the start of
151
The variable '1' is predefined with value 1. The variable '0' is not
152
defined. This allows constructs such as
158
...to be used to quickly comment out large sections. Note, however,
159
that these are simply variables, and can be redefined. This is
160
strongly discouraged.
166
In any line starting with the instruction #expand, variable names
167
contained between double underscores, like __THIS__, are expanded to
168
their string values, or the empty string if they are not defined.
170
For example to print the current filename:
172
#expand <!-- This file is automatically generated from __FILE__ -->
174
Normal lines are not affected.
176
See also the substitution filter below.
182
The following filters are supported:
185
Strips blank lines from the output.
188
Strips everything from the first two consecutive slash (/)
189
characters until the end of the line.
192
Collapses sequences of spaces into a single space.
195
Replaces occurances of "@foo@" by the value of the variable
196
"foo". If @foo@ is not defined, the preprocessor will terminate
200
Replaces occurances of "@foo@" by the value of the variable
201
"foo". If @foo@ is not defined, the empty string is used instead.
203
Filters are run in alphabetical order, on a per-line basis.
206
Command Line Arguments
207
----------------------
210
preprocessor.pl [-Dvariable[=value]] [-E] [-Ffilter]
211
[-Ifilename] [-d] [--] filenames...
214
Set variable to 1 before processing the files.
217
Set variable to value before processing the files.
220
Define all environment variables.
223
Enables the specified filter.
226
Include filename before any other files.
229
Run through the files on the command line, listing the files they
230
depend on given the specified environment variables and filters.
231
Doesn't recurse into those files. The output is given as one
232
dependency per line, and filenames are given relative to the
236
Set the type of line endings to use. "type" can be either "cr",
237
"lf", or "crlf". The default is whatever your platform uses for
238
perl's "\n" character.
241
Indicates the end of non-filename arguments.
244
Indicates that input should come from standard input.
246
If no filenames are provided, standard input is used instead. If many
247
files are provided, they are processed sequentially, as if they were
248
one big file. -I files are handled before the other files, in the
249
order specified, but after handling any -D, -E, -F, and -d arguments.
255
Feel free to e-mail me if you have any questions:
256
Ian Hickson <preprocessor@software.hixie.ch>