home *** CD-ROM | disk | FTP | other *** search
- RCS_ID_C="$Id: cpp.c,v 1.2 1994/03/07 23:52:39 jraja Exp $";
- /*
- * cpp -- a C PreProcessor suitable to be used with rpcgen
- */
-
- #include "cpp_rev.h"
-
- const char version[] = VERSTAG;
-
- /****** devtools.doc/cpp ****************************************************
-
- NAME
- cpp - C Pre-Processor
-
- SYNOPSIS
- cpp [-options] [infile [outfile]]
-
- DESCRIPTION
- CPP reads a C source file, expands macros and include files, and
- writes an input file for the C compiler. If no file arguments are
- given, CPP reads from stdin and writes to stdout. If one file
- argument is given, it will define the input file, while two file
- arguments define both input and output files. The file name "-" is
- a synonym for stdin or stdout as appropriate.
-
- The following options are supported. Options may be given in either
- case.
-
- -C If set, source-file comments are written to the
- output file. This allows the output of CPP to be
- used as the input to a program, such as lint, that
- expects commands embedded in specially-formatted
- comments.
-
- -Dname=value Define the name as if the programmer wrote
-
- #define name value
-
- at the start of the first file. If "=value" is not
- given, a value of "1" will be used.
-
- On non-unix systems, all alphabetic text will be
- forced to upper-case.
-
- -E Always return "success" to the operating system, even
- if errors were detected. Note that some fatal
- errors, such as a missing #include file, will
- terminate CPP, returning "failure" even if the -E
- option is given.
-
- -Idirectory Add this directory to the list of directories
- searched for #include "..." and #include <...>
- commands. Note that there is no space between the
- "-I" and the directory string. More than one -I
- command is permitted. On non-Unix systems
- "directory" is forced to upper-case.
-
- -N CPP normally predefines some symbols defining the
- target computer and operating system. If -N is
- specified, no symbols will be predefined. If -N -N
- is specified, the "always present" symbols, __LINE__,
- __FILE__, and __DATE__ are not defined.
-
- -P Do not output #line directives.
-
- -Stext CPP normally assumes that the size of the target
- computer's basic variable types is the same as the
- size of these types of the host computer. (This can
- be overridden when CPP is compiled, however.) The -S
- option allows dynamic respecification of these
- values. "text" is a string of numbers, separated by
- commas, that specifies correct sizes. The sizes must
- be specified in the exact order:
-
- char short int long float double
-
- If you specify the option as "-S*text", pointers to
- these types will be specified. -S* takes one
- additional argument for pointer to function (e.g.
- int (*)())
-
- For example, to specify sizes appropriate for a
- PDP-11, you would write:
-
- c s i l f d func
- -S1,2,2,2,4,8,
- -S*2,2,2,2,2,2,2
-
- Note that all values must be specified.
-
- -Uname Undefine the name as if
-
- #undef name
-
- were given. On non-Unix systems, "name" will be
- forced to upper-case.
-
- -Xnumber Enable debugging code. If no value is given, a value
- of 1 will be used. (For maintenence of CPP only.)
-
-
- PRE-DEFINED VARIABLES
- When CPP begins processing, the following variables will have been
- defined (unless the -N option is specified):
-
- Target computer (as appropriate):
-
- pdp11, vax, M68000 m68000 m68k
-
- Target operating system (as appropriate):
-
- rsx, rt11, vms, unix
-
- Target compiler (as appropriate):
-
- decus, vax11c
-
- The implementor may add definitions to this list. The default
- definitions match the definition of the host computer, operating
- system, and C compiler.
-
- The following are always available unless undefined (or -N was
- specified twice):
-
- __FILE__ The input (or #include) file being compiled (as a
- quoted string).
-
- __LINE__ The line number being compiled.
-
- __DATE__ The date and time of compilation as a Unix ctime
- quoted string (the trailing newline is removed).
- Thus,
-
- printf("Bug at line %s,", __LINE__);
- printf(" source file %s", __FILE__);
- printf(" compiled on %s", __DATE__);
-
-
- DRAFT PROPOSED ANSI STANDARD CONSIDERATIONS
- The current version of the Draft Proposed Standard explicitly states
- that "readers are requested not to specify or claim conformance to
- this draft." Readers and users of Decus CPP should not assume that
- Decus CPP conforms to the standard, or that it will conform to the
- actual C Language Standard.
-
- When CPP is itself compiled, many features of the Draft Proposed
- Standard that are incompatible with existing preprocessors may be
- disabled. See the comments in CPP's source for details.
-
- The latest version of the Draft Proposed Standard (as reflected in
- Decus CPP) is dated November 12, 1984.
-
- Comments are removed from the input text. The comment is replaced
- by a single space character. The -C option preserves comments,
- writing them to the output file.
-
- The '$' character is considered to be a letter. This is a permitted
- extension.
-
- The following new features of C are processed by CPP:
-
- #elif expression (#else #if)
- '\xNNN' (Hexadecimal constant)
- '\a' (Ascii BELL)
- '\v' (Ascii Vertical Tab)
- #if defined NAME 1 if defined, 0 if not
- #if defined (NAME) 1 if defined, 0 if not
- #if sizeof (basic type)
- unary +
- 123U, 123LU Unsigned ints and longs.
- 12.3L Long double numbers
- token#token Token concatenation
- #include token Expands to filename
-
- The Draft Proposed Standard has extended C, adding a constant string
- concatenation operator, where
-
- "foo" "bar"
-
- is regarded as the single string "foobar". (This does not affect
- CPP's processing but does permit a limited form of macro argument
- substitution into strings as will be discussed.)
-
- The Standard Committee plans to add token concatenation to #define
- command lines. One suggested implementation is as follows: the
- sequence "Token1#Token2" is treated as if the programmer wrote
- "Token1Token2". This could be used as follows:
-
- #line 123
- #define ATLINE foo#__LINE__
-
- ATLINE would be defined as foo123.
-
- Note that "Token2" must either have the format of an identifier or
- be a string of digits. Thus, the string
-
- #define ATLINE foo#1x3
-
- generates two tokens: "foo1" and "x3".
-
- If the tokens T1 and T2 are concatenated into T3, this
- implementation operates as follows:
-
- 1. Expand T1 if it is a macro.
- 2. Expand T2 if it is a macro.
- 3. Join the tokens, forming T3.
- 4. Expand T3 if it is a macro.
-
- A macro formal parameter will be substituted into a string or
- character constant if it is the only component of that constant:
-
- #define VECSIZE 123
- #define vprint(name, size) \
- printf("name" "[" "size" "] = {\n")
- ... vprint(vector, VECSIZE);
-
- expands (effectively) to
-
- vprint("vector[123] = {\n");
-
- Note that this will be useful if your C compiler supports the new
- string concatenation operation noted above. As implemented here, if
- you write
-
- #define string(arg) "arg"
- ... string("foo") ...
-
- This implementation generates "foo", rather than the strictly
- correct ""foo"" (which will probably generate an error message).
- This is, strictly speaking, an error in CPP and may be removed from
- future releases.
-
- ERROR MESSAGES
- Many. CPP prints warning or error messages if you try to use
- multiple-byte character constants (non-transportable) if you #undef
- a symbol that was not defined, or if your program has potentially
- nested comments.
-
- AUTHOR
- Martin Minow
-
- BUGS
- The #if expression processor uses signed integers only. I.e,
- #if 0xFFFFu < 0 may be TRUE.
-
- *****************************************************************************
- *
- */
-
-
-
-
-
-
-
-
-
-
-