Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1061 lines
28 KiB

//+-------------------------------------------------------------------
//
// Copyright (c) 1991-1993, Microsoft Corporation. All rights reserved
//
// File: nchar.h
//
// Contents: Definitions for generic international functions, mostly
// defines which map string/formatted-io/ctype functions
// to char, wchar_t versions. To be used for compatibility
// between single-byte, multi-byte and Unicode text models.
//
// Note: If CTUNICODE is defined then Unicode version is used
// else Char version is used.
//
// History: 16-Feb-94 NaveenB Created
// 04-Oct-96 EricHans New header from sdk
// 25-Feb-97 MariusB tchar.h referral support
//
// Note:
// Many functionalities contained by this file are covered by the
// newer file tchar.h. If you want to replace all your nchar.h
// includes with tchar.h includes, just define __TCHAR_ONLY__
// in your project and you'll receive a compilation error for
// each nchar.h inclusion. Email MariusB for any question.
//---------------------------------------------------------------------
#ifndef __NCHAR_HXX__
#define __NCHAR_HXX__
#if _MSC_VER > 1000 /*IFSTRIP=IGN*/
#pragma once
#endif
#ifndef _INC_NCHAR
#define _INC_NCHAR
#ifdef _MSC_VER
#pragma warning(disable:4514) /* disable unwanted C++ /W4 warning */
/* #pragma warning(default:4514) */ /* use this to reenable, if necessary */
#endif /* _MSC_VER */
#ifdef __TCHAR_ONLY__
#error NCHAR.H is obsolete. Use TCHAR.H instead
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* Define __cdecl for non-Microsoft compilers */
#if ( !defined(_MSC_VER) && !defined(__cdecl) )
#define __cdecl
#endif
/* Define _CRTIMP */
#ifndef _CRTIMP
#ifdef _NTSDK
/* definition compatible with NT SDK */
#define _CRTIMP
#else /* ndef _NTSDK */
/* current definition */
#ifdef CRTDLL
#define _CRTIMP __declspec(dllexport)
#else /* ndef CRTDLL */
#ifdef _DLL
#define _CRTIMP __declspec(dllimport)
#else /* ndef _DLL */
#define _CRTIMP
#endif /* _DLL */
#endif /* CRTDLL */
#endif /* _NTSDK */
#endif /* _CRTIMP */
#define _fncscat _ncscat
#define _fncschr _ncschr
#define _fncscpy _ncscpy
#define _fncscspn _ncscspn
#define _fncslen _ncslen
#define _fncsncat _ncsncat
#define _fncsncpy _ncsncpy
#define _fncspbrk _ncspbrk
#define _fncsrchr _ncsrchr
#define _fncsspn _ncsspn
#define _fncsstr _ncsstr
#define _fncstok _ncstok
#define _fncsdup _ncsdup
#define _fncsnset _ncsnset
#define _fncsrev _ncsrev
#define _fncsset _ncsset
#define _fncscmp _ncscmp
#define _fncsicmp _ncsicmp
#define _fncsnccmp _ncsnccmp
#define _fncsncmp _ncsncmp
#define _fncsncicmp _ncsncicmp
#define _fncsnicmp _ncsnicmp
#define _fncscoll _ncscoll
#define _fncsicoll _ncsicoll
#define _fncsnccoll _ncsnccoll
#define _fncsncoll _ncsncoll
#define _fncsncicoll _ncsncicoll
#define _fncsnicoll _ncsnicoll
/* Redundant "logical-character" mappings */
#define _fncsclen _ncsclen
#define _fncsnccat _ncsnccat
#define _fncsnccpy _ncsnccpy
#define _fncsncset _ncsncset
#define _fncsdec _ncsdec
#define _fncsinc _ncsinc
#define _fncsnbcnt _ncsnbcnt
#define _fncsnccnt _ncsnccnt
#define _fncsnextc _ncsnextc
#define _fncsninc _ncsninc
#define _fncsspnp _ncsspnp
#define _fncslwr _ncslwr
#define _fncsupr _ncsupr
#define _fnclen _nclen
#define _fnccpy _nccpy
#define _fnccmp _nccmp
#ifdef _CTUNICODE
/* ++++++++++++++++++++ UNICODE ++++++++++++++++++++ */
#ifndef _WCTYPE_N_DEFINED
typedef wchar_t wint_n;
typedef wchar_t wctype_n;
#define _WCTYPE_N_DEFINED
#endif
#ifndef __NCHAR_DEFINED
typedef wchar_t _NCHAR;
typedef wchar_t _NSCHAR;
typedef wchar_t _NUCHAR;
typedef wchar_t _NXCHAR;
typedef wint_t _NINT;
#define __NCHAR_DEFINED
#endif
#ifndef _NCHAR_DEFINED
#if !__STDC__
typedef wchar_t NCHAR;
#endif
#define _NCHAR_DEFINED
#endif
#define _NEOF WEOF
#define __TN(x) L ## x
/* Program */
#define _nmain wmain
#define _nWinMain wWinMain
#define _nenviron _wenviron
#define __nargv __wargv
/* Formatted i/o */
#define _nprintf wprintf
#define _fnprintf fwprintf
#define _sNprintf swprintf
#define _snNprintf _snwprintf
#define _vnprintf vwprintf
#define _vfnprintf vfwprintf
#define _vsNprintf vswprintf
#define _vsnNprintf _vsnwprintf
#define _nscanf wscanf
#define _fnscanf fwscanf
#define _snscanf swscanf
/* Unformatted i/o */
#define _fgetnc fgetwc
#define _fgetnchar _fgetwchar
#define _fgetns fgetws
#define _fputnc fputwc
#define _fputnchar _fputwchar
#define _fputns fputws
#define _getnc getwc
#define _getnchar getwchar
#define _getns _getws
#define _putnc putwc
#define _putnchar putwchar
#define _putns _putws
#define _ungetnc ungetwc
/* String conversion functions */
#define _ncstod wcstod
#define _ncstol wcstol
#define _ncstoul wcstoul
#define _iton _itow
#define _lton _ltow
#define _ulton _ultow
#define _ntoi _wtoi
#define _ntol _wtol
/* String functions */
#define _ncscat wcscat
#define _ncschr wcschr
#define _ncscpy wcscpy
#define _ncscspn wcscspn
#define _ncslen wcslen
#define _ncsncat wcsncat
#define _ncsncpy wcsncpy
#define _ncspbrk wcspbrk
#define _ncsrchr wcsrchr
#define _ncsspn wcsspn
#define _ncsstr wcsstr
#define _ncstok wcstok
#define _ncsdup _wcsdup
#define _ncsnset _wcsnset
#define _ncsrev _wcsrev
#define _ncsset _wcsset
#define _ncscmp wcscmp
#define _ncsicmp _wcsicmp
#define _ncsnccmp wcsncmp
#define _ncsncmp wcsncmp
#define _ncsncicmp _wcsnicmp
#define _ncsnicmp _wcsnicmp
#define _ncscoll wcscoll
#define _ncsicoll _wcsicoll
#define _ncsnccoll _wcsncoll
#define _ncsncoll _wcsncoll
#define _ncsncicoll _wcsnicoll
#define _ncsnicoll _wcsnicoll
/* Execute functions */
#define _nexecl _wexecl
#define _nexecle _wexecle
#define _nexeclp _wexeclp
#define _nexeclpe _wexeclpe
#define _nexecv _wexecv
#define _nexecve _wexecve
#define _nexecvp _wexecvp
#define _nexecvpe _wexecvpe
#define _nspawnl _wspawnl
#define _nspawnle _wspawnle
#define _nspawnlp _wspawnlp
#define _nspawnlpe _wspawnlpe
#define _nspawnv _wspawnv
#define _nspawnve _wspawnve
#define _nspawnvp _wspawnvp
#define _nspawnvp _wspawnvp
#define _nspawnvpe _wspawnvpe
#define _nsystem _wsystem
/* Time functions */
#define _nasctime _wasctime
#define _nctime _wctime
#define _nstrdate _wstrdate
#define _nstrtime _wstrtime
#define _nutime _wutime
#define _ncsftime wcsftime
/* Directory functions */
#define _nchdir _wchdir
#define _ngetcwd _wgetcwd
#define _ngetdcwd _wgetdcwd
#define _nmkdir _wmkdir
#define _nrmdir _wrmdir
/* Environment/Path functions */
#define _nfullpath _wfullpath
#define _ngetenv _wgetenv
#define _nmakepath _wmakepath
#define _nputenv _wputenv
#define _nsearchenv _wsearchenv
#define _nsplitpath _wsplitpath
/* Stdio functions */
#define _nfdopen _wfdopen
#define _nfsopen _wfsopen
#define _nfopen _wfopen
#define _nfreopen _wfreopen
#define _nperror _wperror
#define _npopen _wpopen
#define _ntempnam _wtempnam
#define _ntmpnam _wtmpnam
/* Io functions */
#define _naccess _waccess
#define _nchmod _wchmod
#define _ncreat _wcreat
#define _nfindfirst _wfindfirst
#define _nfindfirsti64 _wfindfirsti64
#define _nfindnext _wfindnext
#define _nfindnexti64 _wfindnexti64
#define _nmktemp _wmktemp
#define _nopen _wopen
#define _nremove _wremove
#define _nrename _wrename
#define _nsopen _wsopen
#define _nunlink _wunlink
#define _nfinddata_t _wfinddata_t
#define _nfinddatai64_t _wfinddatai64_t
/* Stat functions */
#define _nstat _wstat
#define _nstati64 _wstati64
/* Setlocale functions */
#define _nsetlocale _wsetlocale
/* Redundant "logical-character" mappings */
#define _ncsclen wcslen
#define _ncsnccat wcsncat
#define _ncsnccpy wcsncpy
#define _ncsncset _wcsnset
#define _ncsdec _wcsdec
#define _ncsinc _wcsinc
#define _ncsnbcnt _wcsncnt
#define _ncsnccnt _wcsncnt
#define _ncsnextc _wcsnextc
#define _ncsninc _wcsninc
#define _ncsspnp _wcsspnp
#define _ncslwr _wcslwr
#define _ncsupr _wcsupr
#define _ncsxfrm wcsxfrm
#if (__STDC__ || defined(_NO_INLINING)) && !defined(_M_M68K)
#define _nclen(_pc) (1)
#define _nccpy(_pc1,_cpc2) ((*(_pc1) = *(_cpc2)))
#define _nccmp(_cpc1,_cpc2) ((*(_cpc1))-(*(_cpc2)))
#else /* __STDC__ */
#if 0
__inline size_t __cdecl _nclen(const wchar_t *_cpc) { return (_cpc,1); }
__inline void __cdecl _nccpy(wchar_t *_pc1, const wchar_t *_cpc2) { *_pc1 = (wchar_t)*_cpc2; }
__inline int __cdecl _nccmp(const wchar_t *_cpc1, const wchar_t *_cpc2) { return (int) ((*_cpc1)-(*_cpc2)); }
#endif
#endif /* __STDC__ */
/* ctype functions */
#define _isnalnum iswalnum
#define _isnalpha iswalpha
#define _isnascii iswascii
#define _isncntrl iswcntrl
#define _isndigit iswdigit
#define _isngraph iswgraph
#define _isnlower iswlower
#define _isnprint iswprint
#define _isnpunct iswpunct
#define _isnspace iswspace
#define _isnupper iswupper
#define _isnxdigit iswxdigit
#define _tonupper towupper
#define _tonlower towlower
#define _isnlegal(_c) (1)
#define _isnlead(_c) (0)
#define _isnleadbyte(_c) (0)
#if (__STDC__ || defined(_NO_INLINING)) && !defined(_M_M68K)
#define _wcsdec(_cpc1, _cpc2) ((_cpc2)-1)
#define _wcsinc(_pc) ((_pc)+1)
#define _wcsnextc(_cpc) ((unsigned int) *(_cpc))
#define _wcsninc(_pc, _sz) (((_pc)+(_sz)))
#define _wcsncnt(_cpc, _sz) ((wcslen(_cpc)>_sz) ? _sz : wcslen(_cpc))
#define _wcsspnp(_cpc1, _cpc2) ((*((_cpc1)+wcsspn(_cpc1,_cpc2))) ? ((_cpc1)+wcsspn(_cpc1,_cpc2)) : NULL)
#else /* __STDC__ */
// BUGBUG [erichans] for some bizarre reason this body conflicts with tchar.h
#if 0
__inline wchar_t * __cdecl _wcsdec(const wchar_t * _cpc1, const wchar_t * _cpc2) { return (wchar_t *)(_cpc1,(_cpc2-1)); }
__inline wchar_t * __cdecl _wcsinc(const wchar_t * _pc) { return (wchar_t *)(_pc+1); }
__inline unsigned int __cdecl _wcsnextc(const wchar_t * _cpc) { return (unsigned int)*_cpc; }
__inline wchar_t * __cdecl _wcsninc(const wchar_t * _pc, size_t _sz) { return (wchar_t *)(_pc+_sz); }
__inline size_t __cdecl _wcsncnt( const wchar_t * _cpc, size_t _sz) { size_t len; len = wcslen(_cpc); return (len>_sz) ? _sz : len; }
__inline wchar_t * __cdecl _wcsspnp( const wchar_t * _cpc1, const wchar_t * _cpc2) { return (*(_cpc1 += wcsspn(_cpc1,_cpc2))!='\0') ? (wchar_t*)_cpc1 : NULL; }
#endif
#endif /* __STDC__ */
#else /* ndef _CTUNICODE */
/* ++++++++++++++++++++ SBCS and MBCS ++++++++++++++++++++ */
#include <string.h>
#define _NEOF EOF
#define __TN(x) x
/* Program */
#define _nmain main
#define _nWinMain WinMain
#ifdef _POSIX_
#define _nenviron environ
#else
#define _nenviron _environ
#endif
#define __nargv __argv
/* Formatted i/o */
#define _nprintf printf
#define _fnprintf fprintf
#define _sNprintf sprintf
#define _snNprintf _snprintf
#define _vnprintf vprintf
#define _vfnprintf vfprintf
#define _vsNprintf vsprintf
#define _vsnNprintf _vsnprintf
#define _nscanf scanf
#define _fnscanf fscanf
#define _snscanf sscanf
/* Unformatted i/o */
#define _fgetnc fgetc
#define _fgetnchar _fgetchar
#define _fgetns fgets
#define _fputnc fputc
#define _fputnchar _fputchar
#define _fputns fputs
#define _getnc getc
#define _getnchar getchar
#define _getns gets
#define _putnc putc
#define _putnchar putchar
#define _putns puts
#define _ungetnc ungetc
/* String conversion functions */
#define _ncstod strtod
#define _ncstol strtol
#define _ncstoul strtoul
#define _iton _itoa
#define _lton _ltoa
#define _ulton _ultoa
#define _ntoi atoi
#define _ntol atol
/* String functions */
#define _ncscat strcat
#define _ncscpy strcpy
#define _ncslen strlen
#define _ncsxfrm strxfrm
#define _ncsdup _strdup
/* Execute functions */
#define _nexecl _execl
#define _nexecle _execle
#define _nexeclp _execlp
#define _nexeclpe _execlpe
#define _nexecv _execv
#define _nexecve _execve
#define _nexecvp _execvp
#define _nexecvpe _execvpe
#define _nspawnl _spawnl
#define _nspawnle _spawnle
#define _nspawnlp _spawnlp
#define _nspawnlpe _spawnlpe
#define _nspawnv _spawnv
#define _nspawnve _spawnve
#define _nspawnvp _spawnvp
#define _nspawnvpe _spawnvpe
#define _nsystem system
/* Time functions */
#define _nasctime asctime
#define _nctime ctime
#define _nstrdate _strdate
#define _nstrtime _strtime
#define _nutime _utime
#define _ncsftime strftime
/* Directory functions */
#define _nchdir _chdir
#define _ngetcwd _getcwd
#define _ngetdcwd _getdcwd
#define _nmkdir _mkdir
#define _nrmdir _rmdir
/* Environment/Path functions */
#define _nfullpath _fullpath
#define _ngetenv getenv
#define _nmakepath _makepath
#define _nputenv _putenv
#define _nsearchenv _searchenv
#define _nsplitpath _splitpath
/* Stdio functions */
#ifdef _POSIX_
#define _nfdopen fdopen
#else
#define _nfdopen _fdopen
#endif
#define _nfsopen _fsopen
#define _nfopen fopen
#define _nfreopen freopen
#define _nperror perror
#define _npopen _popen
#define _ntempnam _tempnam
#define _ntmpnam tmpnam
/* Io functions */
#define _nchmod _chmod
#define _ncreat _creat
#define _nfindfirst _findfirst
#define _nfindfirsti64 _findfirsti64
#define _nfindnext _findnext
#define _nfindnexti64 _findnexti64
#define _nmktemp _mktemp
#ifdef _POSIX_
#define _nopen open
#define _naccess access
#else
#define _nopen _open
#define _naccess _access
#endif
#define _nremove remove
#define _nrename rename
#define _nsopen _sopen
#define _nunlink _unlink
#define _nfinddata_t _finddata_t
#define _nfinddatai64_t _finddatai64_t
/* ctype functions */
#define _isnascii isascii
#define _isncntrl iscntrl
#define _isnxdigit isxdigit
/* Stat functions */
#define _nstat _stat
#define _nstati64 _stati64
/* Setlocale functions */
#define _nsetlocale setlocale
#ifdef _MBCS
/* ++++++++++++++++++++ MBCS ++++++++++++++++++++ */
#ifndef __NCHAR_DEFINED
typedef char _NCHAR;
typedef signed char _NSCHAR;
typedef unsigned char _NUCHAR;
typedef unsigned char _NXCHAR;
typedef unsigned int _NINT;
#define __NCHAR_DEFINED
#endif
#ifndef _NCHAR_DEFINED
#if !__STDC__
typedef char NCHAR;
#endif
#define _NCHAR_DEFINED
#endif
#ifdef _MB_MAP_DIRECT
/* use mb functions directly - types must match */
/* String functions */
#define _ncschr _mbschr
#define _ncscspn _mbscspn
#define _ncsncat _mbsnbcat
#define _ncsncpy _mbsnbcpy
#define _ncspbrk _mbspbrk
#define _ncsrchr _mbsrchr
#define _ncsspn _mbsspn
#define _ncsstr _mbsstr
#define _ncstok _mbstok
#define _ncsnset _mbsnbset
#define _ncsrev _mbsrev
#define _ncsset _mbsset
#define _ncscmp _mbscmp
#define _ncsicmp _mbsicmp
#define _ncsnccmp _mbsncmp
#define _ncsncmp _mbsnbcmp
#define _ncsncicmp _mbsnicmp
#define _ncsnicmp _mbsnbicmp
#define _ncscoll _mbscoll
#define _ncsicoll _mbsicoll
#define _ncsnccoll _mbsncoll
#define _ncsncoll _mbsnbcoll
#define _ncsncicoll _mbsnicoll
#define _ncsnicoll _mbsnbicoll
/* "logical-character" mappings */
#define _ncsclen _mbslen
#define _ncsnccat _mbsncat
#define _ncsnccpy _mbsncpy
#define _ncsncset _mbsnset
/* MBCS-specific mappings */
#define _ncsdec _mbsdec
#define _ncsinc _mbsinc
#define _ncsnbcnt _mbsnbcnt
#define _ncsnccnt _mbsnccnt
#define _ncsnextc _mbsnextc
#define _ncsninc _mbsninc
#define _ncsspnp _mbsspnp
#define _ncslwr _mbslwr
#define _ncsupr _mbsupr
#define _nclen _mbclen
#define _nccpy _mbccpy
#define _nccmp(_cpuc1,_cpuc2) _ncsnccmp(_cpuc1,_cpuc2,1)
#else /* _MB_MAP_DIRECT */
#if (__STDC__ || defined(_NO_INLINING)) && !defined(_M_M68K)
/* use type-safe linked-in function thunks */
/* String functions */
_CRTIMP char * __cdecl _ncschr(const char *, unsigned int);
_CRTIMP size_t __cdecl _ncscspn(const char *, const char *);
_CRTIMP char * __cdecl _ncsncat(char *, const char *, size_t);
_CRTIMP char * __cdecl _ncsncpy(char *, const char *, size_t);
_CRTIMP char * __cdecl _ncspbrk(const char *, const char *);
_CRTIMP char * __cdecl _ncsrchr(const char *, int);
_CRTIMP size_t __cdecl _ncsspn(const char *, const char *);
_CRTIMP char * __cdecl _ncsstr(const char *, const char *);
_CRTIMP char * __cdecl _ncstok(char *, const char *);
_CRTIMP char * __cdecl _ncsnset(char *, unsigned int, size_t);
_CRTIMP char * __cdecl _ncsrev(char *);
_CRTIMP char * __cdecl _ncsset(char *, unsigned int);
_CRTIMP int __cdecl _ncscmp(const char *, const char *);
_CRTIMP int __cdecl _ncsicmp(const char *, const char *);
_CRTIMP int __cdecl _ncsnccmp(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsncmp(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsncicmp(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsnicmp(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncscoll(const char *, const char *);
_CRTIMP int __cdecl _ncsicoll(const char *, const char *);
_CRTIMP int __cdecl _ncsnccoll(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsncoll(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsncicoll(const char *, const char *, size_t);
_CRTIMP int __cdecl _ncsnicoll(const char *, const char *, size_t);
/* "logical-character" mappings */
_CRTIMP size_t __cdecl _ncsclen(const char *);
_CRTIMP char * __cdecl _ncsnccat(char *, const char *, size_t);
_CRTIMP char * __cdecl _ncsnccpy(char *, const char *, size_t);
_CRTIMP char * __cdecl _ncsncset(char *, unsigned int, size_t);
/* MBCS-specific mappings */
_CRTIMP char * __cdecl _ncsdec(const char *, const char *);
_CRTIMP char * __cdecl _ncsinc(const char *);
_CRTIMP size_t __cdecl _ncsnbcnt(const char *, size_t);
_CRTIMP size_t __cdecl _ncsnccnt(const char *, size_t);
_CRTIMP unsigned int __cdecl _ncsnextc (const char *);
_CRTIMP char * __cdecl _ncsninc(const char *, size_t);
_CRTIMP char * __cdecl _ncsspnp(const char *, const char *);
_CRTIMP char * __cdecl _ncslwr(char *);
_CRTIMP char * __cdecl _ncsupr(char *);
_CRTIMP size_t __cdecl _nclen(const char *);
_CRTIMP void __cdecl _nccpy(char *, const char *);
#else /* __STDC__ */
/* the default: use type-safe inline function thunks */
#define _PUC unsigned char *
#define _CPUC const unsigned char *
#define _PC char *
#define _CPC const char *
#define _UI unsigned int
/* String functions */
__inline _PC _ncschr(_CPC _s1,_UI _c) {return (_PC)_mbschr((_CPUC)_s1,_c);}
__inline size_t _ncscspn(_CPC _s1,_CPC _s2) {return _mbscspn((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncsncat(_PC _s1,_CPC _s2,size_t _n) {return (_PC)_mbsnbcat((_PUC)_s1,(_CPUC)_s2,_n);}
__inline _PC _ncsncpy(_PC _s1,_CPC _s2,size_t _n) {return (_PC)_mbsnbcpy((_PUC)_s1,(_CPUC)_s2,_n);}
__inline _PC _ncspbrk(_CPC _s1,_CPC _s2) {return (_PC)_mbspbrk((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncsrchr(_CPC _s1,_UI _c) {return (_PC)_mbsrchr((_CPUC)_s1,_c);}
__inline size_t _ncsspn(_CPC _s1,_CPC _s2) {return _mbsspn((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncsstr(_CPC _s1,_CPC _s2) {return (_PC)_mbsstr((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncstok(_PC _s1,_CPC _s2) {return (_PC)_mbstok((_PUC)_s1,(_CPUC)_s2);}
__inline _PC _ncsnset(_PC _s1,_UI _c,size_t _n) {return (_PC)_mbsnbset((_PUC)_s1,_c,_n);}
__inline _PC _ncsrev(_PC _s1) {return (_PC)_mbsrev((_PUC)_s1);}
__inline _PC _ncsset(_PC _s1,_UI _c) {return (_PC)_mbsset((_PUC)_s1,_c);}
__inline int _ncscmp(_CPC _s1,_CPC _s2) {return _mbscmp((_CPUC)_s1,(_CPUC)_s2);}
__inline int _ncsicmp(_CPC _s1,_CPC _s2) {return _mbsicmp((_CPUC)_s1,(_CPUC)_s2);}
__inline int _ncsnccmp(_CPC _s1,_CPC _s2,size_t _n) {return _mbsncmp((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsncmp(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnbcmp((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsncicmp(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnicmp((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsnicmp(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnbicmp((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncscoll(_CPC _s1,_CPC _s2) {return _mbscoll((_CPUC)_s1,(_CPUC)_s2);}
__inline int _ncsicoll(_CPC _s1,_CPC _s2) {return _mbsicoll((_CPUC)_s1,(_CPUC)_s2);}
__inline int _ncsnccoll(_CPC _s1,_CPC _s2,size_t _n) {return _mbsncoll((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsncoll(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnbcoll((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsncicoll(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnicoll((_CPUC)_s1,(_CPUC)_s2,_n);}
__inline int _ncsnicoll(_CPC _s1,_CPC _s2,size_t _n) {return _mbsnbicoll((_CPUC)_s1,(_CPUC)_s2,_n);}
/* "logical-character" mappings */
__inline size_t _ncsclen(_CPC _s1) {return _mbslen((_CPUC)_s1);}
__inline _PC _ncsnccat(_PC _s1,_CPC _s2,size_t _n) {return (_PC)_mbsncat((_PUC)_s1,(_CPUC)_s2,_n);}
__inline _PC _ncsnccpy(_PC _s1,_CPC _s2,size_t _n) {return (_PC)_mbsncpy((_PUC)_s1,(_CPUC)_s2,_n);}
__inline _PC _ncsncset(_PC _s1,_UI _c,size_t _n) {return (_PC)_mbsnset((_PUC)_s1,_c,_n);}
/* MBCS-specific mappings */
__inline _PC _ncsdec(_CPC _s1,_CPC _s2) {return (_PC)_mbsdec((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncsinc(_CPC _s1) {return (_PC)_mbsinc((_CPUC)_s1);}
__inline size_t _ncsnbcnt(_CPC _s1,size_t _n) {return _mbsnbcnt((_CPUC)_s1,_n);}
__inline size_t _tcsnccnt(_CPC _s1,size_t _n) {return _mbsnccnt((_CPUC)_s1,_n);}
__inline _PC _ncsninc(_CPC _s1,size_t _n) {return (_PC)_mbsninc((_CPUC)_s1,_n);}
__inline _PC _tcsspnp(_CPC _s1,_CPC _s2) {return (_PC)_mbsspnp((_CPUC)_s1,(_CPUC)_s2);}
__inline _PC _ncslwr(_PC _s1) {return (_PC)_mbslwr((_PUC)_s1);}
__inline _PC _ncsupr(_PC _s1) {return (_PC)_mbsupr((_PUC)_s1);}
__inline size_t _nclen(_CPC _s1) {return _mbclen((_CPUC)_s1);}
__inline void _nccpy(_PC _s1,_CPC _s2) {_mbccpy((_PUC)_s1,(_CPUC)_s2); return;}
/* inline helper */
__inline _UI _ncsnextc(_CPC _s1) {_UI _n=0; if (_ismbblead((_UI)*(_PUC)_s1)) _n=((_UI)*_s1++)<<8; _n+=(_UI)*_s1; return(_n);}
#endif /* __STDC__ */
#endif /* _MB_MAP_DIRECT */
/* MBCS-specific mappings */
#define _nccmp(_cp1,_cp2) _ncsnccmp(_cp1,_cp2,1)
/* ctype functions */
#define _isnalnum _ismbcalnum
#define _isnalpha _ismbcalpha
#define _isndigit _ismbcdigit
#define _isngraph _ismbcgraph
#define _isnlegal _ismbclegal
#define _isnlower _ismbclower
#define _isnprint _ismbcprint
#define _isnpunct _ismbcpunct
#define _isnspace _ismbcspace
#define _isnupper _ismbcupper
#define _tonupper _mbctoupper
#define _tonlower _mbctolower
#define _isnlead _ismbblead
#define _isnleadbyte isleadbyte
#else /* !_MBCS */
/* ++++++++++++++++++++ SBCS ++++++++++++++++++++ */
#ifndef __NCHAR_DEFINED
typedef char _NCHAR;
typedef signed char _NSCHAR;
typedef unsigned char _NUCHAR;
typedef char _NXCHAR;
typedef int _NINT;
#define __NCHAR_DEFINED
#endif
#ifndef _NCHAR_DEFINED
#if !__STDC__
typedef char NCHAR;
#endif
#define _NCHAR_DEFINED
#endif
/* String functions */
#define _ncschr strchr
#define _ncscspn strcspn
#define _ncsncat strncat
#define _ncsncpy strncpy
#define _ncspbrk strpbrk
#define _ncsrchr strrchr
#define _ncsspn strspn
#define _ncsstr strstr
#define _ncstok strtok
#define _ncsnset _strnset
#define _ncsrev _strrev
#define _ncsset _strset
#define _ncscmp strcmp
#define _ncsicmp _stricmp
#define _ncsnccmp strncmp
#define _ncsncmp strncmp
#define _ncsncicmp _strnicmp
#define _ncsnicmp _strnicmp
#define _ncscoll strcoll
#define _ncsicoll _stricoll
#define _ncsnccoll _strncoll
#define _ncsncoll _strncoll
#define _ncsncicoll _strnicoll
#define _ncsnicoll _strnicoll
/* "logical-character" mappings */
#define _ncsclen strlen
#define _ncsnccat strncat
#define _ncsnccpy strncpy
#define _ncsncset _strnset
/* MBCS-specific functions */
#define _ncsdec _strdec
#define _ncsinc _strinc
#define _ncsnbcnt _strncnt
#define _ncsnccnt _strncnt
#define _ncsnextc _strnextc
#define _ncsninc _strninc
#define _ncsspnp _strspnp
#define _ncslwr _strlwr
#define _ncsupr _strupr
#define _ncsxfrm strxfrm
#define _isnlead(_c) (0)
#define _isnleadbyte(_c) (0)
#if (__STDC__ || defined(_NO_INLINING)) && !defined(_M_M68K)
#define _nclen(_pc) (1)
#define _nccpy(_pc1,_cpc2) (*(_pc1) = *(_cpc2))
#define _nccmp(_cpc1,_cpc2) (((unsigned char)*(_cpc1))-((unsigned char)*(_cpc2)))
#else /* __STDC__ */
__inline size_t __cdecl _nclen(const char *_cpc) { return (_cpc,1); }
__inline void __cdecl _nccpy(char *_pc1, const char *_cpc2) { *_pc1 = *_cpc2; }
__inline int __cdecl _nccmp(const char *_cpc1, const char *_cpc2) { return (int) (((unsigned char)*_cpc1)-((unsigned char)*_cpc2)); }
#endif /* __STDC__ */
/* ctype-functions */
#define _isnalnum isalnum
#define _isnalpha isalpha
#define _isndigit isdigit
#define _isngraph isgraph
#define _isnlower islower
#define _isnprint isprint
#define _isnpunct ispunct
#define _isnspace isspace
#define _isnupper isupper
#define _tonupper toupper
#define _tonlower tolower
#define _isnlegal(_c) (1)
/* the following is optional if functional versions are available */
/* define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#if (__STDC__ || defined(_NO_INLINING)) && !defined(_M_M68K)
// BUGBUG [erichans] for some bizarre reason this conflicts with tchar.h
#if 0
#define _strdec(_cpc1, _cpc2) ((_cpc2)-1)
#define _strinc(_pc) ((_pc)+1)
#define _strnextc(_cpc) ((unsigned int) *(_cpc))
#define _strninc(_pc, _sz) (((_pc)+(_sz)))
#define _strncnt(_cpc, _sz) ((strlen(_cpc)>_sz) ? _sz : strlen(_cpc))
#define _strspnp(_cpc1, _cpc2) ((*((_cpc1)+strspn(_cpc1,_cpc2))) ? ((_cpc1)+strspn(_cpc1,_cpc2)) : NULL)
#else /* __STDC__ */
__inline char * __cdecl _strdec(const char * _cpc1, const char * _cpc2) { return (char *)(_cpc1,(_cpc2-1)); }
__inline char * __cdecl _strinc(const char * _pc) { return (char *)(_pc+1); }
__inline unsigned int __cdecl _strnextc(const char * _cpc) { return (unsigned int)*_cpc; }
__inline char * __cdecl _strninc(const char * _pc, size_t _sz) { return (char *)(_pc+_sz); }
__inline size_t __cdecl _strncnt( const char * _cpc, size_t _sz) { size_t len; len = strlen(_cpc); return (len>_sz) ? _sz : len; }
__inline char * __cdecl _strspnp( const char * _cpc1, const char * _cpc2) { return (*(_cpc1 += strspn(_cpc1,_cpc2))!='\0') ? (char*)_cpc1 : NULL; }
#endif
#endif /* __STDC__ */
#endif /* _MBCS */
#endif /* _UNICODE */
/* Generic text macros to be used with string literals and character constants.
Will also allow symbolic constants that resolve to same. */
#define _TN(x) __TN(x)
#define _TEXTN(x) __TN(x)
#ifdef __cplusplus
}
#endif
#endif /* _INC_NCHAR */
//
// Neutral ANSI/UNICODE types and macros
//
#ifdef CTUNICODE
typedef WCHAR *PNCHAR;
typedef NCHAR *LPNCHAR;
typedef LPWSTR LPNCH, PNCH;
typedef LPWSTR PNSTR, LPNSTR;
typedef LPCWSTR LPCNSTR;
typedef LPWSTR LP;
#define __TEXTN(quote) L##quote
#else /* CTUNICODE */
typedef char NCHAR, *PNCHAR;
typedef unsigned char NBYTE , *PNBYTE ;
typedef NCHAR *LPNCHAR;
typedef LPSTR LPNCH, PNCH;
typedef LPSTR PNSTR, LPNSTR;
typedef LPCSTR LPCNSTR;
#define __TEXTN(quote) quote
#endif /* CTUNICODE */
typedef const NCHAR CNCHAR;
#ifdef CTUNICODE
#define NSF __TEXTN("%ls")
#else // ANSI
#define NSF __TEXTN("%hs")
#endif
#endif // __NCHAR_HXX__