/*
 *  tchar.h	Generic International Text Function Macros
 *
 *  Copyright by WATCOM International Corp. 1988-1996.  All rights reserved.
 */
#ifndef _TCHAR_H_INCLUDED
#define _TCHAR_H_INCLUDED
#if !defined(_ENABLE_AUTODEPEND)
  #pragma read_only_file;
#endif
#ifdef __cplusplus
extern "C" {
#endif

#ifndef NULL
 #if defined(__SMALL__) || defined(__MEDIUM__) || defined(__386__) || defined(__AXP__) || defined(__PPC__)
  #define NULL   0
 #else
  #define NULL   0L
 #endif
#endif

#ifndef _COMDEF_H_INCLUDED
 #include <_comdef.h>
#endif
#ifndef _STRING_H_INCLUDED
 #include <string.h>
#endif
#ifndef _TIME_H_INCLUDED
 #include <time.h>
#endif

#if defined(_UNICODE) || defined(__UNICODE__)
// **************************** UNICODE **************************************
#ifndef _WCHAR_T_DEFINED
#define _WCHAR_T_DEFINED
#define _WCHAR_T_DEFINED_
#ifdef __cplusplus
typedef long char wchar_t;
#else
typedef unsigned short wchar_t;
#endif
#endif

#ifndef _WCTYPE_T_DEFINED
#define _WCTYPE_T_DEFINED
#define _WCTYPE_T_DEFINED_
typedef wchar_t wint_t;
typedef wchar_t wctype_t;
#endif

#ifndef _WCHAR_H_INCLUDED
 #include <wchar.h>
#endif

#ifndef __TCHAR_DEFINED
typedef wchar_t _TCHAR;
typedef wchar_t _TSCHAR;
typedef wchar_t _TUCHAR;
typedef wchar_t _TXCHAR;
typedef wchar_t _TINT;
#define __TCHAR_DEFINED
#endif

#ifndef _TCHAR_DEFINED
#if !defined(NO_EXT_KEYS) /* extensions enabled */
typedef wchar_t TCHAR;
#endif
#define _TCHAR_DEFINED
#endif

#define _TEOF		WEOF

#define __T(x)		L ## x

/* Program */

#define _tmain		wmain
#define _tWinMain	wWinMain
#define _tenviron	_wenviron
#define __targc		__wargc
#define __targv		__wargv

/* Formatted i/o */

#define _tprintf	wprintf
#define _ftprintf	fwprintf
#define _vtprintf	vwprintf
#define _vftprintf	vfwprintf
#define _tscanf		wscanf
#define _ftscanf	fwscanf
#define _stscanf	swscanf

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline int _vstprintf( wchar_t *__p1, const wchar_t *__p2, __va_list __p3 ) {
    return( vswprintf( __p1, 32767, __p2, __p3 ) );
}
#else
#define _vstprintf(__p1,__p2,__p3)  vswprintf((__p1),32767,(__p2),(__p3))
#endif
_WCRTLINK extern int _stprintf(wchar_t *, const wchar_t *, ...);


/* Unformatted i/o */

#define _fgettc		fgetwc
#define _fgettchar	_fgetwchar
#define _fgetts		fgetws
#define _fputtc		fputwc
#define _fputtchar	_fputwchar
#define _fputts		fputws
#define _gettc		getwc
#define _gettchar	getwchar
#define _getts		_getws
#define _puttc		putwc
#define _puttchar	putwchar
#define _putts		_putws
#define _ungettc	ungetwc


/* String conversion functions */

#define _tcstod		wcstod
#define _tcstol		wcstol
#define _tcstoul	wcstoul

#define _itot		_itow
#define _ltot		_ltow
#define _ultot		_ultow
#define _ttoi		_wtoi
#define _ttol		_wtol


/* String functions */

#define _tcscat		wcscat
#define _tcschr		wcschr
#define _tcscpy		wcscpy
#define _tcscspn	wcscspn
#define _tcslen		wcslen
#define _tcsncat	wcsncat
#define _tcsncpy	wcsncpy
#define _tcspbrk	wcspbrk
#define _tcsrchr	wcsrchr
#define _tcsspn		wcsspn
#define _tcsstr		wcsstr
#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline wchar_t *_tcstok( wchar_t *__p1, const wchar_t *__p2 ) {
    return( wcstok( __p1, __p2, NULL ) );
}
#else
#define _tcstok(__p1,__p2)	wcstok((__p1),(__p2),NULL)
#endif

