Provided by: gpp_2.28-1_amd64 bug

NAME

       GPP - Generic Preprocessor

SYNOPSIS

         gpp [-{o|O} outfile] [-I/include/path ...]
             [-Dname=val ...] [-z|+z] [-x] [-m]
             [-C|-T|-H|-X|-P|-U ... [-M ...]]
             [-n|+n] [+c<n> str1 str2] [+s<n> str1 str2 c]
             [-c str1] [--nostdinc] [--nocurinc]
             [--curdirinclast] [--warninglevel n]
             [--includemarker str] [--include file]
             [infile]

         gpp --help

         gpp --version

DESCRIPTION

       GPP  is  a  general-purpose  preprocessor  with  customizable  syntax,  suitable  for  a  wide  range  of
       preprocessing tasks. Its independence from any programming language makes it  much  more  versatile  than
       cpp, while its syntax is lighter and more flexible than that of m4.

       GPP  is  targeted  at  all  common  preprocessing  tasks  where  cpp  is  not  suitable and where no very
       sophisticated features are needed. In order to be able to  process  equally  efficiently  text  files  or
       source  code  in  a  variety  of languages, the syntax used by GPP is fully customizable. The handling of
       comments and strings is especially advanced.

       Initially, GPP only understands a minimal set of built-in macros, called meta-macros.  These  meta-macros
       allow  the  definition  of  user  macros  as  well  as  some  basic  operations  forming  the core of the
       preprocessing system, including conditional tests, arithmetic evaluation, wildcard  matching  (globbing),
       and  syntax  specification.  All  user  macro  definitions  are  global  -- i.e., they remain valid until
       explicitly removed; meta-macros cannot be redefined. With each user macro definition GPP keeps  track  of
       the corresponding syntax specification so that a macro can be safely invoked regardless of any subsequent
       change in operating mode.

       In  addition  to  macros,  GPP  understands comments and strings, whose syntax and behavior can be widely
       customized to fit any particular purpose.  Internally comments and strings are the same construction,  so
       everything that applies to comments applies to strings as well.

