/* 

 * tchar.h

 *

 * Unicode mapping layer for the standard C library. By including this

 * file and using the 't' names for string functions

 * (eg. _tprintf) you can make code which can be easily adapted to both

 * Unicode and non-unicode environments. In a unicode enabled compile define

 * _UNICODE before including tchar.h, otherwise the standard non-unicode

 * library functions will be used.

 *

 * Note that you still need to include string.h or stdlib.h etc. to define

 * the appropriate functions. Also note that there are several defines

 * included for non-ANSI functions which are commonly available (but using

 * the convention of prepending an underscore to non-ANSI library function

 * names).

 *

 * This file is part of the Mingw32 package.

 *

 * Contributors:

 *  Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>

 *

 *  THIS SOFTWARE IS NOT COPYRIGHTED

 *

 *  This source code is offered for use in the public domain. You may

 *  use, modify or distribute it freely.

 *

 *  This code is distributed in the hope that it will be useful but

 *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY

 *  DISCLAIMED. This includes but is not limited to warranties of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 *

 * $Revision$

 * $Author$

 * $Date$

 *

 */



#ifndef	_TCHAR_H_

#define _TCHAR_H_



/* All the headers include this file. */

/*#include <_mingw.h>*/



/*

 * NOTE: This tests _UNICODE, which is different from the UNICODE define

 *       used to differentiate Win32 API calls.

 */

#ifdef	_UNICODE





/*

 * Use TCHAR instead of char or wchar_t. It will be appropriately translated

 * if _UNICODE is correctly defined (or not).

 */

#ifndef _TCHAR_DEFINED

#ifndef RC_INVOKED

typedef	wchar_t	TCHAR;

typedef wchar_t _TCHAR;

#endif	/* Not RC_INVOKED */

#define _TCHAR_DEFINED

#endif





/*

 * __TEXT is a private macro whose specific use is to force the expansion of a

 * macro passed as an argument to the macros _T or _TEXT.  DO NOT use this

 * macro within your programs.  It's name and function could change without

 * notice.

 */

#define	__TEXT(q)	L##q



/*  for porting from other Windows compilers */

#if 0  // no  wide startup module

#define _tmain      wmain

#define _tWinMain   wWinMain

#define _tenviron   _wenviron

#define __targv     __wargv

#endif



/*

 * Unicode functions

 */

#define	_tprintf	wprintf

#define	_ftprintf	fwprintf

#define	_stprintf	swprintf

#define	_sntprintf	_snwprintf

#define	_vtprintf	vwprintf

#define	_vftprintf	vfwprintf

#define _vstprintf	vswprintf

#define	_vsntprintf	_vsnwprintf

#define	_tscanf		wscanf

#define	_ftscanf	fwscanf

#define	_stscanf	swscanf

#define	_fgettc		fgetwc

#define	_fgettchar	_fgetwchar

#define	_fgetts		fgetws

#define	_fputtc		fputwc

#define	_fputtchar	_fputwchar

#define	_fputts		fputws

#define	_gettc		getwc

#define	_getts		_getws

#define	_puttc		putwc

#define	_putts		_putws

#define	_ungettc	ungetwc

#define	_tcstod		wcstod

#define	_tcstol		wcstol

#define _tcstoul	wcstoul

#define	_itot		_itow

#define	_ltot		_ltow

#define	_ultot		_ultow

#define	_ttoi		_wtoi

#define	_ttol		_wtol

#define	_tcscat		wcscat

#define _tcschr		wcschr

#define _tcscmp		wcscmp

#define _tcscpy		wcscpy

#define _tcscspn	wcscspn

#define	_tcslen		wcslen

#define	_tcsncat	wcsncat

#define	_tcsncmp	wcsncmp

#define	_tcsncpy	wcsncpy

#define	_tcspbrk	wcspbrk

#define	_tcsrchr	wcsrchr

#define _tcsspn		wcsspn

#define	_tcsstr		wcsstr

#define _tcstok		wcstok

#define	_tcsdup		_wcsdup

#define	_tcsicmp	_wcsicmp

#define	_tcsnicmp	_wcsnicmp

#define	_tcsnset	_wcsnset

#define	_tcsrev		_wcsrev

#define _tcsset		_wcsset

#define	_tcslwr		_wcslwr

#define	_tcsupr		_wcsupr

#define	_tcsxfrm	wcsxfrm

#define	_tcscoll	wcscoll

#define	_tcsicoll	_wcsicoll

#define	_istalpha	iswalpha

#define	_istupper	iswupper

#define	_istlower	iswlower

#define	_istdigit	iswdigit

#define	_istxdigit	iswxdigit

#define	_istspace	iswspace

#define	_istpunct	iswpunct

#define	_istalnum	iswalnum