#define _tcsdup		_wcsdup
#define _tcsnset	_wcsnset
#define _tcsrev		_wcsrev
#define _tcsset		_wcsset

#define _tcscmp		wcscmp
#define _tcsicmp	_wcsicmp
#define _tcsnccmp	wcsncmp
#define _tcsncmp	wcsncmp
#define _tcsncicmp	_wcsnicmp
#define _tcsnicmp	_wcsnicmp

#define _tcscoll	wcscoll
#define _tcsicoll	_wcsicoll
#define _tcsnccoll	_wcsncoll
#define _tcsncoll	_wcsncoll
#define _tcsncicoll	_wcsnicoll
#define _tcsnicoll	_wcsnicoll


/* Execute functions */

#define _texecl		_wexecl
#define _texecle	_wexecle
#define _texeclp	_wexeclp
#define _texeclpe	_wexeclpe
#define _texecv		_wexecv
#define _texecve	_wexecve
#define _texecvp	_wexecvp
#define _texecvpe	_wexecvpe

#define _tspawnl	_wspawnl
#define _tspawnle	_wspawnle
#define _tspawnlp	_wspawnlp
#define _tspawnlpe	_wspawnlpe
#define _tspawnv	_wspawnv
#define _tspawnve	_wspawnve
#define _tspawnvp	_wspawnvp
#define _tspawnvpe	_wspawnvpe

#define _tsystem	_wsystem


/* Time functions */

#define _tasctime	_wasctime
#define _tctime		_wctime
#define _tstrdate	_wstrdate
#define _tstrtime	_wstrtime
#define _tutime		_wutime
#define _tcsftime	wcsftime


/* Directory functions */

#define _tchdir		_wchdir
#define _tclosedir	_wclosedir
#define _tgetcwd	_wgetcwd
#define _tgetdcwd	_wgetdcwd
#define _tmkdir		_wmkdir
#define _topendir	_wopendir
#define _treaddir	_wreaddir
#define _trewinddir	_wrewinddir
#define _trmdir		_wrmdir


/* Directory struct */
#define _tdirent	_wdirent


/* Environment/Path functions */

#define _tfullpath	_wfullpath
#define _tgetenv	_wgetenv
#define _tmakepath	_wmakepath
#define _tputenv	_wputenv
#define _tsearchenv	_wsearchenv
#define _tsplitpath	_wsplitpath


/* Stdio functions */

#define _tfdopen	_wfdopen
#define _tfsopen	_wfsopen
#define _tfopen		_wfopen
#define _tfreopen	_wfreopen
#define _tperror	_wperror
#define _ttmpnam	_wtmpnam


/* Io functions */

#define _taccess	_waccess
#define _tchmod		_wchmod
#define _tcreat		_wcreat
#define _tfindfirst	_wfindfirst
#define _tfindfirsti64	_wfindfirsti64
#define _tfindnext	_wfindnext
#define _tfindnexti64	_wfindnexti64
#define _topen		_wopen
#define _tremove	_wremove
#define _trename	_wrename
#define _tsopen		_wsopen
#define _tunlink	_wunlink

#define _tfinddata_t	_wfinddata_t
#define _tfinddatai64_t	_wfinddatai64_t


/* Stat functions */

#define _tstat		_wstat
#define _tstati64	_wstati64
#define _tfstat		_wfstat
#define _tfstati64	_wfstati64


/* Setlocale functions */

#define _tsetlocale	_wsetlocale


/* Redundant "logical-character" mappings */

#define _tcsclen	wcslen
#define _tcsnccat	wcsncat
#define _tcsnccpy	wcsncpy
#define _tcsncset	_wcsnset

#define	_tcsdec		_wcsdec
#define	_tcsinc		_wcsinc
#define	_tcsnbcnt	_wcsncnt
#define	_tcsnccnt	_wcsncnt
#define	_tcsnextc	_wcsnextc
#define	_tcsninc	_wcsninc
#define	_tcsspnp	_wcsspnp