OPTIONS

       GPP  recognizes  the  following  command-line  switches and options.  Note that the -nostdinc, -nocurinc,
       -curdirinclast, -warninglevel, and -includemarker options from version 2.1 and earlier are deprecated and
       should not be used.  Use the "long option" variants instead (--nostdinc, etc.).

       -h --help
              Print a short help message.

       --version
              Print version information.

       -o outfile
              Specify a file to which all output should be sent (by default,  everything  is  sent  to  standard
              output).

       -O outfile
              Specify a file to which all output should be sent; output is simultaneously sent to stdout.

       -I/include/path
              Specify  a  path where the #include meta-macro will look for include files if they are not present
              in the current directory. The default is /usr/include if no -I option is  specified.  Multiple  -I
              options may be specified to look in several directories.

       -Dname=val
              Define the user macro name as equal to val. This is strictly equivalent to using the #define meta-
              macro,  but  makes  it possible to define macros from the command-line. If val makes references to
              arguments or other macros, it should conform to the syntax of the mode specified on  the  command-
              line.  Starting with version 2.1, macro argument naming is allowed on the command-line. The syntax
              is as follows: -Dmacro(arg1,...)=definition.  The  arguments  are  specified  in  C-style  syntax,
              without  any  whitespace,  but  the  definition  should  still  conform  to the syntax of the mode
              specified on the command-line.

       +z     Set text mode to Unix mode (LF terminator). Any  CR  character  in  the  input  is  systematically
              discarded. This is the default under Unix systems.

       -z     Set  text mode to DOS mode (CR-LF terminator). In this mode all CR characters are removed from the
              input, and all output LF characters are converted to CR-LF. This is the default if GPP is compiled
              with the WIN_NT option.

       -x     Enable the use of the #exec meta-macro. Since #exec includes the  output  of  an  arbitrary  shell
              command line, it may cause a potential security threat, and is thus disabled unless this option is
              specified.

       -m     Enable automatic mode switching to the cpp compatibility mode if the name of an included file ends
              in `.h' or `.c'. This makes it possible to include C header files with only minor modifications.

       -n     Prevent  newline or whitespace characters from being removed from the input when they occur as the
              end of a macro call or of a comment. By default, when a newline or whitespace character forms  the
              end  of  a  macro  or  a  comment  it is parsed as part of the macro call or comment and therefore
              removed from output. Use the -n option to keep the last character in the input stream  if  it  was
              whitespace or a newline. This is activated in cpp and Prolog modes.

       +n     The  opposite  of -n. This is the default in all modes except cpp and Prolog. Note that +n must be
              placed after -C or -P in order to have any effect.

       -U arg1 ... arg9
              User-defined mode. The nine following command-line arguments are  taken  to  be  respectively  the
              macro  start  sequence,  the  macro  end sequence for a call without arguments, the argument start
              sequence, the argument separator, the argument end sequence, the list of characters to  stack  for
              argument  balancing,  the list of characters to unstack, the string to be used for referring to an
              argument by number, and finally the quote character (if there is none an empty  string  should  be
              provided).   These  settings apply both to user macros and to meta-macros, unless the -M option is
              used to define other settings for meta-macros. See the section on syntax  specification  for  more
              details.

       -M arg1 ... arg7
              User-defined  mode  specifications for meta-macros. This option can only be used together with -U.
              The seven following command-line arguments are taken to be respectively the macro start  sequence,
              the  macro  end  sequence  for a call without arguments, the argument start sequence, the argument
              separator, the argument end sequence, the list of characters to stack for argument balancing,  and
              the list of characters to unstack.  See below for more details.

       (default mode)
              The default mode is a vaguely cpp-like mode, but it does not handle comments, and presents various
              incompatibilities with cpp.  Typical meta-macros and user macros look like this:

                #define x y
                macro(arg,...)

              This mode is equivalent to

                -U "" "" "(" "," ")" "(" ")" "#" "\\"
                -M "#" "\n" " " " " "\n" "(" ")"

       -C     cpp  compatibility  mode.  This  is  the  mode where GPP's behavior is the closest to that of cpp.
              Unlike in the default mode, meta-macro expansion occurs only at the  beginning  of  lines,  and  C
              comments and strings are understood. This mode is equivalent to

                -n -U "" "" "(" "," ")" "(" ")" "#" ""
                -M "\n#\w" "\n" " " " " "\n" "" ""
                +c "/*" "*/" +c "//" "\n" +c "\\\n" ""
                +s "\"" "\"" "\\" +s "'" "'" "\\"

       -T     TeX-like mode. In this mode, typical meta-macros and user macros look like this:

                \define{x}{y}
                \macro{arg}{...}

              No comments are understood. This mode is equivalent to

                -U "\\" "" "{" "}{" "}" "{" "}" "#" "@"

       -H     HTML-like mode. In this mode, typical meta-macros and user macros look like this:

                <#define x|y>
                <#macro arg|...>

              No comments are understood. This mode is equivalent to

                -U "<#" ">" "\B" "|" ">" "<" ">" "#" "\\"

       -X     XHTML-like mode. In this mode, typical meta-macros and user macros look like this:

                <#define x|y/>
                <#macro arg|.../>

              No comments are understood. This mode is equivalent to

                -U "<#" "/>" "\B" "|" "/>" "<" ">" "#" "\\"

       -P     Prolog-compatible cpp-like mode. This mode differs from the cpp compatibility mode by its handling
              of comments, and is equivalent to

                -n -U "" "" "(" "," ")" "(" ")" "#" ""
                -M "\n#\w" "\n" " " " " "\n" "" ""
                +ccss "\!o/*" "*/" +ccss "%" "\n" +ccii "\\\n" ""
                +s "\"" "\"" "" +s "\!#'" "'" ""

       +c<n> str1 str2
              Specify  comments.  Any  unquoted  occurrence  of  str1  will be interpreted as the beginning of a
              comment. All input up to the first following occurrence of str2 will be discarded. This option may
              be used multiple times to specify different types of comment delimiters.  The  optional  parameter
              <n> can be specified to alter the behavior of the comment and, e.g., turn it into a string or make
              it ignored under certain circumstances, see below.

       -c str1
              Un-specify  comments  or strings. The comment/string specification whose start sequence is str1 is
              removed. This is useful to alter the built-in comment specifications of a standard mode  --  e.g.,
              the cpp compatibility mode.

       +s<n> str1 str2 c
              Specify strings. Any unquoted occurrence of str1 will be interpreted as the beginning of a string.
              All  input  up  to  the  first  following  occurrence  of  str2  will  be output as is without any
              evaluation. The delimiters themselves are output. If c is non-empty, its first character  is  used
              as  a  string-quote character -- i.e., a character whose presence immediately before an occurrence
              of str2 prevents it from terminating the string.  The optional parameter <n> can be  specified  to
              alter the behavior of the string and, e.g., turn it into a comment, enable macro evaluation inside
              the string, or make the string specification ignored under certain circumstances. See below.

       -s str1
              Un-specify comments or strings. Identical to -c.

       --include file
              Process file before infile

       --nostdinc
              Do not look for include files in the standard directory /usr/include.

       --nocurinc
              Do not look for include files in the current directory.

       --curdirinclast
              Look  for include files in the current directory after the directories specified by -I rather than
              before them.

       --warninglevel n
              Set warning level to n (0, 1 or 2). Default is 2 (most verbose).

       --includemarker str
              keep track of #include directives by inserting a marker in the output stream. The  format  of  the
              marker  is  determined  by  str,  which  must  contain  three  occurrences  of the character % (or
              equivalently ?). The first occurrence is replaced with the line number, the second with  the  file
              name,  and  the  third with 1, 2 or blank. When this option is specified in default, cpp or Prolog
              mode, GPP does its best to ensure that line numbers are the same in the output as in the input  by
              inserting blank lines in the place of definitions or comments.

       infile Specify an input file from which GPP reads its input. If no input file is specified, input is read
              from standard input.

