/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



/*
 * This redundant definition of TRUE and FALSE works around
 * a limitation of Decus C.
 */
#ifndef TRUE
#define TRUE                    1
#define FALSE                   0
#endif

/*
 * Define the HOST operating system.  This is needed so that
 * cpp can use appropriate filename conventions.
 */
#define SYS_UNKNOWN             0
#define SYS_UNIX                1
#define SYS_VMS                 2
#define SYS_RSX                 3
#define SYS_RT11                4
#define SYS_LATTICE             5
#define SYS_ONYX                6
#define SYS_68000               7

#ifndef HOST
#ifdef  unix
#define HOST                    SYS_UNIX
#else
#ifdef  vms
#define HOST                    SYS_VMS
#else
#ifdef  rsx
#define HOST                    SYS_RSX
#else
#ifdef  rt11
#define HOST                    SYS_RT11
#endif
#endif
#endif
#endif
#endif

#ifndef HOST
#define HOST                    SYS_UNKNOWN
#endif

/*
 * We assume that the target is the same as the host system
 */
#ifndef TARGET
#define TARGET                  HOST
#endif

/*
 * In order to predefine machine-dependent constants,
 * several strings are defined here:
 *
 * MACHINE      defines the target cpu (by name)
 * SYSTEM       defines the target operating system
 * COMPILER     defines the target compiler
 *
 *      The above may be #defined as "" if they are not wanted.
 *      They should not be #defined as NULL.
 *
 * LINE_PREFIX  defines the # output line prefix, if not "line"
 *              This should be defined as "" if cpp is to replace
 *              the "standard" C pre-processor.
 *
 * FILE_LOCAL   marks functions which are referenced only in the
 *              file they reside.  Some C compilers allow these
 *              to be marked "static" even though they are referenced
 *              by "extern" statements elsewhere.
 *
 * OK_DOLLAR    Should be set TRUE if $ is a valid alphabetic character
 *              in identifiers (default), or zero if $ is invalid.
 *              Default is TRUE.
 *
 * OK_CONCAT    Should be set TRUE if # may be used to concatenate
 *              tokens in macros (per the Ansi Draft Standard) or
 *              FALSE for old-style # processing (needed if cpp is
 *              to process assembler source code).
 *
 * OK_DATE      Predefines the compilation date if set TRUE.
 *              Not permitted by the Nov. 12, 1984 Draft Standard.
 *
 * S_CHAR etc.  Define the sizeof the basic TARGET machine word types.
 *              By default, sizes are set to the values for the HOST
 *              computer.  If this is inappropriate, see the code in
 *              cpp3.c for details on what to change.  Also, if you
 *              have a machine where sizeof (signed int) differs from
 *              sizeof (unsigned int), you will have to edit code and
 *              tables in cpp3.c (and extend the -S option definition.)
 *
 * CPP_LIBRARY  May be defined if you have a site-specific include directory
 *              which is to be searched *before* the operating-system
 *              specific directories.
 */

#if TARGET == SYS_LATTICE
/*
 * We assume the operating system is pcdos for the IBM-PC.
 * We also assume the small model (just like the PDP-11)
 */
#define MACHINE                 "i8086"
#define SYSTEM                  "pcdos"
#endif

#if TARGET == SYS_ONYX
#define MACHINE                 "z8000"
#define SYSTEM                  "unix"
#endif

#if TARGET == SYS_VMS
#define MACHINE                 "vax"
#define SYSTEM                  "vms"
#define COMPILER                "vax11c"
#endif

#if TARGET == SYS_RSX
#define MACHINE                 "pdp11"
#define SYSTEM                  "rsx"
#define COMPILER                "decus"
#endif

#if TARGET == SYS_RT11
#define MACHINE                 "pdp11"
#define SYSTEM                  "rt11"
#define COMPILER                "decus"
#endif

#if TARGET == SYS_68000 || defined(M68000) || defined(m68000) || defined(m68k)
/*
 * All three machine designators have been seen in various systems.
 * Warning -- compilers differ as to sizeof (int).  cpp3 assumes that
 * sizeof (int) == 2
 */
#define MACHINE                 "M68000", "m68000", "m68k"
#define SYSTEM                  "unix"
#endif

#if     TARGET == SYS_UNIX
#define SYSTEM                  "unix"
#ifdef  pdp11
#define MACHINE                 "pdp11"
#endif
#ifdef  vax
#define MACHINE                 "vax"
#endif
#endif

/*
 * defaults
 */

#ifndef MSG_PREFIX
#define MSG_PREFIX              "cpp: "
#endif

#ifndef LINE_PREFIX
#define LINE_PREFIX             ""
#endif

/*
 * OLD_PREPROCESSOR forces the definition of OK_DOLLAR, OK_CONCAT,
 * COMMENT_INVISIBLE, and STRING_FORMAL to values appropriate for
 * an old-style preprocessor.
 */

#ifndef OLD_PREPROCESSOR
#define OLD_PREPROCESSOR        FALSE
#endif