#define _tcslwr		_wcslwr
#define _tcsupr		_wcsupr
#define _tcsxfrm	wcsxfrm

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline size_t _tclen( const wchar_t * ) {
    return( 1 );
}
inline void _tccpy( wchar_t *__p1, const wchar_t *__p2 ) {
    *__p1 = (wchar_t)*__p2;
}
inline int _tccmp( const wchar_t *__p1, const wchar_t *__p2 ) {
    return( (int) ((*__p1)-(*__p2)) );
}
#else
#define _tclen(__p)	(1)
#define _tccpy(__p1,__p2) ((*(__p1) = *(__p2)))
#define _tccmp(__p1,__p2) ((*(__p1))-(*(__p2)))
#endif


/* ctype functions */

#define _istalnum	iswalnum
#define _istalpha	iswalpha
#define _istascii	iswascii
#define _istcntrl	iswcntrl
#define _istdigit	iswdigit
#define _istgraph	iswgraph
#define _istlower	iswlower
#define _istprint	iswprint
#define _istpunct	iswpunct
#define _istspace	iswspace
#define _istupper	iswupper
#define _istxdigit	iswxdigit

#define _totupper	towupper
#define _totlower	towlower

#define _istlegal(_c)   (1)
#define _istlead(_c)    (0)
#define _istleadbyte(_c)    (0)

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline wchar_t *_wcsdec( const wchar_t *, const wchar_t *__p ) {
    return( (wchar_t *)(__p-1) );
}
inline wchar_t *_wcsinc( const wchar_t *__p ) {
    return( (wchar_t *)(__p+1) );
}
inline unsigned int _wcsnextc( const wchar_t *__p ) {
    return( (unsigned int)*__p );
}
inline wchar_t *_wcsninc( const wchar_t *__p, size_t __l ) {
    return( (wchar_t *)(__p+__l) );
}
inline size_t _wcsncnt( const wchar_t *__p, size_t __l ) {
    size_t __i;
    __i = wcslen(__p);
    return( (__i>__l) ? __l : __i );
}
inline wchar_t *_wcsspnp( const wchar_t *__p1, const wchar_t *__p2 ) {
    return( (*(__p1 += wcsspn(__p1,__p2))!='\0') ? (wchar_t*)__p1 : NULL );
}
#else
#define _wcsdec(__p1, __p2)	((__p2)-1)
#define _wcsinc(__p)		((__p)+1)
#define _wcsnextc(__p)		((unsigned int) *(__p))
#define _wcsninc(__p, __l)	(((__p)+(__l)))
#define _wcsncnt(__p, __l)	((wcslen(__p)>__l) ? __l : wcslen(__p))
#define _wcsspnp(__p1, __p2)	((*((__p1)+wcsspn(__p1,__p2))) ? \
				  ((__p1)+wcsspn(__p1,__p2)) : NULL)
#endif

_WMRTLINK extern double wcstod( const wchar_t *__nptr, wchar_t **__endptr );
_WCRTLINK extern long int wcstol( const wchar_t *, wchar_t **, int );
_WCRTLINK extern unsigned long int wcstoul( const wchar_t *, wchar_t **, int );

_WCRTLINK extern int _wcsicmp( const wchar_t *, const wchar_t * );
_WCRTLINK extern int _wcsnicmp( const wchar_t *, const wchar_t *, size_t );
_WCRTLINK extern wchar_t *_wcsdup( const wchar_t * );
_WCRTLINK extern wchar_t *_wcslwr( wchar_t * );
_WCRTLINK extern wchar_t *_wcsupr( wchar_t * );
_WCRTLINK extern wchar_t *_wcsset( wchar_t *, wchar_t );
_WCRTLINK extern wchar_t *_wcsnset( wchar_t *, int, size_t );
_WCRTLINK extern wchar_t *_wcsrev( wchar_t * );

#else
// **************************** SBCS and MBCS ********************************


#define _TEOF		EOF

#define __T(x)		x

/* Program */

#define _tmain		main
#define _tWinMain	WinMain
#define _tenviron	environ
#define __targc		__argc
#define __targv		__argv


/* Formatted i/o */

