/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
* 
* Distributable under the terms of either the Apache License (Version 2.0) or 
* the GNU Lesser General Public License, as specified in the COPYING file.
*
* Changes are Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
------------------------------------------------------------------------------*/
#if !defined(_lucene_COMPILER_GCC)
#define _lucene_COMPILER_GCC

// It is internal CLucene header - DO NOT include it directly
#if !defined(_SUPPRESS_MAKE_BASED_CONFIG)
    #if defined(_BUILD_FOR_QT_)
        #include "fulltextsearch/qclucene-config_p.h"
    #else
        #include "CLucene/clucene-config.h" //make clucene-config.h file
    #endif
#endif

#if defined(_ASCII)
 #undef _UCS2
#elif defined(_UCS2)
//
#else
 #define CL_CHARSET_GUESS
#endif

//dont allow FS_MMAP if mmap is not available
#if defined(LUCENE_FS_MMAP) && !defined(_CL_HAVE_MMAP)
	#error "LUCENE_FS_MMAP is defined and MMap doesn't appear to be available"
#endif

#ifdef _CL_HAVE_NO_FUNCTION_TRY_BLOCKS
    #undef  _LUCENE_DISABLE_EXCEPTIONS
    #define _LUCENE_DISABLE_EXCEPTIONS
    
    #error "this is bad if you made it here... your compiler seems not to have try/catch blocks."
    #error "maybe you could implement an alternative solution for us? :)"
#endif

#ifndef _CL_HAVE_NAMESPACES
	#define DISABLE_NAMESPACE
#endif

#define CL_NS_HASHING(func) __gnu_cxx::func
#define LUCENE_DISABLE_HASHING //we could enable this, but so far test show that the hashing is slower :(

//define the file functions
#define fileSeek lseek
#define fileSize _filelength
#define fileStat stat
#define fileHandleStat fstat
#ifdef _CL_HAVE_TELL
    #define fileTell tell
#else
    //ftell (and probably soon ftell64) are POSIX standard functions, but tell and
    //tell64 are not, so we define fileTell in terms of fileSeek.
    #define fileTell(fhandle) fileSeek(fhandle, 0, SEEK_CUR)
#endif

//this is needed early on so that CL_MAX_PATH can be correctly determined
//in the StdHeader.h. This was earlier causing problems with macosx.
//:: crash was due to realpath() that expects an output arguments that
//has at least the size of PATH_MAX (even if the result has a lower size)
#include <limits.h>
    
#ifndef _CL_HAVE_WCHAR_T
    typedef unsigned short wchar_t;
#endif

#if defined(__CYGWIN__)
   //cygwin seems to incorrectly define that it has wprintf???
   #undef _CL_HAVE_WPRINTF
#elif defined(__MINGW32__)
	#ifndef _CL_HAVE_WINDOWS_H
		#define _CL_HAVE_WINDOWS_H
	#endif
#endif


///////////////////////////////////////////////////////////////////////////////
//end _lucene_COMPILER_GCC1
#elif !defined(_lucene_COMPILER_GCC2)
#define _lucene_COMPILER_GCC2
    //second inclusion

    //types
    #if defined(_CL_HAVE_SYS_TYPES_H)
        #include <sys/types.h>
    #endif
	#if defined(_CL_HAVE_INTTYPES_H)
		#include <inttypes.h>
	#elif defined(_CL_HAVE_STDINT_H)
		#include <stdint.h>
	#else
		#if _CL_SIZEOF_UNSIGNED_LONG_LONG==8
			typedef unsigned long long uint64_t;
			typedef long long int64_t;
		#elif _CL_SIZEOF_UNSIGNED_LONG==8
			typedef unsigned long uint64_t;
			typedef long int64_t;
		#else
			#error I do not know what to use for a uint64_t.
		#endif
		
		/* Give us an unsigned 32-bit data type. */
		#if _CL_SIZEOF_UNSIGNED_LONG==4
			typedef unsigned long uint32_t;
			typedef long int32_t;
		#elif _CL_SIZEOF_UNSIGNED_INT==4
			typedef unsigned int uint32_t;
			typedef int int32_t;
		#else
			#error I do not know what to use for a uint32_t.
		#endif

		/* An unsigned 8-bit data type */
		#if _CL_SIZEOF_UNSIGNED_CHAR==1
			typedef unsigned char uint8_t;
		#else
			#error I do not know what to use for a uint8_t.
		#endif
	#endif
    
    //second chance to fix default settings
	//this must be defined later, otherwise it messes up
	//the standard libraries
	#if !defined(__MINGW32__)
	    #define _close ::close
	    #define _read ::read
	#endif

  	//now that int64_t is defined, we can define this...
	#ifndef _CL_HAVE_FILELENGTH
	    #undef fileSize
	    #define fileSize lucene_filelength
	    int64_t lucene_filelength(int handle);
	#endif

#elif !defined(_lucene_COMPILER_GCC3)
#define _lucene_COMPILER_GCC3
    //third inclusion

	#if !defined(__MINGW32__)
	    //define replacements
	    #define O_RANDOM 0
	    #undef O_BINARY
	    #define O_BINARY 0
	    #define _S_IREAD  0444
	    #define _S_IWRITE 0333  // write and execute permissions

	    //some functions that are needed - not charset dependent and not tchar type functions
	    #define _open open
	    #define _write write
	    #define _snprintf snprintf

	    //clucene uses ascii for filename interactions
	    #define _realpath(rel,abs) realpath(rel,abs)
	    #define _mkdir(x) mkdir(x,0777)
	    #define _unlink unlink
	#else
	    #define _realpath(rel,abs) _fullpath(abs,rel,CL_MAX_PATH)
	#endif
	//also required by mingw
	#define _rename rename
#endif

#if defined(__GNUC__) && (defined(__sgi) || (defined(Q_OS_SOLARIS) && Q_SOLARIS_VERSION < 10))
    #undef _CL_HAVE_FLOAT_T
#endif

#if defined(__GNUC__) && defined(Q_OS_SOLARIS) && Q_SOLARIS_VERSION < 10
    #undef _CL_HAVE_WCSTOLL
#endif
