#ifndef PCCTS_CONFIG_H
#define PCCTS_CONFIG_H
/*
 * pcctscfg.h (formerly config.h) (for ANTLR, DLG, and SORCERER)
 *
 * This is a simple configuration file that doesn't have config stuff
 * in it, but it's a start.
 *
 * SOFTWARE RIGHTS
 *
 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 * company may do whatever they wish with source code distributed with
 * PCCTS or the code generated by PCCTS, including the incorporation of
 * PCCTS, or its output, into commerical software.
 *
 * We encourage users to develop software with PCCTS.  However, we do ask
 * that credit is given to us for developing PCCTS.  By "credit",
 * we mean that if you incorporate our source code into one of your
 * programs (commercial product, research project, or otherwise) that you
 * acknowledge this fact somewhere in the documentation, research report,
 * etc...  If you like PCCTS and have developed a nice tool with the
 * output, please mention that you developed it using PCCTS.  In
 * addition, we ask that this header remain intact in our source code.
 * As long as these guidelines are kept, we expect to continue enhancing
 * this system and expect to make other tools available as they are
 * completed.
 *
 * Used by PCCTS 1.33 (SORCERER 1.00B11 and up)
 * Terence Parr
 * Parr Research Corporation
 * with Purdue University and AHPCRC, University of Minnesota
 * 1989-2000
 */

/* This file knows about the following ``environments''
	UNIX    (default)
	DOS     (use #define PC)
	MAC     (use #define MPW; has a few things for THINK C, Metrowerks)
    MS/C++  (MR14 Microsoft Visual C++ environment uses symbol _MSC_VER)

 */

/* should test __STDC__ for 1, but some compilers don't set value, just def */

#ifndef __USE_PROTOS
#if defined(__STDC__) || defined(__STDC_HOSTED__)
#define __USE_PROTOS
#endif
#ifdef __cplusplus
#define __USE_PROTOS
#endif
#endif

#ifdef PCCTS_USE_NAMESPACE_STD
#define PCCTS_NAMESPACE_STD     namespace std {}; using namespace std;
#else
#define PCCTS_NAMESPACE_STD
#endif

#include "pccts_stdio.h"
#include "pccts_stdlib.h"

/* largest file name size */

#ifdef _MAX_PATH
#define MaxFileName		_MAX_PATH /* MR9 RJV: MAX_PATH defined in stdlib.h (MSVC++ 5.0) */
#else
#define MaxFileName		300
#endif

/*
*  Define PC32 if in a 32-bit PC environment (e.g. extended DOS or Win32).
*  The macros tested here are defined by Watcom, Microsoft, Borland,
*  and djgpp, respectively, when they are used as 32-bit compilers.
*  Users of these compilers *must* be sure to define PC in their
*  makefiles for this to work correctly.
*/
#ifdef PC
# if (defined(__WATCOMC__) || defined(_WIN32) || defined(__WIN32__) || \
   defined(__GNUC__) || defined(__GNUG__))
#     ifndef PC32
#        define PC32
#     endif
#  endif
#endif

/* MR1  10-Apr-97  Default for PC is short file names			            */
/* MR1		   Default for non-PC is long file names                		*/
/* MR1		   Can override via command line option LONGFILENAMES           */

#ifndef LONGFILENAMES
#ifndef PC
#define LONGFILENAMES
#endif
#endif