#define _tprintf	printf
#define _ftprintf	fprintf
#define _stprintf	sprintf
#define _vtprintf	vprintf
#define _vftprintf	vfprintf
#define _vstprintf	vsprintf
#define _tscanf		scanf
#define _ftscanf	fscanf
#define _stscanf	sscanf


/* Unformatted i/o */

#define _fgettc		fgetc
#define _fgettchar	_fgetchar
#define _fgetts		fgets
#define _fputtc		fputc
#define _fputtchar	_fputchar
#define _fputts		fputs
#define _gettc		getc
#define _gettchar	getchar
#define _getts		gets
#define _puttc		putc
#define _puttchar	putchar
#define _putts		puts
#define _ungettc	ungetc


/* String conversion functions */

#define _tcstod		strtod
#define _tcstol		strtol
#define _tcstoul	strtoul

#define _itot		itoa
#define _ltot		ltoa
#define _ultot		ultoa
#define _ttoi		atoi
#define _ttol		atol


/* String functions */

#define _tcscat		strcat
#define _tcscpy		strcpy
#define _tcslen		strlen
#define _tcsxfrm	strxfrm
#define _tcsdup		strdup


/* Execute functions */

#define _texecl		execl
#define _texecle	execle
#define _texeclp	execlp
#define _texeclpe	execlpe
#define _texecv		execv
#define _texecve	execve
#define _texecvp	execvp
#define _texecvpe	execvpe

#define _tspawnl	spawnl
#define _tspawnle	spawnle
#define _tspawnlp	spawnlp
#define _tspawnlpe	spawnlpe
#define _tspawnv	spawnv
#define _tspawnve	spawnve
#define _tspawnvp	spawnvp
#define _tspawnvpe	spawnvpe

#define _tsystem	system


/* Time functions */

#define _tasctime	asctime
#define _tctime		ctime
#define _tstrdate	_strdate
#define _tstrtime	strtime
#define _tutime		utime
#define _tcsftime	strftime


/* Directory functions */

#define _tchdir		chdir
#define _tclosedir	closedir
#define _tgetcwd	getcwd
#define _tgetdcwd	getdcwd
#define _tmkdir		mkdir
#define _topendir	opendir
#define _treaddir	readdir
#define _trewinddir	rewinddir
#define _trmdir		rmdir


/* Directory struct */
#define _tdirent	dirent


/* Environment/Path functions */

#define _tfullpath	_fullpath
#define _tgetenv	getenv
#define _tmakepath	_makepath
#define _tputenv	putenv
#define _tsearchenv	searchenv
#define _tsplitpath	_splitpath


/* Stdio functions */

#define _tfdopen	fdopen
#define _tfsopen	_fsopen
#define _tfopen		fopen
#define _tfreopen	freopen
#define _tperror	perror
#define _ttmpnam	tmpnam


/* Io functions */

#define _taccess	access
#define _tchmod		chmod
#define _tcreat		creat
#define _tfindfirst	_findfirst
#define _tfindfirsti64	_findfirsti64
#define _tfindnext	_findnext
#define _tfindnexti64	_findnexti64
#define _topen		open
#define _tremove	remove
#define _trename	rename
#define _tsopen		sopen
#define _tunlink	unlink

#define _tfinddata_t	_finddata_t
#define _tfinddatai64_t	_finddatai64_t


/* ctype functions */

#define _istascii	isascii
#define _istcntrl	iscntrl
#define _istxdigit	isxdigit


/* Stat functions */

#define _tstat		stat
#define _tstati64	_stati64
#define _tfstat		fstat
#define _tfstati64	_fstati64


/* Setlocale functions */

#define _tsetlocale	setlocale


#ifdef _MBCS
// **************************** MBCS *****************************************

#ifndef _MBSTRING_H_INCLUDED
 #include <mbstring.h>
#endif

#ifndef __TCHAR_DEFINED
typedef char		_TCHAR;
typedef signed char	_TSCHAR;
typedef unsigned char	_TUCHAR;
typedef unsigned char	_TXCHAR;
typedef unsigned int	_TINT;
#define __TCHAR_DEFINED
#endif

#ifndef _TCHAR_DEFINED
#if !defined(NO_EXT_KEYS) /* extensions enabled */
typedef char		TCHAR;
#endif
#define _TCHAR_DEFINED
#endif

#ifdef _MB_MAP_DIRECT