#if     OLD_PREPROCESSOR
#define OK_DOLLAR               FALSE
#define OK_CONCAT               TRUE
#define COMMENT_INVISIBLE       TRUE
#define STRING_FORMAL           TRUE
#define IDMAX                   63      /* actually, seems to be unlimited */
#endif

/*
 * RECURSION_LIMIT may be set to -1 to disable the macro recursion test.
 */
#ifndef RECURSION_LIMIT
#define RECURSION_LIMIT 1000
#endif

/*
 * BITS_CHAR may be defined to set the number of bits per character.
 * it is needed only for multi-byte character constants.
 */
#ifndef BITS_CHAR
#define BITS_CHAR               8
#endif

/*
 * BIG_ENDIAN is set TRUE on machines (such as the IBM 360 series)
 * where 'ab' stores 'a' in the high-bits and 'b' in the low-bits.
 * It is set FALSE on machines (such as the PDP-11 and Vax-11)
 * where 'ab' stores 'a' in the low-bits and 'b' in the high-bits.
 * (Or is it the other way around?) -- Warning: BIG_ENDIAN code is untested.
 */
#ifndef BIG_ENDIAN
#define BIG_ENDIAN              FALSE
#endif

/*
 * COMMENT_INVISIBLE may be defined to allow "old-style" comment
 * processing, whereby the comment becomes a zero-length token
 * delimiter.  This permitted tokens to be concatenated in macro
 * expansions.  This was removed from the Draft Ansi Standard.
 */
#ifndef COMMENT_INVISIBLE
#define COMMENT_INVISIBLE       FALSE
#endif

/*
 * STRING_FORMAL may be defined to allow recognition of macro parameters
 * anywhere in replacement strings.  This was removed from the Draft Ansi
 * Standard and a limited recognition capability added.
 */
#ifndef STRING_FORMAL
#define STRING_FORMAL           FALSE
#endif

/*
 * OK_DOLLAR enables use of $ as a valid "letter" in identifiers.
 * This is a permitted extension to the Ansi Standard and is required
 * for e.g., VMS, RSX-11M, etc.   It should be set FALSE if cpp is
 * used to preprocess assembler source on Unix systems.  OLD_PREPROCESSOR
 * sets OK_DOLLAR FALSE for that reason.
 */
#ifndef OK_DOLLAR
#define OK_DOLLAR               TRUE
#endif

/*
 * OK_CONCAT enables (one possible implementation of) token concatenation.
 * If cpp is used to preprocess Unix assembler source, this should be
 * set FALSE as the concatenation character, #, is used by the assembler.
 */
#ifndef OK_CONCAT
#define OK_CONCAT               TRUE
#endif

/*
 * OK_DATE may be enabled to predefine today's date as a string
 * at the start of each compilation.  This is apparently not permitted
 * by the Draft Ansi Standard.
 */
#ifndef OK_DATE
#define OK_DATE         TRUE
#endif

/*
 * The following definitions are used to allocate memory for
 * work buffers.  In general, they should not be modified
 * by implementors.
 *
 * PAR_MAC      The maximum number of #define parameters (31 per Standard)
 *              Note: we need another one for strings.
 * IDMAX        The longest identifier, 31 per Ansi Standard
 * NBUFF        Input buffer size
 * NWORK        Work buffer size -- the longest macro
 *              must fit here after expansion.
 * NEXP         The nesting depth of #if expressions
 * NINCLUDE     The number of directories that may be specified
 *              on a per-system basis, or by the -I option.
 * BLK_NEST     The number of nested #if's permitted.
 * NFWORK		FileNameWorkBuffer (added by erAck, was NWORK)
 */

#ifndef IDMAX
#define IDMAX                    127
#endif
#ifdef SOLAR
#define PAR_MAC           (253 + 1)
#else
#define PAR_MAC            (31 + 1)
#endif
/* ER 13.06.95 19:33
 da Makros im file->buffer expandiert werden, muss NBUFF mindestens NWORK sein
#define NWORK                   4096
#define NBUFF                   4096
 */
/* ER 13.06.95 20:05  NWORK wg. grooossen Makros in *.src erhoeht,
 da wir bald 10 Sprachen haben werden gleich ordentlich reingehauen.. */
#define NWORK                   128000
#define NBUFF                   NWORK
#define NFWORK					1024
#define NEXP                    128
#define NINCLUDE        100
#define NPARMWORK               (NWORK * 2)
#define BLK_NEST                32


#ifndef ALERT
#ifdef EBCDIC
#define ALERT					'\057'
#else
#define ALERT                   '\007'          /* '\a' is "Bell"       */
#endif
#endif

#ifndef VT
#define VT                      '\013'          /* Vertical Tab CTRL/K  */
#endif


#ifndef FILE_LOCAL
#ifdef  decus
#define FILE_LOCAL              static
#else
#ifdef  vax11c
#define FILE_LOCAL              static
#else
#define FILE_LOCAL                              /* Others are global    */
#endif
#endif
#endif

