wxchar.h
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C头文件 代码 · 共 1,259 行 · 第 1/3 页
H
1,259 行
/*
* Name: wx/wxchar.h
* Purpose: Declarations common to wx char/wchar_t usage (wide chars)
* Author: Joel Farley, Ove K鍁en
* Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
* Created: 1998/06/12
* RCS-ID: $Id: wxchar.h,v 1.180.2.6 2006/03/17 14:23:35 SC Exp $
* Copyright: (c) 1998-2002 Joel Farley, Ove K鍁en, Robert Roebling, Ron Lee
* Licence: wxWindows licence
*/
/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
#ifndef _WX_WXCHAR_H_
#define _WX_WXCHAR_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "wxchar.h"
#endif
/* defs.h indirectly includes this file, so don't include it here */
#include "wx/platform.h"
#include "wx/dlimpexp.h"
#if defined(HAVE_STRTOK_R) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS
char *strtok_r(char *, const char *, char **);
#endif
/* check whether we have wchar_t and which size it is if we do */
#if !defined(wxUSE_WCHAR_T)
#if defined(__UNIX__)
#if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__)
#define wxUSE_WCHAR_T 1
#else
#define wxUSE_WCHAR_T 0
#endif
#elif defined(__GNUWIN32__) && !defined(__MINGW32__)
#define wxUSE_WCHAR_T 0
#elif defined(__WATCOMC__)
#define wxUSE_WCHAR_T 0
#elif defined(__VISAGECPP__) && (__IBMCPP__ < 400)
#define wxUSE_WCHAR_T 0
#else
/* add additional compiler checks if this fails */
#define wxUSE_WCHAR_T 1
#endif
#endif /* !defined(wxUSE_WCHAR_T) */
/* Unicode support requires wchar_t */
#if wxUSE_UNICODE && !wxUSE_WCHAR_T
#error "wchar_t must be available in Unicode build"
#endif /* Unicode */
/*
Standard headers we need here.
NB: don't include any wxWidgets headers here because almost all of them include
this one!
*/
/* Required for wxPrintf() etc */
#include <stdarg.h>
/* Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac */
/* and VC++ for Windows CE don't provide it */
#if defined(__VISUALC__) && __VISUALC__ >= 1400
#define wxStrdupA _strdup
#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
/* use #define, not inline wrapper, as it is tested with #ifndef below */
#define wxStrdupA strdup
#endif
/*
non Unix compilers which do have wchar.h (but not tchar.h which is included
below and which includes wchar.h anyhow).
Actually MinGW has tchar.h, but it does not include wchar.h
*/
#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
#ifndef HAVE_WCHAR_H
#define HAVE_WCHAR_H
#endif
#endif
#if defined(__MWERKS__) && !defined(__MACH__)
#ifndef HAVE_WCSLEN
#define HAVE_WCSLEN
#endif
#endif
#if wxUSE_WCHAR_T
#ifdef HAVE_WCHAR_H
/* the current (as of Nov 2002) version of cygwin has a bug in its */
/* wchar.h -- there is no extern "C" around the declarations in it and */
/* this results in linking errors later; also, at least on some */
/* Cygwin versions, wchar.h requires sys/types.h */
#ifdef __CYGWIN__
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
#endif /* Cygwin */
#include <wchar.h>
#if defined(__CYGWIN__) && defined(__cplusplus)
}
#endif /* Cygwin and C++ */
#elif defined(HAVE_WCSTR_H)
/* old compilers have relevant declarations here */
#include <wcstr.h>
#elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
/* include stdlib.h for wchar_t */
#include <stdlib.h>
#endif /* HAVE_WCHAR_H */
#endif /* wxUSE_WCHAR_T */
/* ---------------------------------------------------------------------------- */
/* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */
/* mapped to either char or wchar_t depending on the ASCII/Unicode mode and have */
/* the function mapping _tfoo() -> foo() or wfoo() */
/* ---------------------------------------------------------------------------- */
/* VC++ and BC++ starting with 5.2 have TCHAR support */
#ifdef __VISUALC__
#define wxHAVE_TCHAR_SUPPORT
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)
#define wxHAVE_TCHAR_SUPPORT
#include <ctype.h>
#elif defined(__WATCOMC__)
#define wxHAVE_TCHAR_SUPPORT
#elif defined(__DMC__)
#define wxHAVE_TCHAR_SUPPORT
#elif defined(__WXPALMOS__)
#include <stddef.h>
#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
#define wxHAVE_TCHAR_SUPPORT
#include <stddef.h>
#include <string.h>
#include <ctype.h>
#elif 0 && defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
/* VZ: the old VisualAge definitions were completely wrong and had no */
/* chance at all to work in Unicode build anyhow so let's pretend that */
/* VisualAge does _not_ support TCHAR for the moment (as indicated by */
/* "0 &&" above) until someone really has time to delve into Unicode */
/* issues under OS/2 */
/* VisualAge 4.0+ supports TCHAR */
#define wxHAVE_TCHAR_SUPPORT
#endif /* compilers with (good) TCHAR support */
#ifdef __MWERKS__
#define HAVE_WPRINTF
#endif
#ifdef wxHAVE_TCHAR_SUPPORT
/* get TCHAR definition if we've got it */
#include <tchar.h>
/* we surely do have wchar_t if we have TCHAR */
#ifndef wxUSE_WCHAR_T
#define wxUSE_WCHAR_T 1
#endif /* !defined(wxUSE_WCHAR_T) */
/* and we also do have wcslen() */
#ifndef HAVE_WCSLEN
#define HAVE_WCSLEN
#endif
#endif /* wxHAVE_TCHAR_SUPPORT */
/* ---------------------------------------------------------------------------- */
/* define wxChar type */
/* ---------------------------------------------------------------------------- */
/* TODO: define wxCharInt to be equal to either int or wint_t? */
#if !wxUSE_UNICODE
typedef char wxChar;
typedef signed char wxSChar;
typedef unsigned char wxUChar;
#else /* Unicode */
/* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as */
/* signed/unsigned version of it which (a) makes sense to me (unlike */
/* char wchar_t is always unsigned) and (b) was how the previous */
/* definitions worked so keep it like this */
/* Sun's SunPro compiler supports the wchar_t type and wide character */
/* functions, but does not define __WCHAR_TYPE__. Define it here to */
/* allow unicode enabled builds. */
#if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
#define __WCHAR_TYPE__ wxchar_t
#endif
/* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */
/* comment below */
#if !defined(__WCHAR_TYPE__) || \
(!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96))
/* standard case */
typedef wchar_t wxChar;
typedef wchar_t wxSChar;
typedef wchar_t wxUChar;
#else /* __WCHAR_TYPE__ and gcc < 2.96 */
/* VS: wxWidgets used to define wxChar as __WCHAR_TYPE__ here. However, */
/* this doesn't work with new GCC 3.x compilers because wchar_t is */
/* C++'s builtin type in the new standard. OTOH, old compilers (GCC */
/* 2.x) won't accept new definition of wx{S,U}Char, therefore we */
/* have to define wxChar conditionally depending on detected */
/* compiler & compiler version. */
/* with old definition of wxChar. */
typedef __WCHAR_TYPE__ wxChar;
typedef __WCHAR_TYPE__ wxSChar;
typedef __WCHAR_TYPE__ wxUChar;
#endif /* __WCHAR_TYPE__ */
#endif /* ASCII/Unicode */
/* ---------------------------------------------------------------------------- */
/* define _T() and related macros */
/* ---------------------------------------------------------------------------- */
/* BSD systems define _T() to be something different in ctype.h, override it */
#if defined(__FreeBSD__) || defined(__DARWIN__)
#include <ctype.h>
#undef _T
#endif
/* could already be defined by tchar.h (it's quasi standard) */
#ifndef _T
#if !wxUSE_UNICODE
#define _T(x) x
#else /* Unicode */
#define _T(x) L ## x
#endif /* ASCII/Unicode */
#endif /* !defined(_T) */
/* although global macros with such names are normally bad, we want to have */
/* another name for _T() which should be used to avoid confusion between _T() */
/* and _() in wxWidgets sources */
#define wxT(x) _T(x)
/* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
#ifndef __TFILE__
#define __XFILE__(x) wxT(x)
#define __TFILE__ __XFILE__(__FILE__)
#endif
#ifndef __TDATE__
#define __XDATE__(x) wxT(x)
#define __TDATE__ __XDATE__(__DATE__)
#endif
#ifndef __TTIME__
#define __XTIME__(x) wxT(x)
#define __TTIME__ __XTIME__(__TIME__)
#endif
/*
define wxFoo() function for each standard foo() function whose signature
(exceptionally including the return type) includes any mention of char:
wxFoo() is going to be a Unicode-friendly version of foo(), i.e. will have
the same signature but with char replaced by wxChar which allows us to use
it in Unicode build as well
*/
#ifdef wxHAVE_TCHAR_SUPPORT
#include <ctype.h>
#if defined(__WATCOMC__) && defined(UNICODE)
#define WXWCHAR_T_CAST(c) (wint_t)(c)
#else
#define WXWCHAR_T_CAST(c) c
#endif
/* ctype.h functions */
#define wxIsalnum(c) _istalnum(WXWCHAR_T_CAST(c))
#define wxIsalpha(c) _istalpha(WXWCHAR_T_CAST(c))
#define wxIscntrl(c) _istcntrl(WXWCHAR_T_CAST(c))
#define wxIsdigit(c) _istdigit(WXWCHAR_T_CAST(c))
#define wxIsgraph(c) _istgraph(WXWCHAR_T_CAST(c))
#define wxIslower(c) _istlower(WXWCHAR_T_CAST(c))
#define wxIsprint(c) _istprint(WXWCHAR_T_CAST(c))
#define wxIspunct(c) _istpunct(WXWCHAR_T_CAST(c))
#define wxIsspace(c) _istspace(WXWCHAR_T_CAST(c))
#define wxIsupper(c) _istupper(WXWCHAR_T_CAST(c))
#define wxIsxdigit(c) _istxdigit(WXWCHAR_T_CAST(c))
/*
There is a bug in VC6 C RTL: toxxx() functions dosn't do anything with
signed chars < 0, so "fix" it here.
*/
#define wxTolower(c) _totlower((wxUChar)(c))
#define wxToupper(c) _totupper((wxUChar)(c))
/* locale.h functons */
#define wxSetlocale _tsetlocale
/* string.h functions */
#define wxStrcat _tcscat
#define wxStrchr _tcschr
#define wxStrcmp _tcscmp
#define wxStrcoll _tcscoll
#define wxStrcpy _tcscpy
#define wxStrcspn _tcscspn
#define wxStrdupW _wcsdup /* notice the 'W'! */
#define wxStrftime _tcsftime
#define wxStricmp _tcsicmp
#define wxStrnicmp _tcsnicmp
#define wxStrlen_ _tcslen /* used in wxStrlen inline function */
#define wxStrncat _tcsncat
#define wxStrncmp _tcsncmp
#define wxStrncpy _tcsncpy
#define wxStrpbrk _tcspbrk
#define wxStrrchr _tcsrchr
#define wxStrspn _tcsspn
#define wxStrstr _tcsstr
#define wxStrtod _tcstod
#define wxStrtol _tcstol
#define wxStrtoul _tcstoul
#define wxStrxfrm _tcsxfrm
/* stdio.h functions */
#define wxFgetc _fgettc
#define wxFgetchar _fgettchar
#define wxFgets _fgetts
#if wxUSE_UNICODE_MSLU
#define wxFopen wxMSLU__tfopen
#else
#define wxFopen _tfopen
#endif
#define wxFputc _fputtc
#define wxFputchar _fputtchar
#define wxFprintf _ftprintf
#define wxFputs _fputts
#define wxFreopen _tfreopen
#define wxFscanf _ftscanf
#define wxGetc _gettc
#define wxGetchar _gettchar
#define wxGets _getts
#define wxPerror _tperror
#define wxPrintf _tprintf
#define wxPutc(c,f) _puttc(WXWCHAR_T_CAST(c),f)
#define wxPutchar _puttchar
#define wxPuts _putts
#define wxScanf _tscanf
#if defined(__DMC__)
#if wxUSE_UNICODE
/* Digital Mars adds count to _stprintf (C99) so prototype conversion see wxchar.cpp */
int wxSprintf (wchar_t * __RESTRICT s, const wchar_t * __RESTRICT format, ... ) ;
#else
/* and there is a bug in D Mars tchar.h prior to 8.39.4n, so define as sprintf */
#define wxSprintf sprintf
#endif
#else
#define wxSprintf _stprintf
#endif
#define wxSscanf _stscanf
#define wxTmpnam _ttmpnam
#define wxUngetc _tungetc
#define wxVfprintf _vftprintf
#define wxVprintf _vtprintf
#define wxVsscanf _vstscanf
#define wxVsprintf _vstprintf
/* special case: not all TCHAR-aware compilers have those */
#if defined(__VISUALC__) || \
(defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
#define wxVsnprintf_ _vsntprintf
#define wxSnprintf_ _sntprintf
#endif
/* special case: these functions are missing under Win9x with Unicows so we */
/* have to implement them ourselves */
#if wxUSE_UNICODE_MSLU
#define wxRemove wxMSLU__tremove
#define wxRename wxMSLU__trename
#else
#ifdef __WXWINCE__
/* carefully: wxRemove() must return 0 on success while DeleteFile()
returns 0 on error, so don't just define one as the other */
int wxRemove(const wxChar *path);
#else
#define wxRemove _tremove
#define wxRename _trename
#endif
#endif
/* stdlib.h functions */
#define wxAtoi _ttoi
#define wxAtol _ttol
/* #define wxAtof _tttof -- notice that there is no such thing (why?) */
/* there are no env vars at all under CE, so no _tgetenv neither */
#ifdef __WXWINCE__
/* can't define as inline function as this is a C file... */
#define wxGetenv(name) ((wxChar *)NULL)
#else
#define wxGetenv _tgetenv
#endif
#define wxSystem _tsystem
/* time.h functions */
#define wxAsctime _tasctime
#define wxCtime _tctime
#define wxMbstowcs mbstowcs
#define wxWcstombs wcstombs
#else /* !TCHAR-aware compilers */
/*
There are 2 unrelated problems with these functions under Mac:
a) Metrowerks MSL CRT implements them strictly in C99 sense and
doesn't support (very common) extension of allowing to call
mbstowcs(NULL, ...) which makes it pretty useless as you can't
know the size of the needed buffer
b) OS X <= 10.2 declares and even defined these functions but
doesn't really implement them -- they always return an error
So use our own replacements in both cases.
*/
#if defined(__MWERKS__) && defined(__MSL__)
#define wxNEED_WX_MBSTOWCS
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?