#ifndef LONGFILENAMES
#define ATOKEN_H			"AToken.h"
#define ATOKPTR_H			"ATokPtr.h"
#define ATOKPTR_IMPL_H		"ATokPtrIm.h"
#define ATOKENBUFFER_H		"ATokBuf.h"
#define ATOKENBUFFER_C      "ATokBuf.cpp"
#define ATOKENSTREAM_H		"ATokStr.h"
#define APARSER_H			"AParser.h"
#define APARSER_C           "AParser.cpp"
#define ASTBASE_H			"ASTBase.h"
#define ASTBASE_C           "ASTBase.cpp"
#define PCCTSAST_C          "PCCTSAST.cpp"
#define LIST_C              "List.cpp"
#define DLEXERBASE_H		"DLexBase.h"
#define DLEXERBASE_C        "DLexBase.cpp"
#define DLEXER_H            "DLexer.h"
#define STREESUPPORT_C		"STreeSup.C"
#else
#define ATOKEN_H			"AToken.h"
#define ATOKPTR_H			"ATokPtr.h"
#define ATOKPTR_IMPL_H		"ATokPtrImpl.h"
#define ATOKENBUFFER_H		"ATokenBuffer.h"
#define ATOKENBUFFER_C		"ATokenBuffer.cpp"
#define ATOKENSTREAM_H		"ATokenStream.h"
#define APARSER_H			"AParser.h"
#define APARSER_C			"AParser.cpp"
#define ASTBASE_H			"ASTBase.h"
#define ASTBASE_C		    "ASTBase.cpp"
#define PCCTSAST_C			"PCCTSAST.cpp"
#define LIST_C				"List.cpp"
#define DLEXERBASE_H		"DLexerBase.h"
#define DLEXERBASE_C		"DLexerBase.cpp"
#define DLEXER_H			"DLexer.h"
#define STREESUPPORT_C		"STreeSupport.cpp"
#endif

/* SORCERER Stuff */

/* MR8 6-Aug-97     Change from ifdef PC to ifndef LONGFILENAMES            */

#ifndef LONGFILENAMES
#define STPARSER_H			"STreePar.h"
#define STPARSER_C			"STreePar.C"
#else
#define STPARSER_H			"STreeParser.h"
#define STPARSER_C			"STreeParser.cpp"
#endif

#ifdef MPW
#define CPP_FILE_SUFFIX		".cp"
#define CPP_FILE_SUFFIX_NO_DOT	"cp"
#define OBJ_FILE_SUFFIX		".o"
#else
#ifdef PC
#define CPP_FILE_SUFFIX		".cpp"
#define CPP_FILE_SUFFIX_NO_DOT	"cpp"
#define OBJ_FILE_SUFFIX		".obj"
#else
#ifdef __VMS
#define CPP_FILE_SUFFIX		".cpp"
#define CPP_FILE_SUFFIX_NO_DOT	"cpp"
#define OBJ_FILE_SUFFIX		".obj"
#else
#define CPP_FILE_SUFFIX		".cpp"
#define CPP_FILE_SUFFIX_NO_DOT	"cpp"
#define OBJ_FILE_SUFFIX		".o"
#endif
#endif
#endif

/* User may redefine how line information looks */     /* make it #line MR7 */
/* MR21 Use #ifndef */

#ifndef LineInfoFormatStr
#define LineInfoFormatStr "#line %d \"%s\"\n"
#endif

#ifdef MPW	                    /* Macintosh Programmer's Workshop */
#define ErrHdr "File \"%s\"; Line %d #"
#else
#ifdef _MSC_VER                 /* MR14 Microsoft Visual C++ environment */
#define ErrHdr "%s(%d) :"
#else
#define ErrHdr "%s, line %d:"   /* default */
#endif
#endif

/* must assume old K&R cpp here, can't use #if defined(..)... */

#ifdef MPW
#define TopDirectory	":"
#define DirectorySymbol	":"
#define OutputDirectoryOption "Directory where all output files should go (default=\":\")"
#else
#ifdef PC
#define TopDirectory	"."
#define DirectorySymbol	"\\"
#define OutputDirectoryOption "Directory where all output files should go (default=\".\")"
#else
#ifdef __VMS
#define TopDirectory  "[000000]"
#define DirectorySymbol       "]"
#define OutputDirectoryOption "Directory where all output files should go (default=\"[]\")"
#else
#define TopDirectory	"."
#define DirectorySymbol	"/"
#define OutputDirectoryOption "Directory where all output files should go (default=\".\")"
#endif
#endif
#endif

#ifdef MPW

