blob: fbb3fd9496b95bf5a7a5f0bd6e6dbfe33d662e46 [file] [log] [blame]
/*------------------------------------------------------------------------------
* 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).
------------------------------------------------------------------------------*/
#ifndef lucene_stdheader_h
#define lucene_stdheader_h
#if defined(OVERRIDE_DEFAULT_CLCONFIG)
#include "AltCLConfig.h"
#else
#include "CLucene/CLConfig.h"
#endif
//first inclusion of compiler.h (it will be called again later)
#include "CLucene/config/compiler.h"
extern void _lucene_shutdown();
extern int _lucene_counter_break; //can set a watch on this
#if defined(LUCENE_ENABLE_MEMLEAKTRACKING)
extern bool _lucene_disable_debuglogging; //if LUCENE_ENABLE_CONSTRUCTOR_LOG is on, dont do log if this is true
#endif
////////////////////////////////////////////////////////
// default includes
////////////////////////////////////////////////////////
#ifndef LUCENE_DISABLE_INCLUDES
#include <stdio.h>
#if defined(_CL_STDC_HEADERS)
#include <stdlib.h>
#include <stddef.h>
#else
#if defined(_CL_HAVE_STDLIB_H)
#include <stdlib.h>
#endif
#endif
#if defined(_CL_HAVE_STRING_H)
#if !defined(_CL_STDC_HEADERS) && defined(_CL_HAVE_MEMORY_H)
#include <memory.h>
#endif
#include <string.h>
#elif defined(_CL_HAVE_STRINGS_H)
//note: as a side note, strtok is not thread-safe.. so be careful where you use it!
#error "strtok replacement for BSD has not been implemented"
#include <strings.h>
#if !defined(_CL_HAVE_STRCHR)
#define strchr index
#define strrchr rindex
#endif
#endif
#if defined(_CL_HAVE_UNISTD_H)
#include <unistd.h>
#elif defined(_CL_HAVE_IO_H) && defined(_CL_HAVE_DIRECT_H)
#ifndef UNDER_CE
#include <io.h>
#include <direct.h>
#endif
#else
#error "Neither unistd.h or (io.h & direct.h) were available"
#endif
#ifndef _CL_DISABLE_NATIVE_EXCEPTIONS
#ifdef _CL_HAVE_STDEXCEPT
#include <stdexcept>
#else
#error "CLucene can't compile with exception handling on because <stdexcept> header is not available"
#endif
#endif
#if defined(_CL_STAT_MACROS_BROKEN)
#error "Haven't implemented STAT_MACROS_BROKEN fix yet"
#elif defined(_CL_HAVE_SYS_STAT_H)
#ifdef UNDER_CE
#include <types.h>
#else
#include <sys/stat.h>
#endif
#else
#error "Haven't implemented platforms with no sys/stat.h"
#endif
#if defined(_CL_HAVE_STDARG_H)
#include <stdarg.h>
#else
#error "CLucene can compile, but some extras may not work"
#endif
#if defined(_CL_HAVE_MATH_H)
#include <math.h>
#else
#error "CLucene can't compile without <math.h>"
#endif
#if defined(_CL_HAVE_MAP)
#include <map>
#else
#error "CLucene can't compile without the map header"
#endif
#if defined(_CL_HAVE_LIST)
#include <list>
#else
#error "CLucene can't compile without the list header"
#endif
#if defined(_CL_HAVE_SET)
#include <set>
#else
#error "CLucene can't compile without the set header"
#endif
#if defined(_CL_HAVE_VECTOR)
#include <vector>
#else
#error "CLucene can't compile without the vector header"
#endif
#if !defined(LUCENE_DISABLE_HASHING) && defined(_CL_HAVE_HASH_MAP) && defined(_CL_HAVE_HASH_SET)
//hashing is all or nothing!
#include <hash_map>
#include <hash_set>
#elif !defined(LUCENE_DISABLE_HASHING) && defined(_CL_HAVE_EXT_HASH_MAP) && defined(_CL_HAVE_EXT_HASH_SET)
#include <ext/hash_map>
#include <ext/hash_set>
#elif !defined(LUCENE_DISABLE_HASHING)
#define LUCENE_DISABLE_HASHING
#endif
#if !defined(LUCENE_DISABLE_HASHING) && !defined(CL_NS_HASHING)
#define CL_NS_HASHING(func) std::func
#endif
#if defined(_CL_HAVE_ALGORITHM)
# include <algorithm>
#else
# error "Can't compile clucene without <algorithm>"
#endif
#if defined(_CL_HAVE_FUNCTIONAL)
# include <functional>
#else
# error "Can't compile clucene without <functional>"
#endif
#if !defined(_CL_HAVE_PRINTF)
#error "CLucene can't compile without printf, replacements have not been implemented"
#endif
#if !defined(_CL_HAVE_SNPRINTF) && !defined(_CL_HAVE__SNPRINTF)
#error "CLucene can't compile without snprintf, replacements have not been implemented"
#elif !defined(_CL_HAVE__SNPRINTF)&& defined(_CL_HAVE_SVNPRINTF)
#define _snprintf snprintf
#endif
#if defined(_UCS2)
#if defined(_CL_HAVE_WCHAR_H)
#include <wchar.h>
#else
//actually the repl_wchar.h replacements header will
//always be included. It replaces some functions
//that are missing in some wchar.h headers.
#endif
#endif
#if defined(_UCS2) && defined(_CL_HAVE_WCTYPE_H)
#include <wctype.h>
#elif defined(_ASCII) && defined(_CL_HAVE_CTYPE_H)
#include <ctype.h>
#undef LUCENE_USE_INTERNAL_CHAR_FUNCTIONS
#elif defined(_UCS2)
//must be in _UCS2 to use internal char functions
#undef LUCENE_USE_INTERNAL_CHAR_FUNCTIONS
#define LUCENE_USE_INTERNAL_CHAR_FUNCTIONS
#else
#error "Cannot compile in _ASCII without ctype.h"
#endif
//always include replacement, some missing tchar defines
#include "CLucene/config/repl_tchar.h"
#if defined(_CL_HAVE_ERRNO_H)
#ifndef UNDER_CE
#include <errno.h>
#endif
#else
#error "Haven't implemented platforms with no errno.h"
#endif
#if defined(_CL_HAVE_FCNTL_H)
#ifndef UNDER_CE
#include <fcntl.h>
#endif
#else
#error "Haven't implemented platforms with no fcntl.h"
#endif
#if defined(_CL_HAVE_WINDOWS_H)
#include <windows.h>
#endif
#endif //LUCENE_DISABLE_INCLUDES
//
////////////////////////////////////////////////////////
//second inclusion of compiler.h
//this gives CompilerXXX.h a chance to include other headers
#include "CLucene/config/compiler.h"
//
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// Character functions.
// Here we decide whose character functions to use
////////////////////////////////////////////////////////
#if defined(LUCENE_USE_INTERNAL_CHAR_FUNCTIONS)
#define stringCaseFold cl_tcscasefold
#define stringCaseFoldCmp cl_tcscasefoldcmp
#undef _istspace
#undef _istdigit
#undef _istalnum
#undef _istalpha
#undef _totlower
#undef _totupper
#define _istalnum cl_isalnum
#define _istalpha cl_isletter
#define _istspace cl_isspace
#define _istdigit cl_isdigit
#define _totlower cl_tolower
#define _totupper cl_toupper
//here are some functions to help deal with utf8/ucs2 conversions
//lets let the user decide what mb functions to use... we provide pure utf8 ones no matter what.
/*#undef _mbtowc
#undef _mbstowcs
#undef _wctomb
#undef _wcstombs
#define _mbtowc lucene_mbstowc
#define _mbsstowcs lucene_mbstowcs
#define _wctomb lucene_wcto_mb
#define _wcstombs lucene_wcstombs*/
#else
//we are using native functions
//here are some functions to help deal with utf8/ucs2 conversions
/*#define _mbtowc mbtowc
#define _wctomb wctomb
#define _mbstowcs mbstowcs
#define _wcstombs wcstombs*/
//we are using native character functions
#if defined(_ASCII)
#undef _istspace
#undef _istdigit
#undef _istalnum
#undef _istalpha
#undef _totlower
#undef _totupper
#define _istspace(x) isspace((unsigned char)x)
#define _istdigit(x) isdigit((unsigned char)x)
#define _istalnum(x) isalnum((unsigned char)x)
#define _istalpha(x) isalpha((unsigned char)x)
#define _totlower(x) tolower((unsigned char)x)
#define _totupper(x) toupper((unsigned char)x)
#endif
#endif
//the methods contained in gunichartables.h
typedef unsigned long clunichar;
bool cl_isletter(clunichar c);
bool cl_isalnum(clunichar c);
bool cl_isdigit(clunichar c);
bool cl_isspace (clunichar c);
TCHAR cl_tolower (TCHAR c);
TCHAR cl_toupper (TCHAR c);
int cl_tcscasefoldcmp(const TCHAR * dst, const TCHAR * src);
TCHAR* cl_tcscasefold( TCHAR * str, int len=-1 );
//we provide utf8 conversion functions
size_t lucene_utf8towc (wchar_t *ret, const char *s, size_t n);
size_t lucene_utf8towcs(wchar_t *, const char *, size_t maxslen);
size_t lucene_wctoutf8 (char * ret, const wchar_t str);
size_t lucene_wcstoutf8 (char *, const wchar_t *, size_t maxslen);
size_t lucene_utf8charlen(const char *p);
///a blank string...
extern TCHAR* _LUCENE_BLANK_STRING;
#define LUCENE_BLANK_STRING _LUCENE_BLANK_STRING
extern char* _LUCENE_BLANK_ASTRING;
#define LUCENE_BLANK_ASTRING _LUCENE_BLANK_ASTRING
/* Converts a string into a form that is independent of case. The
* result will not correspond to any particular case, but can be
* compared for equality or ordered with the results of calling
* stringCaseFold() on other strings.
*
* If we did not define this elsewhere, then just convert to lower case
*/
#ifndef stringCaseFold
#define stringCaseFold _tcslwr
#endif
/* Compares 2 strings using case folding (if available)
* If we did not define this elsewhere, then just compare
* using normal method
*/
#ifndef stringCaseFoldCmp
#define stringCaseFoldCmp _tcsicmp
#endif
//now that all the character routines are completed, include the
//wchar.h replacements.
#include "CLucene/config/repl_wchar.h" //always include replacements
//a replacement for _tcsdup. This uses new TCHAR[] instead of malloc, so that we can use delete[] to free
#if defined(LUCENE_ENABLE_FILELINEINFO)
#define CL_FILELINE ,__FILE__,__LINE__
#define CL_FILELINEREF ,file,line ///<for passing the reference along to another function
#define CL_FILELINEREF2 ,file,line ///<for passing the reference along to another function
#define CL_FILELINEPARAM ,char* file,int line
#else
#define CL_FILELINE
#define CL_FILELINEREF
#define CL_FILELINEREF2 ,NULL,-1
#define CL_FILELINEPARAM
#endif
char* lucenestrdup(const char* v CL_FILELINEPARAM);
#if defined(_UCS2)
wchar_t* lucenewcsdup(const wchar_t* v CL_FILELINEPARAM);
#define stringDuplicate(x) lucenewcsdup(x CL_FILELINE) //don't change this... uses [] instead of malloc
#else
#define stringDuplicate(x) lucenestrdup(x CL_FILELINE) //don't change this... uses [] instead of malloc
#endif
#define STRCPY_AtoA(target,src,len) strncpy(target,src,len)
#define STRDUP_AtoA(x) lucenestrdup(x CL_FILELINE)
#if defined(_UCS2)
#define STRDUP_WtoW(x) lucenewcsdup(x CL_FILELINE)
#define STRDUP_TtoT STRDUP_WtoW
#define STRDUP_WtoT STRDUP_WtoW
#define STRDUP_TtoW STRDUP_WtoW
#define STRDUP_AtoW(x) CL_NS(util)::Misc::_charToWide(x CL_FILELINE)
#define STRDUP_AtoT STRDUP_AtoW
#define STRDUP_WtoA(x) CL_NS(util)::Misc::_wideToChar(x CL_FILELINE)
#define STRDUP_TtoA STRDUP_WtoA
#define STRCPY_WtoW(target,src,len) _tcsncpy(target,src,len)
#define STRCPY_TtoW STRCPY_WtoW
#define STRCPY_WtoT STRCPY_WtoW
#define STRCPY_TtoT STRCPY_WtoW
#define STRCPY_AtoW(target,src,len) CL_NS(util)::Misc::_cpycharToWide(src,target,len)
#define STRCPY_AtoT STRCPY_AtoW
#define STRCPY_WtoA(target,src,len) CL_NS(util)::Misc::_cpywideToChar(src,target,len)
#define STRCPY_TtoA STRCPY_WtoA
#else
#define STRDUP_AtoT STRDUP_AtoA
#define STRDUP_TtoA STRDUP_AtoA
#define STRDUP_TtoT STRDUP_AtoA
#define STRDUP_WtoT(x) xxxxxxxxxxxxxxx //not possible
#define STRCPY_WtoT(target,src,len) xxxxxxxxxxxxxxx //not possible
#define STRCPY_AtoT STRCPY_AtoA
#define STRCPY_TtoA STRCPY_AtoA
#define STRCPY_TtoT STRCPY_AtoA
#endif
//
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
//namespace helper
////////////////////////////////////////////////////////
#if defined(_LUCENE_DONTIMPLEMENT_NS_MACROS)
#elif !defined(DISABLE_NAMESPACE)
//
// W A R N I N G
// -------------
//
// adjustments here, need to be done in
// QTDIR/src/tools/assistant/lib/fulltextsearch/qclucene_global.h as well
//
# ifdef QT_NAMESPACE
# define CL_NS_DEF(sub) namespace QT_NAMESPACE { namespace lucene{ namespace sub{
# define CL_NS_DEF2(sub,sub2) namespace QT_NAMESPACE { namespace lucene{ namespace sub{ namespace sub2 {
# define CL_NS_END }}}
# define CL_NS_END2 }}}}
# define CL_NS_USE(sub) using namespace QT_NAMESPACE::lucene::sub;
# define CL_NS_USE2(sub,sub2) using namespace QT_NAMESPACE::lucene::sub::sub2;
# define CL_NS(sub) QT_NAMESPACE::lucene::sub
# define CL_NS2(sub,sub2) QT_NAMESPACE::lucene::sub::sub2
# else
# define CL_NS_DEF(sub) namespace lucene{ namespace sub{
# define CL_NS_DEF2(sub,sub2) namespace lucene{ namespace sub{ namespace sub2 {
# define CL_NS_END }}
# define CL_NS_END2 }}}
# define CL_NS_USE(sub) using namespace lucene::sub;
# define CL_NS_USE2(sub,sub2) using namespace lucene::sub::sub2;
# define CL_NS(sub) lucene::sub
# define CL_NS2(sub,sub2) lucene::sub::sub2
# endif
#else
# define CL_NS_DEF(sub)
# define CL_NS_DEF2(sub, sub2)
# define CL_NS_END
# define CL_NS_END2
# define CL_NS_USE(sub)
# define CL_NS_USE2(sub,sub2)
# define CL_NS(sub)
# define CL_NS2(sub,sub2)
#endif
#if defined(LUCENE_NO_STDC_NAMESPACE)
//todo: haven't actually tested this on a non-stdc compliant compiler
#define CL_NS_STD(func) ::func
#else
#define CL_NS_STD(func) std::func
#endif
//
////////////////////////////////////////////////////////
//
void CLDebugBreak(); //define a debugbreak function
////////////////////////////////////////////////////////////////
// These are defines and functions used throughout clucene
////////////////////////////////////////////////////////////////
#undef _T //remove any previously defined _T - required for ppc os
#if defined(_UCS2)
#define _T(x) L ## x
#else
#define _T(x) x
#endif
//third inclusion of compiler.h
//this gives CompilerXXX.h a chance to fix any of the
//default settings
#include "CLucene/config/compiler.h"
#if defined _MSC_VER && (_MSC_VER < 1300)
# define LUCENE_NO_STDC_NAMESPACE
#endif
//use std namespace
#ifndef LUCENE_NO_STDC_NAMESPACE
using namespace std;
#endif
////////////////////////////////////////////////////////
//misc shortcut defines
////////////////////////////////////////////////////////
//include the headers that we need practically everywhere
#include "CLucene/debug/error.h" //all delete/creation/mem debugging code
#include "CLucene/debug/condition.h" //conditional debugging (like assert)
#include "CLucene/debug/mem.h" //all delete/creation/mem debugging code
#include "LuceneThreads.h" //lucene threading support
#include "CLucene/util/Misc.h"
#include "CLucene/util/Equators.h"
#include "CLucene/util/VoidList.h"
#include "CLucene/util/VoidMap.h"
CL_NS_DEF(util)
typedef CL_NS(util)::CLVector<TCHAR*> StringArray;
typedef CL_NS(util)::CLVector<TCHAR*, CL_NS(util)::Deletor::tcArray > StringArrayWithDeletor;
typedef CL_NS(util)::CLVector<const TCHAR*> StringArrayConst;
typedef CL_NS(util)::CLVector<const TCHAR*, CL_NS(util)::Deletor::tcArray > StringArrayConstWithDeletor;
typedef CL_NS(util)::CLVector<char*> AStringArray;
typedef CL_NS(util)::CLVector<char*, CL_NS(util)::Deletor::acArray > AStringArrayWithDeletor;
typedef CL_NS(util)::CLVector<const char*> AStringArrayConst;
typedef CL_NS(util)::CLVector<const char*, CL_NS(util)::Deletor::acArray > AStringArrayConstWithDeletor;
CL_NS_END
//
////////////////////////////////////////////////////////
#endif // STDHEADER_H