home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 243_01 / cpp1.c < prev    next >
Text File  |  1990-05-14  |  36KB  |  883 lines

  1. /*
  2. **    name:        cpp1.c
  3. */
  4.  
  5. /*
  6.  * CPP main program.
  7.  *
  8.  * Edit history
  9.  * 21-May-84    MM      "Field test" release
  10.  * 23-May-84    MM      Some minor hacks.
  11.  * 30-May-84    ARF     Didn't get enough memory for __DATE__
  12.  *                      Added code to read stdin if no input
  13.  *                      files are provided.
  14.  * 29-Jun-84    MM      Added ARF's suggestions, Unixifying cpp.
  15.  * 11-Jul-84    MM      "Official" first release (that's what I thought!)
  16.  * 22-Jul-84    MM/ARF/SCK Fixed line number bugs, added cpp recognition
  17.  *                      of #line, fixed problems with #include.
  18.  * 23-Jul-84    MM      More (minor) include hacking, some documentation.
  19.  *                      Also, redid cpp's #include files
  20.  * 25-Jul-84    MM      #line filename isn't used for #include searchlist
  21.  *                      #line format is <number> <optional name>
  22.  * 25-Jul-84    ARF/MM  Various bugs, mostly serious.  Removed homemade doprint
  23.  * 01-Aug-84    MM      Fixed recursion bug, remove extra newlines and
  24.  *                      leading whitespace from cpp output.
  25.  * 02-Aug-84    MM      Hacked (i.e. optimized) out blank lines and unneeded
  26.  *                      whitespace in general.  Cleaned up unget()'s.
  27.  * 03-Aug-84    Keie    Several bug fixes from Ed Keizer, Vrije Universitet.
  28.  *                      -- corrected arg. count in -D and pre-defined
  29.  *                      macros.  Also, allow \n inside macro actual parameter
  30.  *                      lists.
  31.  * 06-Aug-84    MM      If debugging, dump the preset vector at startup.
  32.  * 12-Aug-84    MM/SCK  Some small changes from Sam Kendall
  33.  * 15-Aug-84    Keie/MM cerror, cwarn, etc. take a single string arg.
  34.  *                      cierror, etc. take a single int. arg.
  35.  *                      changed LINE_PREFIX slightly so it can be
  36.  *                      changed in the makefile.
  37.  * 31-Aug-84    MM      USENET net.sources release.
  38.  *  7-Sep-84    SCH/ado Lint complaints
  39.  * 10-Sep-84    Keie    Char's can't be signed in some implementations
  40.  * 11-Sep-84    ado     Added -C flag, pathological line number fix
  41.  * 13-Sep-84    ado     Added -E flag (does nothing) and "-" file for stdin.
  42.  * 14-Sep-84    MM      Allow # 123 as a synonym for #line 123
  43.  * 19-Sep-84    MM      scanid always reads to token, make sure #line is
  44.  *                      written to a new line, even if -C switch given.
  45.  *                      Also, cpp - - reads stdin, writes stdout.
  46.  * 03-Oct-84    ado/MM  Several changes to line counting and keepcomments
  47.  *                      stuff.  Also a rewritten control() hasher -- much
  48.  *                      simpler and no less "perfect". Note also changes
  49.  *                      in cpp3.c to fix numeric scanning.
  50.  * 04-Oct-84    MM      Added recognition of macro formal parameters if
  51.  *                      they are the only thing in a string, per the
  52.  *                      draft standard.
  53.  * 08-Oct-84    MM      One more attack on scannumber
  54.  * 15-Oct-84    MM/ado  Added -N to disable predefined symbols.  Fixed
  55.  *                      linecount if COMMENT_INVISIBLE enabled.
  56.  * 22-Oct-84    MM      Don't evaluate the #if/#ifdef argument if
  57.  *                      compilation is supressed.  This prevents
  58.  *                      unnecessary error messages in sequences such as
  59.  *                          #ifdef FOO          -- undefined
  60.  *                          #if FOO == 10       -- shouldn't print warning
  61.  * 25-Oct-84    MM      Fixed bug in false ifdef supression.  On vms,
  62.  *                      #include <foo> should open foo.h -- this duplicates
  63.  *                      the behavior of Vax-C
  64.  * 31-Oct-84    ado/MM  Parametized $ in indentifiers.  Added a better
  65.  *                      token concatenator and took out the trial
  66.  *                      concatenation code.  Also improved #ifdef code
  67.  *                      and cleaned up the macro recursion tester.
  68.  *  2-Nov-84    MM/ado  Some bug fixes in token concatenation, also
  69.  *                      a variety of minor (uninteresting) hacks.
  70.  *  6-Nov-84    MM      Happy Birthday.  Broke into 4 files and added
  71.  *                      #if sizeof (basic_types)
  72.  *  9-Nov-84    MM      Added -S* for pointer type sizes
  73.  * 13-Nov-84    MM      Split cpp1.c, added vms defaulting
  74.  * 23-Nov-84    MM/ado  -E supresses error exit, added CPP_INCLUDE,
  75.  *                      fixed strncpy bug.
  76.  *  3-Dec-84    ado/MM  Added OLD_PREPROCESSOR
  77.  *  7-Dec-84    MM      Stuff in Nov 12 Draft Standard
  78.  * 17-Dec-84    george  Fixed problems with recursive macros
  79.  * 17-Dec-84    MM      Yet another attack on #if's (f/t)level removed.
  80.  * 07-Jan-85    ado     Init defines before doing command line options
  81.  *                      so -Uunix works.
  82.  * 14-Jan-85    MM      Fixed bug with logical device translation on VMS.
  83.  * 18-Jan-85    MM      Rearrainged fgetname() conditionals.
  84.  * 27-Mar-85    ado     Fix bug in pcc
  85.  * 28-Mar-85    MM      Another attack on concatenation and some minor
  86.  *                      cleanup and typo corrections.
  87.  * 29-Mar-85    ado/MM  trigraphs, also fixed bug with / at end of macro.
  88.  * 11-Apr-85    ado     Buglets (typos and lint picking)
  89.  * 29-Apr-85    MM      Added concat without reexpansion.  Suggestion from ado.
  90.  * 07-Jun-85    KR      added -P option.  don't output #line
  91.  */
  92.  
  93. /*)BUILD
  94.         $(PROGRAM)      = cpp
  95.         $(FILES)        = { cpp1 cpp2 cpp3 cpp4 cpp5 cpp6 }
  96.         $(INCLUDE)      = { cppdef.h cpp.h }
  97.         $(STACK)        = 3000
  98.         $(TKBOPTIONS)   = {
  99.                 STACK   = 2000
  100.         }
  101. */
  102.  
  103. #ifdef  DOCUMENTATION
  104.  
  105. title   cpp             C Pre-Processor
  106. index                   C pre-processor
  107.  
  108. synopsis
  109.         .s.nf
  110.         cpp [-options] [infile [outfile]]
  111.         .s.f
  112. description
  113.  
  114.         CPP reads a C source file, expands macros and include
  115.         files, and writes an input file for the C compiler.
  116.         If no file arguments are given, CPP reads from stdin
  117.         and writes to stdout.  If one file argument is given,
  118.         it will define the input file, while two file arguments
  119.         define both input and output files.  The file name "-"
  120.         is a synonym for stdin or stdout as appropriate.
  121.  
  122.         The following options are supported.  Options may
  123.         be given in either case.
  124.         .lm +16
  125.         .p -16
  126.         -C              If set, source-file comments are written
  127.         to the output file.  This allows the output of CPP to be
  128.         used as the input to a program, such as lint, that expects
  129.         commands embedded in specially-formatted comments.
  130.         .p -16
  131.         -Dname=value    Define the name as if the programmer wrote
  132.  
  133.             #define name value
  134.  
  135.         at the start of the first file.  If "=value" is not
  136.         given, a value of "1" will be used.
  137.  
  138.         On non-unix systems, all alphabetic text will be forced
  139.         to upper-case.
  140.         .p -16
  141.         -E              Always return "success" to the operating
  142.         system, even if errors were detected.  Note that some fatal
  143.         errors, such as a missing #include file, will terminate
  144.         CPP, returning "failure" even if the -E option is given.
  145.         .p -16
  146.         -Idirectory     Add this directory to the list of
  147.         directories searched for #include "..." and #include <...>
  148.         commands.  Note that there is no space between the
  149.         "-I" and the directory string.  More than one -I command
  150.         is permitted.  On non-Unix systems "directory" is forced
  151.         to upper-case.
  152.         .p -16
  153.         -N              CPP normally predefines some symbols defining
  154.         the target computer and operating system.  If -N is specified,
  155.         no symbols will be predefined.  If -N -N is specified, the
  156.         "always present" symbols, __LINE__, __FILE__, and __DATE__
  157.         are not defined.
  158.         .p -16
  159.         -P              CPP normally writes lines of the form
  160.         #line <number> <file.name> to the output file so the compiler
  161.         can print the line number and name of the original source file
  162.         f