SYNTAX SPECIFICATION

       The  syntax of a macro call is as follows: it must start with a sequence of characters matching the macro
       start sequence as specified in the current mode, followed immediately by the name  of  the  macro,  which
       must  be  a valid identifier -- i.e., a sequence of letters, digits, or underscores ("_"). The macro name
       must be followed by a short macro end sequence if the macro  has  no  arguments,  or  by  a  sequence  of
       arguments  initiated  by  an  argument  start  sequence.  The  various arguments are then separated by an
       argument separator, and the macro ends with a long macro end sequence.

       In all cases, the parameters of the current context -- i.e., the  arguments  passed  to  the  body  being
       evaluated -- can be referred to by using an argument reference sequence followed by a digit between 1 and
       9.   Alternatively, macro parameters may be named (see below). Furthermore, to avoid interference between
       the GPP syntax and the contents of the input file, a quote character is provided. The quote character can
       be used to prevent the interpretation of a macro call, comment, or string as anything but plain text. The
       quote character "protects" the following character,  and  always  gets  removed  during  evaluation.  Two
       consecutive quote characters evaluate as a single quote character.

       Finally,  to facilitate proper argument delimitation, certain characters can be "stacked" when they occur
       in a macro argument, so that the argument separator or macro end sequence are not parsed if the  argument
       body  is  not  balanced.  This allows nesting macro calls without using quotes. If an improperly balanced
       argument is needed, quote characters should be added in front of  some  stacked  characters  to  make  it
       balanced.

       The  macro  construction  sequences described above can be different for meta-macros and for user macros:
       this is the case in cpp mode, for example.  Note  that,  since  meta-macros  can  only  have  up  to  two
       arguments,  the  delimitation  rules for the second argument are somewhat sloppier, and unquoted argument
       separator sequences are allowed in the second argument of a meta-macro.

       Unless one of the standard operating modes is selected, the  above  syntax  sequences  can  be  specified
       either  on the command-line, using the -M and -U options respectively for meta-macros and user macros, or
       inside an input file via the #mode meta  and  #mode  user  meta-macro  calls.  In  both  cases  the  mode
       description  consists  of nine parameters for user macro specifications, namely the macro start sequence,
       the short macro end sequence, the argument start sequence, the argument separator,  the  long  macro  end
       sequence,  the string listing characters to stack, the string listing characters to unstack, the argument
       reference sequence, and finally the quote character.  As  explained  below,  these  sequences  should  be
       supplied  using  the  syntax  of C strings; they must start with a non-alphanumeric character, and in the
       first five strings special matching sequences can be used (see below). If the argument  corresponding  to
       the  quote  character  is  the  empty  string,  that argument's functionality is disabled. For meta-macro
       specifications there are only seven parameters, as the argument reference sequence  and  quote  character
       are shared with the user macro syntax.

       The structure of a comment/string is as follows: it must start with a sequence of characters matching the
       given  comment/string  start  sequence, and always ends at the first occurrence of the comment/string end
       sequence, unless it is preceded by an odd number of occurrences of the string-quote character (if such  a
       character  has  been  specified).  In  certain  cases  comment/strings  can  be specified to enable macro
       evaluation inside the comment/string; in that case, if a quote character has been defined for  macros  it
       can  be  used as well to prevent the comment/string from ending, with the difference that the macro quote
       character is always removed from output whereas the string-quote character is always  output.  Also  note
       that  under  certain  circumstances  a  comment/string  specification  can be disabled, in which case the
       comment/string start sequence is simply ignored. Finally, it is possible  to  specify  a  string  warning
       character  whose  presence  inside a comment/string will cause GPP to output a warning (this is useful to
       locate unterminated strings in cpp mode).  Note that input files are not allowed to contain  unterminated
       comments/strings.

       A  comment/string  specification can be declared from within the input file using the #mode comment meta-
       macro call (or equivalently #mode string), in which case the number of C strings to be given as arguments
       to describe the comment/string can be anywhere between two and four: the first two arguments  (mandatory)
       are  the  start  sequence  and  the end sequence, and can make use of the special matching sequences (see
       below).  They may not start with alphanumeric characters. The first character of the third  argument,  if
       there  is  one, is used as the string-quote character (use an empty string to disable the functionality),
       and the first character of the fourth argument, if there is one, is used as the string-warning character.
       A specification may also be given from the command-line, in which case there must  be  two  arguments  if
       using the +c option and three if using the +s option.

       The  behavior  of a comment/string is specified by a three-character modifier string, which may be passed
       as an optional argument either to the +c/+s command-line options or to  the  #mode  comment/#mode  string
       meta-macros.  If  no  modifier string is specified, the default value is "ccc" for comments and "sss" for
       strings.  The first character corresponds to the behavior inside meta-macro calls  (including  user-macro
       definitions  since  these come inside a #define meta-macro call), the second character corresponds to the
       behavior inside user-macro parameters, and the third character corresponds to the behavior outside of any
       macro call. Each of these characters can take the following values:

       i      disable the comment/string specification.

       c      comment (neither evaluated nor output).

       s      string (the string and its delimiter sequences are output as-is).

       q      quoted string (the string is output as-is, without the delimiter sequences).

       C      evaluated comment (macros are evaluated, but output is discarded).

       S      evaluated string (macros are evaluated, delimiters are output).

       Q      evaluated quoted string (macros are evaluated, delimiters are not output).

       Important note: any occurrence of a comment/string start sequence inside another comment/string is always
       ignored, even if macro evaluation is enabled. In other  words,  comments/strings  cannot  be  nested.  In
       particular,  the  `Q' modifier can be a convenient way of defining a syntax for temporarily disabling all
       comment and string specifications.

       Syntax specification strings should always be provided as C strings, whether they are given as  arguments
       to  a  #mode  meta-macro call or on the command-line of a Unix shell. If command-line arguments are given
       via another method than a standard Unix shell, then the shell behavior must  be  emulated  --  i.e.,  the
       surrounding  ""  quotes  should  be  removed,  all  occurrences  of  `\\'  should be replaced by a single
       backslash, and similarly `\"' should be replaced by `"'.  Sequences like `\n' are recognized by  GPP  and
       should be left as is.

       Special  sequences  matching certain subsets of the character set can be used. They are of the form `\x',
       where x is one of:

       b      matches any sequence of one or more spaces or tab characters (`\b' is identical to ` ').

       w      matches any sequence of zero or more spaces or tab characters.

       B      matches any sequence of one or more spaces, tabs or newline characters.

       W      matches any sequence of zero or more spaces, tabs or newline characters.

       a      an alphabetic character (`a' to `z' and `A' to `Z').

       A      an alphabetic character, or a space, tab or newline.

       #      a digit (`0' to `9').

       i      an identifier character. The set of matched characters is customizable using the #mode charset  id
              command.  The  default setting matches alphanumeric characters and underscores (`a' to `z', `A' to
              `Z', `0' to `9' and `_').

       t      a tab character.

       n      a newline character.

       o      an operator character. The set of matched characters is customizable using the  #mode  charset  op
              command.  The  default  setting matches all characters in "+-*/\^<>=`~:.?@#&!%|", except in Prolog
              mode where `!', `%' and `|' are not matched.

       O      an operator character or a parenthesis character. The set  of  additional  matched  characters  in
              comparison  with  `\o' is customizable using the #mode charset par command. The default setting is
              to have the characters in "()[]{}" as parentheses.

       Moreover, all of these matching subsets except `\w' and `\W' can be negated by inserting a `!'  --  i.e.,
       by writing `\!x' instead of `\x'.

       Note  an  important  distinctive  feature  of  start  sequences:  when  the first character of a macro or
       comment/string start sequence is ` ' or one of the above special sequences, it is not taken to be part of
       the sequence itself but is used instead as a context check: for example a start sequence  beginning  with
       `\n'  matches only at the beginning of a line, but the matching newline character is not taken to be part
       of the sequence.  Similarly a start sequence beginning with  ` '  matches  only  if  some  whitespace  is
       present,  but the matching whitespace is not considered to be part of the start sequence and is therefore
       sent to output. If a context check is performed at the very beginning of a file (or more generally of any
       body to be evaluated), the result is the same as  matching  with  a  newline  character  (this  makes  it
       possible for a cpp-mode file to start with a meta-macro call).

       Two  special  syntax  rules  were  added  in  version  2.1. First, argument references (#n) are no longer
       evaluated when they are outside of macro calls and definitions. However, they are no  longer  allowed  to
       appear (unless protected by quote characters) inside a call to a defined user macro; the current behavior
       (backwards compatible) is to remove them silently from the input if that happens.

       Second,  if  the end sequence (either for macros or comments) consists of a single newline character, and
       if delimitation rules lead to evaluation in a context where the final newline character  is  absent,  GPP
       silently  ignores  the  missing newline instead of producing an error. The main consequence is that meta-
       macro calls can now be nested in a simple way in standard, cpp and Prolog modes.

EVALUATION RULES

       Input is read sequentially and interpreted according to the rules of the current mode. All input text  is
       first  matched  against  the  specified  comment/string start sequences of the current mode (except those
       which are disabled by the  `i'  modifier),  unless  the  body  being  evaluated  is  the  contents  of  a
       comment/string  whose  modifier  enables  macro  evaluation.   The  most  recently defined comment/string
       specifications are checked for first. Important note: comments may not appear between the name of a macro
       and its arguments (doing so results in undefined behavior).

       Anything that is not a comment/string is then matched against a possible meta-macro  call,  and  if  that
       fails  too,  against  a  possible  user-macro call. All remaining text undergoes substitution of argument
       reference sequences by the relevant  argument  text  (empty  unless  the  body  being  evaluated  is  the
       definition of a user macro) and removal of the quote character if there is one.

       Note  that  meta-macro arguments are passed to the meta-macro prior to any evaluation (although the meta-
       macro may choose to evaluate them, see meta-macro descriptions below). In the case  of  the  #mode  meta-
       macro, GPP temporarily adds a comment/string specification to enable recognition of C strings ("...") and
       prevent  any  evaluation  inside  them,  so  no  interference of the characters being put in the C string
       arguments to #mode with the current syntax is to be feared.

       On the other hand, the arguments to a user macro are systematically evaluated, and then passed as context
       parameters to the macro definition body, which gets evaluated with that environment. The  only  exception
       is  when  the  macro  definition  is  empty, in which case its arguments are not evaluated. Note that GPP
       temporarily switches back to the mode in which the macro was defined in order to evaluate it,  so  it  is
       perfectly  safe  to change the operating mode between the time a macro is defined and the time when it is
       called. Conversely, if a user macro wishes to work with the current mode instead of the one that was used
       to define it it needs to start with a #mode restore call and end with a #mode save call.

       A user macro may be defined with named arguments (see #define description below). In that case, when  the
       macro  definition  is  being  evaluated,  each  named  parameter  causes  a  temporary virtual user-macro
       definition to be created; such a macro may be called only without arguments and simply returns  the  text
       of the corresponding argument.

       Note that, since macros are evaluated when they are called rather than when they are defined, any attempt
       to  call a recursive macro causes undefined behavior except in the very specific case when the macro uses
       #undef to erase itself after finitely many loop iterations.

       Finally, a special case occurs when a user macro whose definition does not involve any arguments (neither
       named arguments nor the argument reference sequence) is called in a mode where the short  user-macro  end
       sequence is empty (e.g., cpp or TeX mode). In that case it is assumed to be an alias macro: its arguments
       are  first evaluated in the current mode as usual, but instead of being passed to the macro definition as
       parameters (which would cause them to be discarded) they are actually appended to the  macro  definition,
       using  the  syntax  rules of the mode in which the macro was defined, and the resulting text is evaluated
       again. It is therefore important to note that, in the case of a macro alias, the arguments  actually  get
       evaluated twice in two potentially different modes.

META-MACROS

       These  macros  are  always predefined. Their actual calling sequence depends on the current mode; here we
       use cpp-like notation.

       #define x y
              This defines the user macro x as y. y can be any valid GPP input, and may  for  example  refer  to
              other  macros.  x  must  be  an  identifier (i.e., a sequence of alphanumeric characters and `_'),
              unless named arguments are specified.  If  x  is  already  defined,  the  previous  definition  is
              overwritten.  If  no  second argument is given, x will be defined as a macro that outputs nothing.
              Neither x nor y are evaluated; the macro definition is only evaluated when it is called, not  when
              it is declared.

              It  is  also  possible  to  name the arguments in a macro definition: in that case, the argument x
              should be a user-macro  call  whose  arguments  are  all  identifiers.  These  identifiers  become
              available  as user-macros inside the macro definition; these virtual macros must be called without
              arguments, and evaluate to the corresponding macro parameter.

       #defeval x y
              This acts in a similar way to #define, but the second argument y is evaluated  immediately.  Since
              user  macro  definitions are also evaluated each time they are called, this means that the macro y
              will undergo two successive evaluations. The usefulness of #defeval is considerable as it  is  the
              only  way  to  evaluate  something  more than once, which may be needed to force evaluation of the
              arguments of a meta-macro that normally doesn't perform any evaluation. However since all argument
              references evaluated at define-time are understood as the arguments of the body in which the macro
              is being defined and not as the arguments of the macro itself, usually one has to  use  the  quote
              character to prevent immediate evaluation of argument references.

       #undef x
              This removes any existing definition of the user macro x.

       #ifdef x
              This  begins a conditional block. Everything that follows is evaluated only if the identifier x is
              defined, and until either a #else or a #endif  statement  is  reached.  Note,  however,  that  the
              commented text is still scanned thoroughly, so its syntax must be valid. It is in particular legal
              to  have the #else or #endif statement ending the conditional block appear only as the result of a
              user-macro expansion and not explicitly in the input.

       #ifndef x
              This begins a conditional block. Everything that follows is evaluated only if the identifier x  is
              not defined.

       #ifeq x y
              This  begins  a conditional block. Everything that follows is evaluated only if the results of the
              evaluations of x and y are identical as character strings. Any leading or trailing  whitespace  is
              ignored  for the comparison. Note that in cpp-mode any unquoted whitespace character is understood
              as the end of the first argument, so it is necessary to be careful.

       #ifneq x y
              This begins a conditional block. Everything that follows is evaluated only if the results  of  the
              evaluations of x and y are not identical (even up to leading or trailing whitespace).

       #else  This  toggles the logical value of the current conditional block. What follows is evaluated if and
              only if the preceding input was commented out.

       #endif This ends a conditional block started by a #if... meta-macro.

       #include file
              This causes GPP to open the specified file and evaluate its contents, inserting the resulting text
              in the current output. All defined user macros are still  available  in  the  included  file,  and
              reciprocally all macros defined in the included file will be available in everything that follows.
              The  include  file is looked for first in the current directory, and then, if not found, in one of
              the directories specified by the -I command-line option  (or  /usr/include  if  no  directory  was
              specified).   Note that, for compatibility reasons, it is possible to put the file name between ""
              or <>.

              The order in which the various directories are searched for  include  files  is  affected  by  the
              -nostdinc, -nocurinc and -curdirinclast command-line options.

              Upon  including  a  file, GPP immediately saves a copy of the current operating mode onto the mode
              stack, and restores the operating mode at the end of the included  file.  The  included  file  may
              override  this  behavior  by starting with a #mode restore call and ending with a #mode push call.
              Additionally, when the -m command line option is specified, GPP will automatically switch  to  the
              cpp compatibility mode upon including a file whose name ends with either `.c' or `.h'.

       #sinclude file
              This  is  a  "silent"  version of the #include meta-macro that does not emit an error in the event
              that the specified file does not exist or cannot be opened.

       #exec command
              This causes GPP to execute the specified command line and  include  its  standard  output  in  the
              current output. Note that, for security reasons, this meta-macro is disabled unless the -x command
              line  flag  was  specified.   If use of #exec is not allowed, a warning message is printed and the
              output is left blank. Note that the specified command line is  evaluated  before  being  executed,
              thus  allowing  the  use  of  macros  in  the  command-line. However, the output of the command is
              included verbatim and not evaluated. If you need the output to be evaluated, you must use #defeval
              (see above) to cause a double evaluation.

       #eval expr
              The #eval meta-macro attempts to evaluate expr first by expanding macros (normal  GPP  evaluation)
              and  then  by  performing arithmetic evaluation and/or wildcard matching.  The syntax and operator
              precedence for arithmetic expressions are the same as in C; the only missing operators are <<, >>,
              ?:, and the assignment operators.

              POSIX-style wildcard matching (`globbing') is available only on POSIX implementations and  can  be
              invoked  with  the  =~  operator.  In brief, a `?' matches any single character, a `*' matches any
              string (including the empty string), and `[...]' matches any one of  the  characters  enclosed  in
              brackets.   A  `[...]' class is complemented when the first character in the brackets is `!'.  The
              characters in a `[...]' class can also be specified as a range using the `-'  character  --  e.g.,
              `[F-N]' is equivalent to `[FGHIJKLMN]'.

              If  unable  to  assign  a numerical value to the result, the returned text is simply the result of
              macro expansion without any arithmetic evaluation. The  only  exceptions  to  this  rule  are  the
              comparison  operators  ==,  !=, <, >, <=, and >= which, if one of the sides does not evaluate to a
              number, perform string comparison instead (ignoring trailing and leading  spaces).   Additionally,
              the length(...) arithmetic operator returns the length in characters of its evaluated argument.

              Inside  arithmetic  expressions,  the  defined(...) special user macro is also available: it takes
              only one argument, which is not evaluated, and returns 1 if it is the name of a user macro  and  0
              otherwise.

       #if expr
              This meta-macro invokes the arithmetic/globbing evaluator in the same manner as #eval and compares
              the  result of evaluation with the string "0" in order to begin a conditional block. In particular
              note that the logical value of expr is always true when it cannot be evaluated to a number.

       #elif expr
              This meta-macro can be used to  avoid  nested  #if  conditions.   #if  ...  #elif  ...  #endif  is
              equivalent to #if ... #else #if ...  #endif #endif.

       #mode keyword ...
              This meta-macro controls GPP's operating mode. See below for a list of #mode commands.

       #line  This meta-macro evaluates to the line number of the current input file.

       #file  This  meta-macro  evaluates to the filename of the current input file as it appears on the command
              line or in the argument to #include.  If GPP is reading its input from stdin, then #file evaluates
              to `stdin'.

       #date fmt
              This meta-macro evaluates to the current date and time as formatted by the specified format string
              fmt.  See the section DATE AND TIME CONVERSION SPECIFIERS below.

       #error msg
              This meta-macro causes an error message with the current filename and line number,  and  with  the
              text msg, to be printed to the standard error device.  Subsequent processing is then aborted.

       #warning msg
              This  meta-macro  causes a warning message with the current filename and line number, and with the
              text msg, to be printed to the standard error device.  Subsequent processing is then resumed.

       The key to GPP's flexibility is the #mode meta-macro. Its first argument is  always  one  of  a  list  of
       available  keywords  (see  below);  its  second  argument  is  always  a  sequence  of words separated by
       whitespace.  Apart from possibly the first of them, each of these words is always a delimiter  or  syntax
       specifier,  and  should  be  provided as a C string delimited by double quotes (" "). The various special
       matching sequences  listed in the section on syntax specification are available.  Any  #mode  command  is
       parsed  in  a  mode  where "..." is understood to be a C-style string, so it is safe to put any character
       inside these strings. Also note that the first argument of #mode (the keyword) is never evaluated,  while
       the  second  argument  is  evaluated (except of course for the contents of C strings), so that the syntax
       specification may be obtained as the result of a macro evaluation.

       The available #mode commands are:

       #mode save / #mode push
              Push the current mode specification onto the mode stack.

       #mode restore / #mode pop
              Pop mode specification from the mode stack.

       #mode standard name
              Select one of the standard modes. The only argument must be one of: default (default mode); cpp, C
              (cpp mode); tex, TeX (TeX mode); html, HTML (html mode); xhtml, XHTML (xhtml mode); prolog, Prolog
              (prolog mode). The mode name must be given directly, not as a C string.

       #mode user "s1" ... "s9"
              Specify user macro syntax.  The 9 arguments, all of them C strings, are the mode specification for
              user macros (see the -U command-line option and the section on syntax  specification).  The  meta-
              macro specification is not affected.

       #mode meta {user | "s1" ... "s7"}
              Specify meta-macro syntax.  Either the only argument is user (not as a string), and the user-macro
              mode  specifications  are  copied  into the meta-macro mode specifications, or there must be seven
              string arguments, whose significance is the same as for the -M command-line option (see section on
              syntax specification).

       #mode quote ["c"]
              With no argument or "" as argument, removes the quote character  specification  and  disables  the
              quoting  functionality. With one string argument, the first character of the string is taken to be
              the new quote character. The quote character can be neither alphanumeric nor `_', nor  can  it  be
              one of the special matching sequences.

       #mode comment [xxx] "start" "end" ["c" ["c"]]
              Add  a  comment  specification.  Optionally  a  first  argument consisting of three characters not
              enclosed in " " can be used to specify a  comment/string  modifier  (see  the  section  on  syntax
              specification).  The  default  modifier is ccc. The first two string arguments are used as comment
              start and end sequences respectively.  The third string argument is optional and can  be  used  to
              specify a string-quote character. (If it is "", the functionality is disabled.)  The fourth string
              argument is optional and can be used to specify a string delimitation warning character. (If it is
              "", the functionality is disabled.)

       #mode string [xxx] "start" "end" ["c" ["c"]]
              Add a string specification. Identical to #mode comment except that the default modifier is sss.

       #mode nocomment / #mode nostring ["start"]
              With  no  argument, remove all comment/string specifications. With one string argument, delete the
              comment/string specification whose start sequence is the argument.

       #mode preservelf { on | off | 1 | 0 }
              Equivalent to the -n command-line switch. If the argument is on or 1, any  newline  or  whitespace
              character  terminating  a  macro  call or a comment/string is left in the input stream for further
              processing. If the argument is off or 0 this feature is disabled.

       #mode charset { id | op | par } "string"
              Specify the character sets to be used for matching the \o, \O and \i special sequences. The  first
              argument  must  be  one  of id (the set matched by \i), op (the set matched by \o) or par (the set
              matched by \O in addition to the one matched by \o).  "string" is  a  C  string  which  lists  all
              characters  to  put in the set. It may contain only the special matching sequences \a, \A, \b, \B,
              and \# (the other sequences and the negated sequences are not  allowed).   When  a  `-'  is  found
              inbetween two non-special characters this adds all characters inbetween (e.g. "A-Z" corresponds to
              all uppercase characters). To have `-' in the matched set, either put it in first or last position
              or place it next to a \x sequence.

DATE AND TIME CONVERSION SPECIFIERS

       Ordinary characters placed in the format string are copied without conversion.  Conversion specifiers are
       introduced by a `%' character, and are replaced as follows:

       %a     The abbreviated weekday name according to the  current locale.

       %A     The  full  weekday  name  according  to the current locale.

       %b     The abbreviated month name according to the current locale.

       %B     The  full  month  name  according  to  the  current locale.

       %c     The preferred date and time representation for  the current locale.

       %d     The day of the month as a decimal number (range  01 to 31).

       %F     Equivalent to %Y-%m-%d (the ISO 8601 date  format).

       %H     The  hour as a decimal number using a 24-hour clock (range 00 to 23).

       %I     The hour as a decimal number using a 12-hour  clock (range 01 to 12).

       %j     The  day of the year as a decimal number (range 001 to 366).

       %m     The month as a decimal number (range 01 to 12).

       %M     The minute as a decimal number (range 00 to 59).

       %p     Either  `AM'  or  `PM' according  to  the  given  time value, or the corresponding strings for the
              current locale.  Noon is treated as `PM'  and  midnight  as `AM'.

       %R     The  time  in  24-hour notation (%H:%M).

       %S     The second as a decimal number (range 00 to 61).

       %U     The week number of the current year  as  a  decimal number,  range  00  to  53, starting with  the
              first Sunday as the first day of week 01.

       %w     The  day  of  the  week as a decimal, range 0 to 6, Sunday being 0.

       %W     The  week number of the current year  as  a  decimal number,  range  00  to  53, starting with the
              first Monday as the first day of week 01.

       %x     The preferred date representation for  the  current locale without the time.

       %X     The  preferred  time representation for the current locale without the date.

       %y     The year as a  decimal  number  without  a  century (range 00 to 99).

       %Y     The year as a decimal number including the century.

       %Z     The time zone or name or abbreviation.

       %%     A literal `%' character.

       Depending on the C compiler and library used to compile GPP, there  may  be  more  conversion  specifiers
       available.   Consult  your compiler's documentation for the strftime() function.  Note, however, that any
       conversion specifiers not listed above may not be portable across installations of GPP.

EXAMPLES

       Here is a basic self-explanatory example in standard or cpp mode:

         #define FOO This is
         #define BAR a message.
         #define concat #1 #2
         concat(FOO,BAR)
         #ifeq (concat(foo,bar)) (foo bar)
         This is output.
         #else
         This is not output.
         #endif

       Using argument naming, the concat macro could alternatively be defined as

         #define concat(x,y) x y

       In TeX mode and using argument naming, the same example becomes:

         \define{FOO}{This is}
         \define{BAR}{a message.}
         \define{\concat{x}{y}}{\x \y}
         \concat{\FOO}{\BAR}
         \ifeq{\concat{foo}{bar}}{foo bar}
         This is output.
         \else
         This is not output.
         \endif

       In HTML mode and without argument naming, one gets similarly:

         <#define FOO|This is>
         <#define BAR|a message.>
         <#define concat|#1 #2>
         <#concat <#FOO>|<#BAR>>
         <#ifeq <#concat foo|bar>|foo bar>
         This is output.
         <#else>
         This is not output.
         <#endif>

       The following example (in standard mode) illustrates the use of the quote character:

         #define FOO This is \
            a multiline definition.
         #define BLAH(x) My argument is x
         BLAH(urf)
         \BLAH(urf)

       Note that the multiline definition is also valid in cpp and Prolog modes despite  the  absence  of  quote
       character, because `\' followed by a newline is then interpreted as a comment and discarded.

       In cpp mode, C strings and comments are understood as such, as illustrated by the following example:

         #define BLAH foo
         BLAH "BLAH" /* BLAH */
         `It\'s a /*string*/ !'

       The  main difference between Prolog mode and cpp mode is the handling of strings and comments: in Prolog,
       a `...' string may not begin immediately after a digit, and a /*...*/ comment may not  begin  immediately
       after an operator character. Furthermore, comments are not removed from the output unless they occur in a
       #command.

       The  differences  between  cpp  mode  and  default  mode  are deeper: in default mode #commands may start
       anywhere, while in cpp mode they must be at the beginning of a line; the default mode has no knowledge of
       comments and strings, but has a quote character  (`\'),  while  cpp  mode  has  extensive  comment/string
       specifications  but  no  quote  character.  Moreover,  the  arguments to meta-macros need to be correctly
       parenthesized in default mode, while no such checking is performed in cpp mode.

       This makes it easier to nest meta-macro calls in default mode than in cpp mode. For example, consider the
       following HTML mode input, which tests for the availability of the #exec command:

         <#ifeq <#exec echo blah>|blah
         > #exec allowed <#else> #exec not allowed <#endif>

       There is no cpp mode equivalent, while in default mode it can be easily translated as

         #ifeq (#exec echo blah
         ) (blah
         )
         \#exec allowed
         #else
         \#exec not allowed
         #endif

       In order to nest meta-macro calls in cpp mode it is necessary to modify the mode description,  either  by
       changing  the  meta-macro  call  syntax, or more elegantly by defining a silent string and using the fact
       that the context at the beginning of an evaluated string is a newline character:

         #mode string QQQ "$" "$"
         #ifeq $#exec echo blah
         $ $blah
         $
         \#exec allowed
         #else
         \#exec not allowed
         #endif

       Note, however, that comments/strings cannot be nested ("..."  inside $...$ would go undetected),  so  one
       needs  to  be  careful  about what to include inside such a silent evaluated string. In this example, the
       loose meta-macro nesting introduced in version 2.1  makes  it  possible  to  use  the  following  simpler
       version:

         #ifeq blah #exec echo -n blah
         \#exec allowed
         #else
         \#exec not allowed
         #endif

       Remember  that  macros  without arguments are actually understood to be aliases when they are called with
       arguments, as illustrated by the following example (default or cpp mode):

         #define DUP(x) x x
         #define FOO and I said: DUP
         FOO(blah)

       The usefulness of the #defeval meta-macro is shown by the following example in HTML mode:

         <#define APPLY|<#defeval TEMP|<\##1 \#1>><#TEMP #2>>
         <#define <#foo x>|<#x> and <#x>>
         <#APPLY foo|BLAH>

       The reason why #defeval is needed is that, since everything is evaluated in a single pass, the input that
       will result in the desired macro call needs to be generated by a first evaluation of the arguments passed
       to APPLY before being evaluated a second time.

       To translate this example in default mode, one needs to resort to parenthesizing in  order  to  nest  the
       #defeval  call  inside the definition of APPLY, but need to do so without outputting the parentheses. The
       easiest solution is

         #define BALANCE(x) x
         #define APPLY(f,v) BALANCE(#defeval TEMP f
         TEMP(v))
         #define foo(x) x and x
         APPLY(\foo,BLAH)

       As explained above the simplest version in cpp mode relies on defining a silent evaluated string to  play
       the role of the BALANCE macro.

       The following example (default or cpp mode) demonstrates arithmetic evaluation:

         #define x 4
         The answer is:
         #eval x*x + 2*(16-x) + 1998%x

         #if defined(x)&&!(3*x+5>17)
         This should be output.
         #endif

       To  finish,  here  are some examples involving mode switching.  The following example is self-explanatory
       (starting in default mode):

         #mode push
         #define f(x) x x
         #mode standard tex
         \f{blah}
         \mode{string}{"$" "$"}
         \mode{comment}{"/*" "*/"}
         $\f{urf}$ /* blah */
         \define{FOO}{bar/* and some more */}
         \mode{pop}
         f($FOO$)

       A good example where a user-defined mode becomes useful is the GPP source  of  this  document  (available
       with GPP's source code distribution).

       Another  interesting  application  is  selectively  forcing evaluation of macros in C strings when in cpp
       mode. For example, consider the following input:

         #define blah(x) "and he said: x"
         blah(foo)

       Obviously one would want the parameter x to be expanded inside the string. There are several ways  around
       this problem:

         #mode push
         #mode nostring "\""
         #define blah(x) "and he said: x"
         #mode pop

         #mode quote "`"
         #define blah(x) `"and he said: x`"

         #mode string QQQ "$$" "$$"
         #define blah(x) $$"and he said: x"$$

       The  first  method  is  very  natural, but has the inconvenience of being lengthy and neutralizing string
       semantics, so that having an unevaluated instance of `x' in the string, or an occurrence of  `/*',  would
       be impossible without resorting to further contortions.

       The  second  method  is  slightly more efficient because the local presence of a quote character makes it
       easier to control what is evaluated and what isn't, but has the drawback that it is sometimes  impossible
       to  find  a  reasonable  quote  character without having to either significantly alter the source file or
       enclose it inside a #mode push/pop construct. For example, any occurrence of `/*'  in  the  string  would
       have to be quoted.

       The  last method demonstrates the efficiency of evaluated strings in the context of selective evaluation:
       since comments/strings cannot be nested, any occurrence of `"' or `/*' inside the  `$$'  gets  output  as
       plain  text,  as expected inside a string, and only macro evaluation is enabled.  Also note that there is
       much more freedom in the choice of a string delimiter than in the choice of a quote character.

       Starting with version 2.1, meta-macro calls can be nested more efficiently in  default,  cpp  and  Prolog
       modes. This makes it easy to make a user version of a meta-macro, or to increment a counter:

         #define myeval #eval #1

         #define x 1
         #defeval x #eval x+1

ADVANCED EXAMPLES

       Here  are some examples of advanced constructions using GPP. They tend to be pretty awkward and should be
       considered as evidence of GPP's limitations.

       The first example is a recursive macro. The main problem is  that  (since  GPP  evaluates  everything)  a
       recursive  macro  must  be  very careful about the way in which recursion is terminated in order to avoid
       undefined behavior (most of the time GPP will simply crash). In particular, relying on a #if/#else/#endif
       construct to end recursion is not possible and results in an infinite loop, because GPP scans user  macro
       calls  even  in  the unevaluated branch of the conditional block. A safe way to proceed is for example as
       follows (we give the example in TeX mode):

         \define{countdown}{
           \if{#1}
           #1...
           \define{loop}{\countdown}
           \else
           Done.
           \define{loop}{}
           \endif
           \loop{\eval{#1-1}}
         }
         \countdown{10}

       Another example, in cpp mode:

         #mode string QQQ "$" "$"
         #define triangle(x,y) y \
          $#if length(y)<x$ $#define iter triangle$ $#else$ \
          $#define iter$ $#endif
         $ iter(x,*y)
         triangle(20)

       The following is an (unfortunately very weak) attempt at implementing functional abstraction in  GPP  (in
       standard  mode).  Understanding this example and why it can't be made much simpler is an exercise left to
       the curious reader.

         #mode string "`" "`" "\\"
         #define ASIS(x) x
         #define SILENT(x) ASIS()
         #define EVAL(x,f,v) SILENT(
           #mode string QQQ "`" "`" "\\"
           #defeval TEMP0 x
           #defeval TEMP1 (
             \#define \TEMP2(TEMP0) f
           )
           TEMP1
           )TEMP2(v)
         #define LAMBDA(x,f,v) SILENT(
           #ifneq (v) ()
           #define TEMP3(a,b,c) EVAL(a,b,c)
           #else
           #define TEMP3(a,b,c) \LAMBDA(a,b)
           #endif
           )TEMP3(x,f,v)
         #define EVALAMBDA(x,y) SILENT(
           #defeval TEMP4 x
           #defeval TEMP5 y
           )
         #define APPLY(f,v) SILENT(
           #defeval TEMP6 ASIS(\EVA)f
           TEMP6
           )EVAL(TEMP4,TEMP5,v)

       This yields the following results:

         LAMBDA(z,z+z)
           => LAMBDA(z,z+z)

         LAMBDA(z,z+z,2)
           => 2+2

         #define f LAMBDA(y,y*y)
         f
           => LAMBDA(y,y*y)

         APPLY(f,blah)
           => blah*blah

         APPLY(LAMBDA(t,t t),(t t))
           => (t t) (t t)

         LAMBDA(x,APPLY(f,(x+x)),urf)
           => (urf+urf)*(urf+urf)

         APPLY(APPLY(LAMBDA(x,LAMBDA(y,x*y)),foo),bar)
           => foo*bar

         #define test LAMBDA(y,`#ifeq y urf
         y is urf#else
         y is not urf#endif
         `)
         APPLY(test,urf)
           => urf is urf

         APPLY(test,foo)
           => foo is not urf

SEE ALSO

       strftime(3), glob(7), m4(1V), cpp(1)

       GPP home page: https://logological.org/gpp/

AUTHOR

       GPP was written by Denis Auroux <auroux@math.mit.edu>.  Since version 2.12  it  has  been  maintained  by
       Tristan Miller <tristan@logological.org>.

COPYRIGHT

       Copyright (C) 1996-2001 Denis Auroux.

       Copyright (C) 2003-2023 Tristan Miller.

       Permission  is  granted  to anyone to make or distribute verbatim copies of this document as received, in
       any medium, provided that the copyright notice and this permission notice are preserved, thus giving  the
       recipient permission to redistribute in turn.

       Permission  is  granted to distribute modified versions of this document, or of portions of it, under the
       above conditions, provided also that they carry prominent notices stating who last changed them.

                                                                                                          GPP(1)