fpp [option]... [input-file [output-file]]
fpp is the preprocessor used by the NAG Fortran compiler. It optionally accepts two filenames as arguments: input-file and output-file are, respectively, the input file read and the output file written by the preprocessor. By default standard input and output are used.
Operating System:
unix, __unix and __SVR4;
Hardware:
sun, __sun, sparc and __sparc.
A source file may contain fpp tokens. An fpp token is similar to a Fortran token, and is one of:
#define name token-string
This is the definition of an fpp variable. Wherever ‘name’ appears in the source lines following the definition, ‘token-string’ will be substituted for it.
#define name([argname1[,argname2]...]) token-string
This is the definition of a function-like macro. Occurrences of the macro ‘name’ followed by a comma-separated list of arguments within parentheses are substituted by the token string produced from the macro definition. Every occurrence of an argument name from the macro definition's argument list is substituted by the token sequence of the corresponding macro actual argument.
Note that there must be no space or tab between the macro name and the left parenthesis of the argument list in this directive; otherwise, it will be interpreted as a simple macro definition with the left parenthesis treated as the first character of the replacement token-string.
#undef name
Remove any macro definition for name, whether such a definition was
produced by a -D option, a #define directive or
by default.
No additional tokens are permitted on the directive line after the name.
Read in the contents of filename at this location.
The lines read in from the file are processed by fpp as if they were part of
the current file.
When the <filename> notation is used, filename is only
searched for in the standard “include” directories.
See the -I and -Y options above for more
detail.
No additional tokens are permitted in the directive line after the final
‘"’ or ‘>’.
Generate line control information for the next pass of the compiler.
The line-number must be an unsigned integer literal constant, and
specifies the line number of the following line.
If "filename" does not appear, the current filename is
unchanged.
The “#else” and “#elif” parts are optional.
There may be more than one “#elif” part.
Each condition is an expression consisting of fpp constants, macros and
macro functions.
Condition expressions are similar to cpp expressions, and may
contain any cpp operations and operands with the exception
of C long, octal and hexadecimal constants.
Additionally, fpp will accept and evaluate the Fortran logical operations
.NOT., .AND., .OR., .EQV., .NEQV.,
the relational operators .GT., .LT., .LE., .GE.,
and the logical constants .TRUE. and .FALSE..
However, it does not affect:
The scope of the macro effect can be limited by means
of the #undef directive.
For example:
After this directive, ‘name’ will not be interpreted by fpp
as a macro or variable name.
This directive has no effect if ‘name’ is not a macro name.
Condition is a constant expression, as specified below.
Subsequent lines up to the first matching #elif, #else or
#endif directive appear in the output only if
the condition is true.
The lines following a #elif directive appear
in the output only if
If the condition is true, all subsequent matching #elif and #else
directives are ignored up to the matching #endif.
The lines following a #else directive appear in the output only if
all previous conditions in the construct were false.
The macro function ‘defined’ can be used in a constant expression;
it is true if and only if its argument is a defined macro name.
The following operations are allowed.
for #include "filename":
defined(name) or defined name
expands to .TRUE. if name is defined as a macro,
and to .FALSE. otherwise.
In fixed form there are limitations on macro expansion
in the label part of the line (columns 1-5):
fpp can not determine with certainty how to interpret the ‘call p’
token sequence. It could be considered as a macro name.
The current implementation does the following:
warning: possibly incorrect substitution of macro callp
It should be noted that this situation appears only when
preprocessing fixed form source code and when the
blank character is not being interpreted as a token delimiter.
It should be said also that if a macro name coincides
with a keyword beginning part, as in the following case:
There are three kinds of diagnostic messages:
nagfor(1).
5.5
Including external files
There are two forms of file inclusion:
#include "filename"
and
#include <filename>
5.6
Line number control
#line-number ["filename"]
5.7
Conditional selection of source text
There are three forms of conditional selection of source text:
#if condition_1
block_1
#elif condition_2
block_2
#else
block_n
#endif
#ifdef name
block_1
#elif condition
block_2
#else
block_n
#endif
#ifndef name
block_1
#elif condition
block_2
#else
block_n
#endif
6
Details
6.1
Scope of macro or variable definitions
The scope of a definition begins from the place of its definition and encloses
all the source lines (and source lines from #included files) from that
definition line to the end of the current file.
6.2
End of macro definition
A macro definition can be of any length but is only one logical line.
These may be split across multiple physical lines by ending each line but
the last with the macro continuation character ‘\’ (backslash).
The backslash and newline are not part of the replacement text.
The macro definition is ended by a newline that is not preceded by a backslash.
#define long_macro_name(x,\
y) x*y
6.3
Function-like macro definition
The number of macro call arguments must be the same as the number of arguments
in the corresponding macro definition.
An error is produced if a macro is used with the wrong number of arguments.
6.4
Cancelling macro definitions
#undef name
6.5
Conditional source code selection
#if condition
Only these items, integer literal constants, and names can be used within a
constant expression.
Names that are not macro names are treated as if they were ‘0’.
The C operation ‘!=’ (not equal) can be used in #if or
#elif directives, but cannot be used in a #define directive,
where the character ‘!’ is interpreted as the start of
a Fortran comment.
6.6
Including external files
Files are searched as follows:
for #include <filename>:
Fpp directives (lines beginning with the # character)
can be placed anywhere in the source code,
in particular immediately before a Fortran continuation line.
The only exception is the prohibition of fpp
directives within a macro call divided on several lines by means
of continuation symbols.
6.7
Comments
Fpp permits comments of two kinds:
6.8
Macro functions
The macro function
6.9
Macro expression
If, during expansion of a macro, the column width of a
line exceeds column 72 (for fixed form) or column 132
(for free form), fpp inserts appropriate continuation lines.
In the fixed form when the -Xw option has been specified
an ambiguity may appear if a macro call occurs in a statement
position and a macro name begins or coincides with a Fortran
keyword. For example, in the following text:
#define call p(x) call f(x)
call p(0)
In the above example the macro expansion would be performed
and the following warning would be output:
#define INT INTEGER*8
INTEGER k
then in accordance with the described algorithm, the
INTEGER keyword will be found earlier than the INT
macro name. Thus, there will be no warning when
preprocessing such a macro definition.
7
Diagnostics
The messages produced by fpp are intended to be self-explanatory.
The line number and filename where the error occurred are printed
along with the diagnostic.
8
See Also