/* Make sure we have prototypes for all functions under MPW */

#include "pccts_string.h"
#include "pccts_stdlib.h"

/* MR6 2-Jun-97	Fixes false dependency caused by VC++ #include scanner	*/
/* MR6		   Reported by Brad Schick (schick@interaccess.com)	*/
#define	MPW_CursorCtl_Header <CursorCtl.h>
#include MPW_CursorCtl_Header
#ifdef __cplusplus
extern "C" {
#endif
extern void fsetfileinfo (const char *filename, unsigned long newcreator, unsigned long newtype);
#ifdef __cplusplus
}
#endif

/* File creators for various popular development environments */

#define MAC_FILE_CREATOR 'MPS '   /* MPW Text files */
#if 0
#define MAC_FILE_CREATOR 'KAHL'   /* THINK C/Symantec C++ Text files */
#endif
#if 0
#define MAC_FILE_CREATOR 'CWIE'   /* Metrowerks C/C++ Text files */
#endif

#endif

#ifdef MPW
#define DAWDLE	SpinCursor(1)
#else
#define DAWDLE
#endif

#ifdef MPW
#define SPECIAL_INITS
#define SPECIAL_FOPEN
#endif

#ifdef MPW
#ifdef __cplusplus
inline
#else
static
#endif
void special_inits()
{
  InitCursorCtl((acurHandle) 0);
}
#endif

#ifdef MPW
#ifdef __cplusplus
inline
#else
static
#endif
void special_fopen_actions(char * s)
{
  fsetfileinfo (s, MAC_FILE_CREATOR, 'TEXT');
}
#endif

/* Define usable bits for set.c stuff */
#define BytesPerWord	sizeof(unsigned)
#define	WORDSIZE		(sizeof(unsigned)*8)
#define LogWordSize     (WORDSIZE==16?4:5)

#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif

#if defined(VAXC) || defined(__VMS)
#include <ssdef.h>
#define PCCTS_EXIT_SUCCESS 1
#define PCCTS_EXIT_FAILURE SS$_ABORT
#define zzDIE		return SS$_ABORT;
#define zzDONE	return 1;

#else /* !VAXC and !__VMS */

#define PCCTS_EXIT_SUCCESS 0
#define PCCTS_EXIT_FAILURE 1
#define zzDIE		return 1;
#define zzDONE	return 0;

#endif

#ifdef USER_ZZMODE_STACK
# ifndef ZZSTACK_MAX_MODE
#  define  ZZSTACK_MAX_MODE 32
# endif
# define  ZZMAXSTK (ZZSTACK_MAX_MODE * 2)
#endif

#ifndef DllExportPCCTS
#define DllExportPCCTS
#endif

#ifdef PC
#ifndef PCCTS_CASE_INSENSITIVE_FILE_NAME
#define PCCTS_CASE_INSENSITIVE_FILE_NAME
#endif
#endif

#ifdef PC32
#ifndef PCCTS_CASE_INSENSITIVE_FILE_NAME
#define PCCTS_CASE_INSENSITIVE_FILE_NAME
#endif
#endif

#ifdef __VMS
#ifndef PCCTS_CASE_INSENSITIVE_FILE_NAME
#define PCCTS_CASE_INSENSITIVE_FILE_NAME
#endif
#endif

#ifdef __USE_PROTOS
#ifndef PCCTS_USE_STDARG
#define PCCTS_USE_STDARG
#endif
#endif

#if defined(__STDC__) || defined(__STDC_HOSTED__)
#ifndef PCCTS_USE_STDARG
#define PCCTS_USE_STDARG
#endif
#endif

#ifdef __cplusplus
#ifndef PCCTS_USE_STDARG
#define PCCTS_USE_STDARG
#endif
#endif

#ifdef _MSC_VER
/*Turn off the warnings for:
  unreferenced inline/local function has been removed
*/
#pragma warning(disable : 4514)
/* function not expanded */
#pragma warning(disable : 4710)
#endif

#endif