/* use mb functions directly - types must match */

/* String functions */

#define _tcschr     _mbschr
#define _tcscspn    _mbscspn
#define _tcsncat    _mbsnbcat
#define _tcsncpy    _mbsnbcpy
#define _tcspbrk    _mbspbrk
#define _tcsrchr    _mbsrchr
#define _tcsspn     _mbsspn
#define _tcsstr     _mbsstr
#define _tcstok     _mbstok

#define _tcsnset    _mbsnbset
#define _tcsrev     _mbsrev
#define _tcsset     _mbsset

#define _tcscmp	    _mbscmp
#define _tcsicmp    _mbsicmp
#define _tcsnccmp   _mbsncmp
#define _tcsncmp    _mbsnbcmp
#define _tcsncicmp  _mbsnicmp
#define _tcsnicmp   _mbsnbicmp

#define _tcscoll    _mbscoll
#define _tcsicoll   _mbsicoll
#define _tcsnccoll  _mbsncoll
#define _tcsncoll   _mbsnbcoll
#define _tcsncicoll _mbsnicoll
#define _tcsnicoll  _mbsnbicoll


/* "logical-character" mappings */

#define _tcsclen    _mbslen
#define _tcsnccat   _mbsncat
#define _tcsnccpy   _mbsncpy
#define _tcsncset   _mbsnset


/* MBCS-specific mappings */

#define	_tcsdec     _mbsdec
#define	_tcsinc     _mbsinc
#define	_tcsnbcnt   _mbsnbcnt
#define	_tcsnccnt   _mbsnccnt
#define	_tcsnextc   _mbsnextc
#define	_tcsninc    _mbsninc
#define	_tcsspnp    _mbsspnp

#define _tcslwr     _mbslwr
#define _tcsupr     _mbsupr

#define _tclen      _mbclen
#define _tccpy      _mbccpy

#define _tccmp	    _mbccmp

#else

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)

/* the default: use type-safe inline function thunks */

/* String functions */

inline char *_tcschr( const char *__p, unsigned int __c ) {
    return( (char *)_mbschr( (const unsigned char *)__p, __c ) );
}
inline size_t _tcscspn( const char *__p1, const char *__p2 ) {
    return( _mbscspn( (const unsigned char *)__p1, 
    		      (const unsigned char *)__p2 ) );
}
inline char *_tcsncat( char *__p1, const char *__p2, size_t __l ) {
    return( (char *)_mbsnbcat( (unsigned char *)__p1,
    			       (const unsigned char *)__p2, __l ) );
}
inline char *_tcsncpy( char *__p1, const char *__p2, size_t __l ) {
    return( (char *)_mbsnbcpy( (unsigned char *)__p1,
    			       (const unsigned char *)__p2, __l ) );
}
inline char *_tcspbrk( const char *__p1, const char *__p2 ) {
    return( (char *)_mbspbrk( (const unsigned char *)__p1,
			      (const unsigned char *)__p2 ) );
}
inline char *_tcsrchr( const char *__p, unsigned int __c ) {
    return( (char *)_mbsrchr( (const unsigned char *)__p, __c ) );
}
inline size_t _tcsspn( const char *__p1, const char *__p2 ) {
    return( _mbsspn( (const unsigned char *)__p1,
    		     (const unsigned char *)__p2 ) );
}
inline char *_tcsstr( const char *__p1, const char *__p2 ) {
    return( (char *)_mbsstr( (const unsigned char *)__p1,
			     (const unsigned char *)__p2 ) );
}
inline char *_tcstok( char *__p1, const char *__p2 ) {
    return( (char *)_mbstok( (unsigned char *)__p1,
    			     (const unsigned char *)__p2 ) );
}

inline char *_tcsnset( char *__p, unsigned int __c, size_t __l ) {
    return( (char *)_mbsnbset( (unsigned char *)__p, __c, __l ) );
}
inline char *_tcsrev( char *__p ) {
    return( (char *)_mbsrev( (unsigned char *)__p ) );
}
inline char *_tcsset(char *__p, unsigned int __c ) {
    return( (char *)_mbsset( (unsigned char *)__p, __c ) );
}