#define	_istprint	iswprint

#define	_istgraph	iswgraph

#define	_istcntrl	iswcntrl

#define	_istascii	iswascii

#define _totupper	towupper

#define	_totlower	towlower

#define _tcsftime	wcsftime

/* Macro functions */ 

#define _tcsdec     _wcsdec

#define _tcsinc     _wcsinc

#define _tcsnbcnt   _wcsncnt

#define _tcsnccnt   _wcsncnt

#define _tcsnextc   _wcsnextc

#define _tcsninc    _wcsninc

#define _tcsspnp    _wcsspnp

#define _wcsdec(_wcs1, _wcs2) ((_wcs1)>=(_wcs2) ? NULL : (_wcs2)-1)

#define _wcsinc(_wcs)  ((_wcs)+1)

#define _wcsnextc(_wcs) ((unsigned int) *(_wcs))

#define _wcsninc(_wcs, _inc) (((_wcs)+(_inc)))

#define _wcsncnt(_wcs, _cnt) ((wcslen(_wcs)>_cnt) ? _count : wcslen(_wcs))

#define _wcsspnp(_wcs1, _wcs2) ((*((_wcs1)+wcsspn(_wcs1,_wcs2))) ? ((_wcs1)+wcsspn(_wcs1,_wcs2)) : NULL)



#if 1  /* defined __MSVCRT__ */

/*

 *   These wide functions not in crtdll.dll.

 *   Define macros anyway so that _wfoo rather than _tfoo is undefined

 */

#define _ttoi64     _wtoi64

#define _i64tot     _i64tow

#define _ui64tot    _ui64tow

#define	_tasctime	_wasctime

#define	_tctime		_wctime

#define	_tstrdate	_wstrdate

#define	_tstrtime	_wstrtime

#define	_tutime		_wutime

#define _tcsnccoll  _wcsncoll

#define _tcsncoll   _wcsncoll

#define _tcsncicoll _wcsnicoll

#define _tcsnicoll  _wcsnicoll

#define _taccess    _waccess

#define _tchmod     _wchmod

#define _tcreat     _wcreat

#define _tfindfirst _wfindfirst

#define _tfindnext  _wfindnext

#define _tfdopen    _wfdopen

#define _tfopen     _wfopen

#define _tgetenv    _wgetenv

#define _tputenv    _wputenv

#define _tsearchenv _wsearchenv

#define _tmakepath  _wmakepath

#define _tsplitpath _wsplitpath

#define _tfullpath  _wfullpath

#define _tmktemp    _wmktemp

#define _topen      _wopen

#define _tremove    _wremove

#define _trename    _wrename

#define _tsopen     _wsopen

#define _tsetlocale _wsetlocale

#define _tunlink    _wunlink

#define _tfinddata_t    _wfinddata_t

#define _tfindfirsti64  _wfindfirsti64

#define _tfindnexti64   _wfindnexti64

#define _tfinddatai64_t _wfinddatai64_t

#endif  /* __MSVCRT__ */



/* dirent structures and functions */

#define _tdirent	_wdirent

#define _TDIR 		_WDIR

#define _topendir	_wopendir

#define _tclosedir	_wclosedir

#define _treaddir	_wreaddir

#define _trewinddir	_wrewinddir

#define _ttelldir	_wtelldir

#define _tseekdir	_wseekdir

#else	/* Not _UNICODE */



/*

 * TCHAR, the type you should use instead of char.

 */

#ifndef _TCHAR_DEFINED

#ifndef RC_INVOKED

typedef char	TCHAR;

typedef char	_TCHAR;

#endif

#define _TCHAR_DEFINED

#endif



/*

 * __TEXT is a private macro whose specific use is to force the expansion of a

 * macro passed as an argument to the macros _T or _TEXT.  DO NOT use this

 * macro within your programs.  It's name and function could change without

 * notice.

 */

#define	__TEXT(q)	q



/*  for porting from other Windows compilers */

#define _tmain      main

#define _tWinMain   WinMain

#define _tenviron  _environ

#define __targv     __argv



/*

 * Non-unicode (standard) functions

 */



#define	_tprintf	printf

#define _ftprintf	fprintf

#define	_stprintf	sprintf

#define	_sntprintf	_snprintf

#define	_vtprintf	vprintf

#define	_vftprintf	vfprintf

#define _vstprintf	vsprintf

#define	_vsntprintf	_vsnprintf

#define	_tscanf		scanf

#define	_ftscanf	fscanf

#define	_stscanf	sscanf

#define	_fgettc		fgetc

#define	_fgettchar	_fgetchar

#define	_fgetts		fgets

#define	_fputtc		fputc

#define	_fputtchar	_fputchar

#define	_fputts		fputs

#define _tfdopen	_fdopen

