/*------------------------------------------------------------------------------
* 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.
------------------------------------------------------------------------------*/
#ifndef _CL_HAVE_TCHAR_H
#if defined(_UCS2)
    #define TCHAR wchar_t
    
    //note: descriptions with * in front have replacement functions
    
    //formatting functions
    #define _sntprintf swprintf //* make a formatted a string
    #define _tprintf wprintf //* print a formatted string
    
    //this one has no replacement functions yet, but it is only used in the tests
    #define _vsntprintf vsnwprintf //* print a formatted string using variable arguments
    
    //we are using the internal functions of the compiler here
    //if LUCENE_USE_INTERNAL_CHAR_FUNCTIONS is defined, thesse
    //will be replaced by internal functions
    #define _istalnum iswalnum //* alpha/numeric char check
    #define _istalpha iswalpha //* alpha char check
    #define _istspace iswspace //* space char check
    #define _istdigit iswdigit //* digit char check
    #define _totlower towlower //* convert char to lower case
    #define _totupper towupper //* convert char to lower case
    #define _tcslwr wcslwr //* convert string to lower case
    
    //these are the string handling functions
    //we may need to create wide-character/multi-byte replacements for these
    #define _tcscpy wcscpy //copy a string to another string
    #define _tcsncpy wcsncpy //copy a specified amount of one string to another string.
    #define _tcscat wcscat //copy a string onto the end of the other string
    #define _tcschr wcschr //find location of one character
    #define _tcsstr wcsstr //find location of a string
    #define _tcslen wcslen //get length of a string
    #define _tcscmp wcscmp //case sensitive compare two strings
    #define _tcsncmp wcsncmp //case sensitive compare two strings
    #define _tcscspn wcscspn //location of any of a set of character in a string
    
    #ifdef _CL_HAVE_WCSICMP
        #define _tcsicmp wcsicmp //* case insensitive compare two string
    #else
        #define _tcsicmp wcscasecmp //* case insensitive compare two string
    #endif
    
    //conversion functions
    #define _tcstod wcstod //convert a string to a double
    #ifdef _PA_RISC
        #define _tcstoi64 __wcstoll //* convers a string to an 64bit bit integer
    #else
        #define _tcstoi64 wcstoll //* convers a string to an 64bit bit integer
    #endif
    #define _i64tot lltow //* converts a 64 bit integer to a string (with base)
    
#else //if defined(_ASCII)
    #define TCHAR char
    
    //formatting functions
    #define _sntprintf snprintf    
    #define _tprintf printf
    #define _vsntprintf vsnprintf 
    
    //we are using the internal functions of the compiler here
    //if LUCENE_USE_INTERNAL_CHAR_FUNCTIONS is defined, thesse
    //will be replaced by internal functions
    #define _istalnum isalnum
    #define _istalpha isalpha
    #define _istspace isspace
    #define _istdigit isdigit
    #define _totlower tolower
    #define _totupper toupper
    #define _tcslwr strlwr
    
    //these are the string handling functions
    #define _tcscpy strcpy
    #define _tcsncpy strncpy
    #define _tcscat strcat
    #define _tcschr strchr
    #define _tcsstr strstr
    #define _tcslen strlen
    #define _tcscmp strcmp
    #define _tcsncmp strncmp
    #define _tcsicmp strcasecmp
    #define _tcscspn strcspn
    
    //converstion methods
    #define _tcstod strtod
    #define _tcstoi64 strtoll
    #define _i64tot lltoa
#endif
#else //HAVE_TCHAR_H
 #include <tchar.h>

#ifdef UNDER_CE
#include <QString>
#define _i64tot i64tot
inline TCHAR* i64tot(__int64 value, TCHAR* str, int radix)
{
    QT_USE_NAMESPACE
    _tcscpy(str, (TCHAR *) QString::number(value, radix).utf16());
    return str;
}

#define _tcstoi64 tcstoi64
inline __int64 tcstoi64(const TCHAR *nptr, TCHAR **endptr, int base)
{
    QT_USE_NAMESPACE
    bool ok;
    return QString::fromUtf16((ushort*) nptr).toInt(&ok, base);
}

#endif
 
 //some tchar headers miss these...
 #ifndef _tcstoi64
 	#if defined(_UCS2)
		#define _tcstoi64 wcstoll //* convers a string to an 64bit bit integer
	#else
		#define _tcstoi64 strtoll
	#endif
 #endif
 
#endif //HAVE_TCHAR_H