inline int _tcscmp( const char *__p1, const char *__p2 ) {
    return( _mbscmp( (const unsigned char *)__p1, 
    		     (const unsigned char *)__p2 ) );
}
inline int _tcsicmp( const char *__p1, const char *__p2 ) {
    return( _mbsicmp( (const unsigned char *)__p1, 
    		      (const unsigned char *)__p2 ) );
}
inline int _tcsnccmp( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsncmp( (const unsigned char *)__p1, 
    		      (const unsigned char *)__p2, __l ) );
}
inline int _tcsncmp( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnbcmp( (const unsigned char *)__p1, 
    		       (const unsigned char *)__p2, __l ) );
}
inline int _tcsncicmp( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnicmp( (const unsigned char *)__p1, 
    		       (const unsigned char *)__p2, __l ) );
}
inline int _tcsnicmp( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnbicmp( (const unsigned char *)__p1, 
		        (const unsigned char *)__p2, __l ) );
}

inline int _tcscoll( const char *__p1, const char *__p2 ) {
    return( _mbscoll( (const unsigned char *)__p1, 
		      (const unsigned char *)__p2 ) );
}
inline int _tcsicoll( const char *__p1, const char *__p2 ) {
    return( _mbsicoll( (const unsigned char *)__p1, 
		       (const unsigned char *)__p2 ) );
}
inline int _tcsnccoll( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsncoll( (const unsigned char *)__p1, 
		       (const unsigned char *)__p2, __l ) );
}
inline int _tcsncoll( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnbcoll( (const unsigned char *)__p1, 
			(const unsigned char *)__p2, __l ) );
}
inline int _tcsncicoll( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnicoll( (const unsigned char *)__p1, 
		        (const unsigned char *)__p2, __l ) );
}
inline int _tcsnicoll( const char *__p1, const char *__p2, size_t __l ) {
    return( _mbsnbicoll( (const unsigned char *)__p1, 
			 (const unsigned char *)__p2, __l ) );
}


/* "logical-character" mappings */

inline size_t _tcsclen( const char *__p ) {
    return( _mbslen( (const unsigned char *)__p ) );
}
inline char *_tcsnccat( char *__p1, const char *__p2, size_t __l ) {
    return( (char *)_mbsncat( (unsigned char *)__p1, 
			      (const unsigned char *)__p2, __l ) );
}
inline char *_tcsnccpy( char *__p1, const char *__p2, size_t __l ) {
    return( (char *)_mbsncpy( (unsigned char *)__p1, 
			      (const unsigned char *)__p2, __l ) );
}
inline char *_tcsncset( char *__p, unsigned int __c, size_t __l ) {
    return( (char *)_mbsnset( (unsigned char *)__p, __c, __l ) );
}


/* MBCS-specific mappings */

inline char *_tcsdec( const char *__p1, const char *__p2 ) {
    return( (char *)_mbsdec( (const unsigned char *)__p1, 
			     (const unsigned char *)__p2 ) );
}
inline char *_tcsinc( const char *__p ) {
    return( (char *)_mbsinc( (const unsigned char *)__p ) );
}
inline size_t _tcsnbcnt( const char *__p, size_t __l ) {
    return( _mbsnbcnt( (const unsigned char *)__p, __l ) );
}
inline size_t _tcsnccnt( const char *__p, size_t __l ) {
    return( _mbsnccnt( (const unsigned char *)__p, __l ) );
}
inline char *_tcsninc( const char *__p, size_t __l ) {
    return( (char *)_mbsninc( (const unsigned char *)__p, __l ) );
}
inline char *_tcsspnp( const char *__p1, const char *__p2 ) {
    return( (char *)_mbsspnp( (const unsigned char *)__p1, 
			      (const unsigned char *)__p2 ) );
}
inline char *_tcslwr( char *__p ) {
    return( (char *)_mbslwr( (unsigned char *)__p ) );
}
inline char *_tcsupr( char *__p ) {
    return( (char *)_mbsupr( (unsigned char *)__p ) );
}

inline size_t _tclen( const char *__p ) {
    return( _mbclen( (const unsigned char *)__p ) );
}

inline void _tccpy( char *__p1, const char *__p2 ) {
    _mbccpy( (unsigned char *)__p1, (const unsigned char *)__p2 );
}

