*** empty log message ***
authorkeie <none@none>
Fri, 13 Jul 1984 15:20:58 +0000 (15:20 +0000)
committerkeie <none@none>
Fri, 13 Jul 1984 15:20:58 +0000 (15:20 +0000)
util/cpp/cpp.6 [new file with mode: 0644]

diff --git a/util/cpp/cpp.6 b/util/cpp/cpp.6
new file mode 100644 (file)
index 0000000..38d46ed
--- /dev/null
@@ -0,0 +1,184 @@
+.TH 
+.I cpp
+.SH NAME
+cpp \- C Pre-Processor
+.SH SYNOPSIS
+cpp [\-options] files
+.SH DESCRIPTION
+.I Cpp
+reads one or more files, expands macros and include
+files, and writes an input file for the C compiler.
+All output is to cpp.tmp (cpp.tmp.c on Unix).
+.br
+The following options are supported.  On non-Unix systems,
+options may be given in either case.
+.IP -Ofile
+Output to this file, instead of the default.
+.IP -S
+Output to stdout, instead of the default.
+.IP -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.
+.IP -L         
+.I Cpp
+transmits line number information to
+the C compiler by outputting "#line <number>" records.
+If the -L option is given, this record will be transmitted
+as "#", allowing the output of 
+.I cpp
+to be input to a compiler
+without an intervening preprocessor without error.
+.IP -Dname=value
+Define the name as if the programmer wrote
+.br
+.nf
+    #define name value
+.fi
+.br
+at the start of the first file.  If "=value" is not
+given, a value of "1" will be used.
+.br
+On non-unix systems, all alphabetic text will be forced
+to upper-case.
+.br
+.IP -Uname
+Undefine the name as if
+.br
+.nf
+       #undef name
+.fi
+.br
+were given.  On non-Unix systems, "name" will be forced to
+upper-case.
+The following names are always available unless undefined:
+.RS
+.IP __FILE__
+The input (or #include) file being compiled
+(as a quoted string).
+.IP __LINE__
+The line number being compiled.
+.IP __DATE__
+The date and time of compilation as
+a Unix ctime quoted string (the trailing newline is removed).
+.RE
+Thus,
+.br
+.nf
+    printf("Bug at line %s,", __LINE__);
+    printf(" source file %s", __FILE__);
+    printf(" compiled on %s", __DATE__);
+.fi
+.IP
+-Xnumber
+Enable debugging code.  If no value is
+given, a value of 1 will be used.  (For maintenence of
+.I cpp
+only.)
+.SH "COMMENTS IN MACRO TEXT AND ARGUMENT CONCATENATION"
+.br
+Comments are removed from the input text.  The comment
+characters serve as an invisible token delimiter.  Thus,
+the macro
+.nf
+    #define CAT(a, b) b/**/a
+    int value = CAT(1, 2);
+.fi
+Will generate "int value = 21;".
+.br
+A better way of concatenating arguments is as follows:
+.nf
+    #define I(x)x
+    #define CAT(x,y)I(x)y
+    int value = CAT(1, 2);
+.fi
+If the above macros are defined without extraneous
+spaces, they will be transportable to other implementations.
+.br
+.SH DIFFERENCES
+.br
+The following is a list of differences between this
+pre-processor and the Unix V7 preprocessor which was
+written by John Reiser.  It is probably not complete.
+.IP o
+Macro formal parameters are recognized within
+quoted strings and character constants in macro definitions.
+For example,
+.nf
+    #define foo(a) "Today is a"
+    printf(foo(tuesday));
+.fi
+Would print "Today is tuesday".
+.br
+Recognition of formal parameters in macro replacement
+strings is not permitted by the Draft ANSI C Standard.
+It is permitted in this implementation if cpp was
+compiled with the STRING_FORMAL parameter set appropriately.
+.br
+Unlike Reiser's implementation, the '\e' "quote next character"
+does just that.  I.e.
+.nf
+    #define foo(a) "Today is \ea a"
+    printf(foo(tuesday));
+.fi
+Would print "Today is a tuesday".  Note that this may
+not be portable.
+.IP o
+Reiser's implementation removes "escaped" linefeeds
+(The two character sequence \e<LF>) within macros.  This
+implementation preserves them.  For example, a macro which
+generates control commands might be written
+.nf
+    #define foo(a, b) \e
+    #define    a       b \e
+.fi
+.nf
+    foo(fubar, foobar)
+    int                fubar;
+.fi
+The above would generate "int foobar;" and a warning message.
+Reiser's scan is slightly different.
+.SH "ANSI C STANDARD"
+.I Cpp
+implements most of the ANSI draft standard.
+You should be aware of the following:
+.IP o
+In the draft standard, the \en (backslash-newline)
+character is "invisible" to all processing.  In this implementation,
+it is invisible to strings, but acts a "whitespace" (token-delimiter)
+outside of strings.  This considerably simplifies error
+message handling.
+.IP o
+The following extensions to C are processed by cpp:
+.nf
+.sp 1
+.ta 4 27
+       #elif expression        (#else #if)
+       '\exNNN'        (Hexadecimal constants)
+       '\ea'   (Ascii BELL)
+       '\ev'   (Ascii VT)
+       #if defined NAME        (1 if defined, 0 if not)
+       #if defined (NAME)      (1 if defined, 0 if not)
+       unary + (gag me with a spoon)
+.fi
+.IP o
+The draft standard has extended C, adding a string
+concatenation operator, where
+.br
+.nf
+    "foo" "bar"
+.fi
+.br
+is regarded as the single string "foobar".  It is not clear
+from the draft standard whether this applies to pre-processing
+if macro formals are recognized in strings.
+.SH "ERROR MESSAGES"
+.br
+Many.
+.br
+.SH AUTHOR
+.br
+Martin Minow
+.br