397 lines
15 KiB
C
397 lines
15 KiB
C
/*-
|
|
* Copyright (c) 1998, 2002-2008 Kiyoshi Matsui <kmatsui@t3.rim.or.jp>
|
|
* All rights reserved.
|
|
*
|
|
* Some parts of this code are derived from the public domain software
|
|
* DECUS cpp (1984,1985) written by Martin Minow.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* S Y S T E M . H
|
|
* S y s t e m D e p e n d e n t
|
|
* D e f i n i t i o n s f o r M C P P
|
|
*
|
|
* Definitions in this file may be edited to configure MCPP for particular
|
|
* operating systems and compiler configurations.
|
|
*
|
|
* Note: MCPP assumes the system implement the Ascii character set.
|
|
* If this is not the case, you will have to do some editing here and there.
|
|
*/
|
|
|
|
#define SYSTEM_H
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "configed.H"
|
|
#else
|
|
#include "noconfig.H"
|
|
#endif
|
|
|
|
/* Some system has a wrong definition of UCHAR_MAX. See cpp-test.html#5.1.3 */
|
|
#if UCHARMAX < -255
|
|
/* The definition of UCHARMAX (possibly UCHAR_MAX too) is wrong. */
|
|
/* Define it as a signed int value, not as an unsigned value. */
|
|
#undef UCHARMAX
|
|
#define UCHARMAX ((1 << CHAR_BIT) - 1)
|
|
#endif
|
|
|
|
/*
|
|
* PART 1 and PART 2 are defined in the above header files.
|
|
*/
|
|
|
|
/*
|
|
* P A R T 1 Configurations for target-operating-system
|
|
* and target-compiler.
|
|
*/
|
|
|
|
/*
|
|
* P A R T 2 Configurations for host-compiler.
|
|
*/
|
|
|
|
/*
|
|
* P A R T 3 Configurations for default settings, typedefs and
|
|
* translation limits.
|
|
*/
|
|
|
|
/*
|
|
* The variable 'mcpp_mode' specifies the mode of preprocessing as one of
|
|
* OLD_PREP, KR, STD, or POST_STD.
|
|
* Those modes have many differences each other --
|
|
* i.e. handling of translation phases; handling of some
|
|
* preprocessing tokens; availability of some directives; way of
|
|
* macro expansion;
|
|
* -- as follows.
|
|
*
|
|
* KR Actual arguments of a macro are expanded (after substitution)
|
|
* with rest of the replacement text and the subsequent source text.
|
|
* ## in macro definition has no significance to cpp. The surrounding
|
|
* tokens are macro-expanded separately. Also, # has no significance
|
|
* to cpp. The following token is expanded.
|
|
* Directly or intermediately recursive macro call causes an error.
|
|
* <backslash><newline> sequence is deleted only in string literals
|
|
* and in #define directive lines.
|
|
* sizeof (type) can be used in #if line.
|
|
* KR corresponds to the "K&R 1st."
|
|
*
|
|
* OLD_PREP In addition to the KR specifications, this mode has the
|
|
* following characteristics (and some others).
|
|
* Converts comment to 0 space instead of 1 space.
|
|
* Expands the parameter like spelling in string literal as a macro.
|
|
* Does not check unmatched pair of '"' or '\''.
|
|
* OLD_PREP corresponts to "Reiser model" cpp.
|
|
*
|
|
* STD Standard conforming mode.
|
|
* <backslash><newline> sequence is always deleted after trigraph
|
|
* conversion and before tokenization.
|
|
* Digraph sequences are recognized as tokens.
|
|
* Actual arguments of a macro are expanded separately prior to
|
|
* re-scanning of the replacement text.
|
|
* The name in the replacement text once expanded is not re-expanded,
|
|
* thus preventing recursive death.
|
|
* ## in macro definition concatenates tokens. The tokens are not
|
|
* expanded. The concatenated token is expanded by rescanning.
|
|
* # in macro definition stringizes the following argument. The argument
|
|
* is not expanded. \ is inserted before " and \ in or surrounding
|
|
* the string literal or character constant.
|
|
* An expanded macro is surrounded by spaces to prevent unintended
|
|
* token merging.
|
|
*
|
|
* POST_STD This mode simplifies the behavior of STD mode as follows.
|
|
* 1. Digraph sequences are converted in translation phase 1, as
|
|
* alternate characters rather than as tokens.
|
|
* 2. A space is inserted as a token separator between any tokens in
|
|
* a source (except a macro name and the next '(' in macro
|
|
* definition): thus simplifying tokenization, test of macro
|
|
* redefinition and macro expansion, especially "stringization".
|
|
* 3. Test of macro redefinition ignores difference of parameter names,
|
|
* test of which has little utility and not a little overhead.
|
|
* 4. #if expression forbids character constants, which have little
|
|
* portability, little utility and not a little overhead.
|
|
* 5. Rescanning of a macro expansion is limited in the replacement
|
|
* text, rest of the source file is not scanned, thus making the
|
|
* syntax of "function-like" macro call more similar to that of
|
|
* function call.
|
|
* 6. Argument of #include directive in <header.h> form is an obsolescent
|
|
* feature.
|
|
* 7. '$' or so are not treated specially in #define directive.
|
|
* 8. Trigraphs, UCN (universal-character name) are not recognized.
|
|
* 9. Multi-byte characters in an identifier are not recognized.
|
|
*
|
|
* The following specifications are available when mode is STD or POST_STD.
|
|
* preprocessing number token, digraphs,
|
|
* #pragma (#pragma MCPP put_defines, #pragma MCPP warning
|
|
* , #pragma MCPP debug) directive,
|
|
* #error directive,
|
|
* #if defined operator, #elif directive,
|
|
* predefined macros __FILE__, __LINE__, __DATE__, __TIME__
|
|
* , __STDC__, __STDC_VERSION__, __STDC_HOSTED__,
|
|
* wide character constant, wide character string literal,
|
|
* _Pragma() operator, variable-arguments macro,
|
|
* macro as an argument of #include, #line directives,
|
|
* escape sequences \x[hex-digits], \a, \v,
|
|
* '+' option (C++ preprocessing),
|
|
* 'S<n>' option (re-defines __STDC__ as <n>, unpredefine some macros),
|
|
* 'V<n>' option (re-defines __STDC_VERSION__ or __cplusplus as <n>),
|
|
* 'h<n>' option (re-defines __STDC_HOSTED__ as <n>).
|
|
* The following specifications are available only in STD mode.
|
|
* Trigraphs and UCN,
|
|
* Multi-byte characters in an identifier.
|
|
* The following specifications are available only in KR and OLD_PREP modes.
|
|
* #assert, #asm, #endasm, #put_defines, #debug and some other older
|
|
* directives,
|
|
* argument of #line directive other than decimal-digits.
|
|
*/
|
|
|
|
/* The values of 'mcpp_mode'. */
|
|
#define OLD_PREP 1 /* "Reiser" cpp mode */
|
|
#define KR 2 /* K&R 1st mode */
|
|
#define STD 3 /* Standard moce */
|
|
#define POST_STD 9 /* Special mode of MCPP */
|
|
|
|
/*
|
|
* TRIGRAPHS_INIT Initial value for the -3 option. If TRUE -3
|
|
* disables trigraphs, if FALSE -3 enables them.
|
|
* DIGRAPHS_INIT Initial value for the -2 option. If TRUE -2
|
|
* disables digraphs, if FALSE -2 enables them.
|
|
* OK_UCN Enable recognition of Universal-Character-Name sequence
|
|
* by -V199901L option.
|
|
* OK_MBIDENT Enable multi-byte characters in identifier by -V199901L
|
|
* option.
|
|
* EXPAND_PRAGMA Enable macro expansion of #pragma line (even in modes
|
|
* other than C99).
|
|
* expr_t, uexpr_t Type of maximum integer:
|
|
* long long (unsigned long long) or longer.
|
|
* EXPR_MAX should be defined to the maximum value of uexpr_t.
|
|
*/
|
|
#define TRIGRAPHS_INIT FALSE
|
|
#define DIGRAPHS_INIT FALSE
|
|
#ifndef EXPAND_PRAGMA
|
|
#define EXPAND_PRAGMA FALSE
|
|
#endif
|
|
#define OK_UCN TRUE
|
|
#define OK_MBIDENT FALSE
|
|
|
|
#if HAVE_INTMAX_T
|
|
#if HAVE_STDINT_H
|
|
#include "stdint.h"
|
|
#elif HAVE_INTTYPES_H
|
|
#include "inttypes.h"
|
|
#endif
|
|
typedef intmax_t expr_t;
|
|
typedef uintmax_t uexpr_t;
|
|
#else
|
|
#if HAVE_LONG_LONG
|
|
#if (HOST_COMPILER == MSC && _MSC_VER < 1500) || HOST_COMPILER == BORLANDC
|
|
typedef __int64 expr_t;
|
|
typedef unsigned __int64 uexpr_t;
|
|
#else
|
|
typedef long long expr_t;
|
|
typedef unsigned long long uexpr_t;
|
|
#endif
|
|
#else /* !HAVE_LONG_LONG */
|
|
typedef unsigned long uexpr_t;
|
|
typedef long expr_t;
|
|
#endif /* HAVE_LONG_LONG */
|
|
#endif /* HAVE_INTMAX_T */
|
|
|
|
#if HAVE_INTMAX_T
|
|
#define EXPR_MAX UINTMAX_MAX
|
|
#elif HAVE_LONG_LONG
|
|
#if (HOST_COMPILER == MSC && _MSC_VER < 1400) || HOST_COMPILER == BORLANDC
|
|
#define EXPR_MAX 0xFFFFFFFFFFFFFFFFui64
|
|
#else
|
|
#define EXPR_MAX 0xFFFFFFFFFFFFFFFFULL
|
|
#endif
|
|
#else
|
|
#define EXPR_MAX 4294967295UL
|
|
#endif
|
|
|
|
/*
|
|
* Translation limits.
|
|
* The following definitions are used to allocate memory for work buffers.
|
|
*
|
|
* NWORK Output buffer size. Set this size according to your compiler-
|
|
* proper. Length of string literal should be less than NWORK
|
|
* - 1.
|
|
* Nevertheless, when COMPILER == GNUC || COMPILER == MSC, mcpp
|
|
* uses NMACWORK as output buffer size because GNUC and Visual C
|
|
* can accept very long line.
|
|
* NBUFF Input buffer size after line concatenation by <backslash>
|
|
* <newline>.
|
|
* NMACWORK Internal work buffer size for macro definition and expansion.
|
|
* IDMAX The longest identifier length.
|
|
* NMACPARS The maximum number of #define parameters.
|
|
* NOTE: Must be NMACPARS <= UCHARMAX.
|
|
* NEXP The maximum nesting depth of #if expressions.
|
|
* BLK_NEST The number of nested #if's permitted.
|
|
* INCLUDE_NEST The maximum nesting depth of #include. This is needed to
|
|
* prevent infinite recursive inclusion.
|
|
* RESCAN_LIMIT The maximum rescan times of macro expansion in STD or POST_STD
|
|
* modes.
|
|
* PRESTD_RESCAN_LIMIT The maximum rescan times of macro expansion in KR or
|
|
* OLD_PREP modes..
|
|
*
|
|
* NBUFF should not be smaller than NWORK.
|
|
* NMACWORK should not be smaller than NWORK * 2.
|
|
*
|
|
* SBSIZE defines the number of hash-table slots for the macro symbol table.
|
|
* It must be a power of 2.
|
|
*
|
|
* MKDEP_INIT The initial maximum number of filenames in a dependency line
|
|
* of output of -M* option. The maximum number is dynamically
|
|
* enlarged in execution.
|
|
*/
|
|
|
|
#ifndef IDMAX
|
|
#define IDMAX 0x400
|
|
#endif
|
|
#ifndef NMACPARS
|
|
#define NMACPARS 0xFF
|
|
#endif
|
|
#ifndef NEXP
|
|
#define NEXP 0x100
|
|
#endif
|
|
#ifndef BLK_NEST
|
|
#define BLK_NEST 0x100
|
|
#endif
|
|
#ifndef INCLUDE_NEST
|
|
#define INCLUDE_NEST 0x100
|
|
#endif
|
|
#ifndef RESCAN_LIMIT
|
|
#define RESCAN_LIMIT 0x40
|
|
#endif
|
|
#ifndef PRESTD_RESCAN_LIMIT
|
|
#define PRESTD_RESCAN_LIMIT 0x100
|
|
#endif
|
|
#ifndef NBUFF
|
|
#define NBUFF 0x10000 /* Must be NWORK <= NBUFF */
|
|
#endif
|
|
#ifndef NWORK
|
|
#define NWORK NBUFF /* 0x1000, 0x4000, 0x10000, .. */
|
|
#endif
|
|
#ifndef NMACWORK
|
|
#define NMACWORK (NWORK * 4) /* Must be NWORK * 2 <= NMACWORK */
|
|
#endif
|
|
#ifndef SBSIZE
|
|
#define SBSIZE 0x400
|
|
#endif
|
|
#ifndef MKDEP_INIT
|
|
#define MKDEP_INIT 0x100
|
|
#endif
|
|
|
|
#if UCHARMAX < NMACPARS
|
|
#error "NMACPARS should not be greater than UCHARMAX"
|
|
#endif
|
|
|
|
#if NBUFF < NWORK
|
|
#error "NBUFF must be same or greater than NWORK"
|
|
#endif
|
|
#if NMACWORK < NWORK * 2
|
|
#error "NMACWORK must be same or greater than NWORK * 2"
|
|
#endif
|
|
|
|
#define SBMASK (SBSIZE - 1)
|
|
#if (SBSIZE ^ SBMASK) != ((SBSIZE * 2) - 1)
|
|
#error "SBSIZE must be a power of 2 !"
|
|
#endif
|
|
|
|
/*
|
|
* Translation limits required by the Standard.
|
|
*
|
|
* *90MIN limits specified by C90.
|
|
* *99MIN limits specified by C99.
|
|
* *_CPLUS_MIN limits recommended by C++ (ISO 1998/07 Standard).
|
|
*
|
|
* SLEN*MIN Characters in a logical source line
|
|
* and characters in a string literal or wide string literal
|
|
* (after concatenation).
|
|
* IDLEN*MIN Significant initial characters in an internal identifier
|
|
* or a macro name.
|
|
* NMACPARS*MIN Parameters in one macro definition.
|
|
* Arguments in one macro invocation.
|
|
* EXP_NEST*MIN Nesting levels of parenthesized expressions in a full
|
|
* expression.
|
|
* BLK_NEST*MIN Nesting levels of conditional inclusion.
|
|
* INCLUDE_NEST*MIN Nesting levels for #include files.
|
|
* NMACRO*MIN Macro identifiers simultaneously defined in one translation
|
|
* unit.
|
|
*/
|
|
#define SLEN90MIN 0x1FD
|
|
#define IDLEN90MIN 0x1F
|
|
#define NMACPARS90MIN 0x1F
|
|
#define EXP_NEST90MIN 0x20
|
|
#define BLK_NEST90MIN 8
|
|
#define INCLUDE_NEST90MIN 8
|
|
#define NMACRO90MIN 0x400
|
|
|
|
#define SLEN99MIN 0xFFF
|
|
#define IDLEN99MIN 0x3F
|
|
#define NMACPARS99MIN 0x7F
|
|
#define EXP_NEST99MIN 0x3F
|
|
#define BLK_NEST99MIN 0x3F
|
|
#define INCLUDE_NEST99MIN 0xF
|
|
#define NMACRO99MIN 0xFFF
|
|
|
|
#define SLEN_CPLUS_MIN 0x10000
|
|
#define IDLEN_CPLUS_MIN 0x400
|
|
#define NMACPARS_CPLUS_MIN 0x100
|
|
#define EXP_NEST_CPLUS_MIN 0x100
|
|
#define BLK_NEST_CPLUS_MIN 0x100
|
|
#define INCLUDE_NEST_CPLUS_MIN 0x100
|
|
#define NMACRO_CPLUS_MIN 0x10000
|
|
|
|
/* LINE99LIMIT means the line number limit of C99 */
|
|
#define LINE99LIMIT 0x7FFFFFFF
|
|
|
|
/*
|
|
* STDC This macro is used for the predefined __STDC__.
|
|
* STDC_VERSION is used for the value of __STDC_VERSION__.
|
|
* STDC_HOSTED is used for the value of __STDC_HOSTED__.
|
|
*/
|
|
#if IDMAX < IDLEN90MIN || NBUFF < SLEN90MIN + 3
|
|
|| NWORK < SLEN90MIN + 2 || NMACPARS < NMACPARS90MIN
|
|
|| NEXP < EXP_NEST90MIN || BLK_NEST < BLK_NEST90MIN
|
|
#define STDC 0
|
|
#endif
|
|
#ifndef STDC
|
|
#define STDC 1 /* 1 : for ISO 9899:1990 or later */
|
|
#endif
|
|
|
|
#ifndef STDC_VERSION
|
|
#define STDC_VERSION 0L /* 199409L : For conforming
|
|
implementation to ISO 9899:1990 / Amendment 1:1995
|
|
199901L : For C99 */
|
|
#endif
|
|
#ifndef STDC_HOSTED
|
|
#define STDC_HOSTED 1 /* 1 : for hosted implementation,
|
|
0 : for free-standing implementation (C99 specification) */
|
|
#endif
|
|
|
|
/*
|
|
* CPLUS specifies the default value of the pre-defined macro __cplusplus
|
|
* for C++ processing.
|
|
* The value can be changed by -V<n> option.
|
|
*/
|
|
#define CPLUS 1 /* 199711L for C++ Standard */
|
|
|