inline int _tccmp( const char *__p1, const char *__p2 ) {
    return _mbccmp( (const unsigned char *)__p1, (const unsigned char *)__p2 );
}

inline unsigned int _tcsnextc( const char *__p ) {
    return( _mbsnextc( (const unsigned char *)__p ) );
}

#else

/* use type-safe linked-in function thunks */

/* String functions */

_WCRTLINK extern char *_tcschr(const char *, unsigned int);
_WCRTLINK extern size_t _tcscspn(const char *, const char *);
_WCRTLINK extern char *_tcsncat(char *, const char *, size_t);
_WCRTLINK extern char *_tcsncpy(char *, const char *, size_t);
_WCRTLINK extern char *_tcspbrk(const char *, const char *);
_WCRTLINK extern char *_tcsrchr(const char *, int);
_WCRTLINK extern size_t _tcsspn(const char *, const char *);
_WCRTLINK extern char *_tcsstr(const char *, const char *);
_WCRTLINK extern char *_tcstok(char *, const char *);

_WCRTLINK extern char *_tcsnset(char *, unsigned int, size_t);
_WCRTLINK extern char *_tcsrev(char *);
_WCRTLINK extern char *_tcsset(char *, unsigned int);

_WCRTLINK extern int _tcscmp(const char *, const char *);
_WCRTLINK extern int _tcsicmp(const char *, const char *);
_WCRTLINK extern int _tcsnccmp(const char *, const char *, size_t);
_WCRTLINK extern int _tcsncmp(const char *, const char *, size_t);
_WCRTLINK extern int _tcsncicmp(const char *, const char *, size_t);
_WCRTLINK extern int _tcsnicmp(const char *, const char *, size_t);

_WCRTLINK extern int _tcscoll(const char *, const char *);
_WCRTLINK extern int _tcsicoll(const char *, const char *);
_WCRTLINK extern int _tcsnccoll(const char *, const char *, size_t);
_WCRTLINK extern int _tcsncoll(const char *, const char *, size_t);
_WCRTLINK extern int _tcsncicoll(const char *, const char *, size_t);
_WCRTLINK extern int _tcsnicoll(const char *, const char *, size_t);


/* "logical-character" mappings */

_WCRTLINK extern size_t _tcsclen(const char *);
_WCRTLINK extern char *_tcsnccat(char *, const char *, size_t);
_WCRTLINK extern char *_tcsnccpy(char *, const char *, size_t);
_WCRTLINK extern char *_tcsncset(char *, unsigned int, size_t);


/* MBCS-specific mappings */

_WCRTLINK extern char *_tcsdec(const char *, const char *);
_WCRTLINK extern char *_tcsinc(const char *);
_WCRTLINK extern size_t _tcsnbcnt(const char *, size_t);
_WCRTLINK extern size_t _tcsnccnt(const char *, size_t);
_WCRTLINK extern unsigned int _tcsnextc (const char *);
_WCRTLINK extern char *_tcsninc(const char *, size_t);
_WCRTLINK extern char *_tcsspnp(const char *, const char *);

_WCRTLINK extern char *_tcslwr(char *);
_WCRTLINK extern char *_tcsupr(char *);

_WCRTLINK extern size_t _tclen(const char *);
_WCRTLINK extern void _tccpy(char *, const char *);
_WCRTLINK extern int _tccmp(const char *, const char *);

#endif

#endif


/* ctype functions */

#define _istalnum   _ismbcalnum
#define _istalpha   _ismbcalpha
#define _istdigit   _ismbcdigit
#define _istgraph   _ismbcgraph
#define _istlegal   _ismbclegal
#define _istlower   _ismbclower
#define _istprint   _ismbcprint
#define _istpunct   _ismbcpunct
#define _istspace   _ismbcspace
#define _istupper   _ismbcupper

#define _totupper   _mbctoupper
#define _totlower   _mbctolower

#define _istlead    _ismbblead
#define _istleadbyte    isleadbyte

#else
// **************************** SBCS *****************************************

#ifndef __TCHAR_DEFINED
typedef char		_TCHAR;
typedef signed char	_TSCHAR;
typedef unsigned char	_TUCHAR;
typedef char		_TXCHAR;
typedef int		_TINT;
#define __TCHAR_DEFINED
#endif