#define	_tfopen		fopen

#define	_tgetenv	getenv

#define	_tputenv	_putenv

#define	_tsearchenv	_searchenv

#define	_tmakepath	_makepath

#define	_tsplitpath	_splitpath

#define	_tfullpath	_fullpath

#define	_gettc		getc

#define	_getts		gets

#define	_puttc		putc

#define	_putts		puts

#define	_ungettc	ungetc

#define	_tcstod		strtod

#define	_tcstol		strtol

#define _tcstoul	strtoul

#define	_itot		_itoa

#define	_ltot		_ltoa

#define	_ultot		_ultoa

#define	_ttoi		atoi

#define	_ttol		atol

#define	_tcscat		strcat

#define _tcschr		strchr

#define _tcscmp		strcmp

#define _tcscpy		strcpy

#define _tcscspn	strcspn

#define	_tcslen		strlen

#define	_tcsncat	strncat

#define	_tcsncmp	strncmp

#define	_tcsncpy	strncpy

#define	_tcspbrk	strpbrk

#define	_tcsrchr	strrchr

#define _tcsspn		strspn

#define	_tcsstr		strstr

#define _tcstok		strtok

#define	_tcsdup		_strdup

#define	_tcsicmp	_stricmp

#define	_tcsnicmp	_strnicmp

#define	_tcsnset	_strnset

#define	_tcsrev		_strrev

#define _tcsset		_strset

#define	_tcslwr		_strlwr

#define	_tcsupr		_strupr

#define	_tcsxfrm	strxfrm

#define	_tcscoll	strcoll

#define	_tcsicoll	_stricoll

#define	_istalpha	isalpha

#define	_istupper	isupper

#define	_istlower	islower

#define	_istdigit	isdigit

#define	_istxdigit	isxdigit

#define	_istspace	isspace

#define	_istpunct	ispunct

#define	_istalnum	isalnum

#define	_istprint	isprint

#define	_istgraph	isgraph

#define	_istcntrl	iscntrl

#define	_istascii	isascii

#define _totupper	toupper

#define	_totlower	tolower

#define	_tasctime	asctime

#define	_tctime		ctime

#define	_tstrdate	_strdate

#define	_tstrtime	_strtime

#define	_tutime		_utime

#define _tcsftime	strftime

/* Macro functions */ 

#define _tcsdec     _strdec

#define _tcsinc     _strinc

#define _tcsnbcnt   _strncnt

#define _tcsnccnt   _strncnt

#define _tcsnextc   _strnextc

#define _tcsninc    _strninc

#define _tcsspnp    _strspnp

#define _strdec(_str1, _str2) ((_str1)>=(_str2) ? NULL : (_str2)-1)

#define _strinc(_str)  ((_str)+1)

#define _strnextc(_str) ((unsigned int) *(_str))

#define _strninc(_str, _inc) (((_str)+(_inc)))

#define _strncnt(_str, _cnt) ((strlen(_str)>_cnt) ? _count : strlen(_str))

#define _strspnp(_str1, _str2) ((*((_str1)+strspn(_str1,_str2))) ? ((_str1)+strspn(_str1,_str2)) : NULL)



#define _tchmod     _chmod

#define _tcreat     _creat

#define _tfindfirst _findfirst

#define _tfindnext  _findnext

#define _tmktemp    _mktemp

#define _topen      _open

#define _taccess    _access

#define _tremove    remove

#define _trename    rename

#define _tsopen     _sopen

#define _tsetlocale setlocale

#define _tunlink    _unlink

#define _tfinddata_t    _finddata_t



#if 1  /* defined __MSVCRT__ */

/* Not in crtdll.dll. Define macros anyway? */

#define _ttoi64     _atoi64

#define _i64tot     _i64toa

#define _ui64tot    _ui64toa

#define _tcsnccoll  _strncoll

#define _tcsncoll   _strncoll

#define _tcsncicoll _strnicoll

#define _tcsnicoll  _strnicoll

#define _tfindfirsti64  _findfirsti64

#define _tfindnexti64   _findnexti64

#define _tfinddatai64_t _finddatai64_t

#endif  /* __MSVCRT__ */



/* dirent structures and functions */

#define _tdirent	dirent

#define _TDIR 		DIR

#define _topendir	opendir

#define _tclosedir	closedir

#define _treaddir	readdir

#define _trewinddir	rewinddir

#define _ttelldir	telldir

#define _tseekdir	seekdir



#endif	/* Not _UNICODE */



/*

 * UNICODE a constant string when _UNICODE is defined else returns the string

 * unmodified.  Also defined in w32api/winnt.h.

 */

#define _TEXT(x)	__TEXT(x)

#define	_T(x)		__TEXT(x)



#endif	/* Not _TCHAR_H_ */