#ifndef _TCHAR_DEFINED
#if !defined(NO_EXT_KEYS) /* extensions enabled */
typedef char		TCHAR;
#endif
#define _TCHAR_DEFINED
#endif

/* String functions */

#define _tcschr		strchr
#define _tcscspn	strcspn
#define _tcsncat	strncat
#define _tcsncpy	strncpy
#define _tcspbrk	strpbrk
#define _tcsrchr	strrchr
#define _tcsspn		strspn
#define _tcsstr		strstr
#define _tcstok		strtok

#define _tcsnset	strnset
#define _tcsrev		strrev
#define _tcsset		strset

#define _tcscmp		strcmp
#define _tcsicmp	stricmp
#define _tcsnccmp	strncmp
#define _tcsncmp	strncmp
#define _tcsncicmp	strnicmp
#define _tcsnicmp	strnicmp

#define _tcscoll	strcoll
#define _tcsicoll	_stricoll
#define _tcsnccoll	_strncoll
#define _tcsncoll	_strncoll
#define _tcsncicoll	_strnicoll
#define _tcsnicoll	_strnicoll


/* "logical-character" mappings */

#define _tcsclen	strlen
#define _tcsnccat	strncat
#define _tcsnccpy	strncpy
#define _tcsncset	strnset

#define	_tcsdec		_strdec
#define	_tcsinc		_strinc
#define	_tcsnbcnt	_strncnt
#define	_tcsnccnt	_strncnt
#define	_tcsnextc	_strnextc
#define	_tcsninc	_strninc
#define	_tcsspnp	_strspnp

#define _tcslwr		strlwr
#define _tcsupr		strupr
#define _tcsxfrm	strxfrm

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline size_t _tclen( const char * ) {
    return( 1 );
}
inline void _tccpy( char *__p1, const char *__p2 ) {
    *__p1 = *__p2;
}
inline int _tccmp( const char *__p1, const char *__p2 ) {
    return( (int) (((unsigned char)*__p1)-((unsigned char)*__p2)) );
}
#else
#define _tclen(__p)	(1)
#define _tccpy(__p1,__p2) ((*(__p1) = *(__p2)))
#define _tccmp(__p1,__p2) (((unsigned char)*(__p1))-((unsigned char)*(__p2)))
#endif


/* ctype functions */

#define _istalnum	isalnum
#define _istalpha	isalpha
#define _istdigit	isdigit
#define _istgraph	isgraph
#define _istlower	islower
#define _istprint	isprint
#define _istpunct	ispunct
#define _istspace	isspace
#define _istupper	isupper

#define _totupper	toupper
#define _totlower	tolower

#define _istlegal(_c)   (1)
#define _istlead(_c)    (0)
#define _istleadbyte(_c)    (0)

#if defined(__cplusplus) && defined(__INLINE_FUNCTIONS__)
inline char *_strdec( const char *, const char *__p ) {
    return( (char *)(__p-1) );
}
inline char *_strinc( const char *__p ) {
    return( (char *)(__p+1) );
}
inline unsigned int _strnextc( const char *__p ) {
    return( (unsigned int)*__p );
}
inline char *_strninc( const char *__p, size_t __l ) {
    return( (char *)(__p+__l) );
}
inline size_t _strncnt( const char *__p, size_t __l ) {
    size_t __i;
    __i = strlen(__p);
    return( (__i>__l) ? __l : __i );
}
inline char *_strspnp( const char *__p1, const char *__p2 ) {
    return( (*(__p1 += strspn(__p1,__p2))!='\0') ? (char*)__p1 : NULL );
}
#else
#define _strdec(__p1, __p2)  ((__p2)-1)
#define _strinc(__p)	     ((__p)+1)
#define _strnextc(__p)	     ((unsigned int) *(__p))
#define _strninc(__p, __l)   (((__p)+(__l)))
#define _strncnt(__p, __l)   ((strlen(__p)>__l) ? __l : strlen(__p))
#define _strspnp(__p1, __p2) ((*((__p1)+strspn(__p1,__p2))) ? \
				((__p1)+strspn(__p1,__p2)) : NULL)
#endif


#endif
#endif

#define _T(x)		__T(x)
#define _TEXT(x)	__T(x)

#ifdef __cplusplus
};
#endif
#endif
