X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/52de37c78f31bc03f8b96090932c7ce8c3907d29..d1b736b7968ceea4233f3fceecdb01173f68a9a3:/src/common/wxcrt.cpp diff --git a/src/common/wxcrt.cpp b/src/common/wxcrt.cpp index 585b77fc98..c36513f84c 100644 --- a/src/common/wxcrt.cpp +++ b/src/common/wxcrt.cpp @@ -20,7 +20,7 @@ #pragma hdrstop #endif -#include "wx/wxchar.h" +#include "wx/crt.h" #define _ISOC9X_SOURCE 1 // to get vsscanf() #define _BSD_SOURCE 1 // to still get strdup() @@ -43,13 +43,6 @@ #include "wx/log.h" #endif -#if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H) - #include - #include - #include - #include -#endif - #ifdef __WXWINCE__ // there is no errno.h under CE apparently #define wxSET_ERRNO(value) @@ -90,7 +83,7 @@ size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t n) // to just get the size of the needed buffer -- this is needed as otherwise // we have no idea about how much space we need and if the CRT doesn't // support it (the only currently known example being Metrowerks, see - // wx/wxchar.h) we don't use its mbstowcs() at all + // wx/crt.h) we don't use its mbstowcs() at all #ifdef HAVE_WCSRTOMBS return mbsrtowcs((wchar_t *) NULL, &psz, 0, &mbstate); #else @@ -336,11 +329,11 @@ static int vwprintf(const wchar_t *format, va_list argptr) class wxFormatConverter { public: - wxFormatConverter(const wxChar *format); + wxFormatConverter(const wchar_t *format); // notice that we only translated the string if m_fmtOrig == NULL (as set // by CopyAllBefore()), otherwise we should simply use the original format - operator const wxChar *() const + operator const wchar_t *() const { return m_fmtOrig ? m_fmtOrig : m_fmt.c_str(); } private: @@ -348,7 +341,7 @@ private: // copy if we are translating but doesn't do anything at all if we don't, // so we don't create the translated format string at all unless we really // need to (i.e. InsertFmtChar() is called) - wxChar CopyFmtChar(wxChar ch) + wchar_t CopyFmtChar(wchar_t ch) { if ( !m_fmtOrig ) { @@ -366,7 +359,7 @@ private: } // insert an extra character - void InsertFmtChar(wxChar ch) + void InsertFmtChar(wchar_t ch) { if ( m_fmtOrig ) { @@ -387,13 +380,13 @@ private: m_fmtOrig = NULL; } - static bool IsFlagChar(wxChar ch) + static bool IsFlagChar(wchar_t ch) { return ch == _T('-') || ch == _T('+') || ch == _T('0') || ch == _T(' ') || ch == _T('#'); } - void SkipDigits(const wxChar **ptpc) + void SkipDigits(const wchar_t **ptpc) { while ( **ptpc >= _T('0') && **ptpc <= _T('9') ) CopyFmtChar(*(*ptpc)++); @@ -403,13 +396,13 @@ private: wxString m_fmt; // the original format - const wxChar *m_fmtOrig; + const wchar_t *m_fmtOrig; // the number of characters already copied size_t m_nCopied; }; -wxFormatConverter::wxFormatConverter(const wxChar *format) +wxFormatConverter::wxFormatConverter(const wchar_t *format) { m_fmtOrig = format; m_nCopied = 0; @@ -503,7 +496,7 @@ wxFormatConverter::wxFormatConverter(const wxChar *format) #ifdef __WXDEBUG__ // For testing the format converter -wxString wxConvertFormat(const wxChar *format) +wxString wxConvertFormat(const wchar_t *format) { return wxString(wxFormatConverter(format)); } @@ -567,25 +560,6 @@ int wxCRT_VsnprintfW(wchar_t *str, size_t size, const wchar_t *format, va_list a } #endif // !wxCRT_VsnprintfW -// FIXME-UTF8: we only implement widechar version of vsnprintf() in wxprint.cpp, -// so this one has to convert the data for now -#ifndef wxCRT_VsnprintfA -int wxCRT_VsnprintfA(char *buf, size_t len, const char *format, va_list argptr) -{ - wxWCharBuffer wbuf(len); - int rt = wxCRT_VsnprintfW(wbuf.data(), len, - (const wchar_t*)wxConvLibc.cMB2WC(format), - argptr); - if ( rt < 0 || rt >= len ) - return rt; - - if ( wxConvLibc.FromWChar(buf, len, wbuf) == wxCONV_FAILED ) - return -1; - - return rt; -} -#endif // !wxCRT_VsnprintfA - #ifndef wxCRT_VsprintfW int wxCRT_VsprintfW( wchar_t *str, const wchar_t *format, va_list argptr ) { @@ -600,8 +574,16 @@ int wxCRT_ScanfW(const wchar_t *format, ...) va_list argptr; va_start(argptr, format); - int ret = vwscanf(wxFormatConverter(format), argptr); - +#ifdef __VMS +#if (__DECCXX_VER >= 70100000) && !defined(__STD_CFRONT) && !defined( __NONAMESPACE_STD ) + int ret = std::vwscanf(wxFormatConverter(format), argptr); +#else + int ret = vwscanf(wxFormatConverter(format), argptr); +#endif +#else + int ret = vwscanf(wxFormatConverter(format), argptr); +#endif + va_end(argptr); return ret; @@ -614,7 +596,15 @@ int wxCRT_SscanfW(const wchar_t *str, const wchar_t *format, ...) va_list argptr; va_start(argptr, format); - int ret = vswscanf(str, wxFormatConverter(format), argptr); +#ifdef __VMS +#if (__DECCXX_VER >= 70100000) && !defined(__STD_CFRONT) && !defined( __NONAMESPACE_STD ) + int ret = std::vswscanf(str, wxFormatConverter(format), argptr); +#else + int ret = vswscanf(str, wxFormatConverter(format), argptr); +#endif +#else + int ret = vswscanf(str, wxFormatConverter(format), argptr); +#endif va_end(argptr); @@ -627,7 +617,15 @@ int wxCRT_FscanfW(FILE *stream, const wchar_t *format, ...) { va_list argptr; va_start(argptr, format); - int ret = vfwscanf(stream, wxFormatConverter(format), argptr); +#ifdef __VMS +#if (__DECCXX_VER >= 70100000) && !defined(__STD_CFRONT) && !defined( __NONAMESPACE_STD ) + int ret = std::vfwscanf(stream, wxFormatConverter(format), argptr); +#else + int ret = vfwscanf(stream, wxFormatConverter(format), argptr); +#endif +#else + int ret = vfwscanf(stream, wxFormatConverter(format), argptr); +#endif va_end(argptr); @@ -638,7 +636,15 @@ int wxCRT_FscanfW(FILE *stream, const wchar_t *format, ...) #ifndef wxCRT_VsscanfW int wxCRT_VsscanfW(const wchar_t *str, const wchar_t *format, va_list argptr) { - return vswscanf(str, wxFormatConverter(format), argptr); +#ifdef __VMS +#if (__DECCXX_VER >= 70100000) && !defined(__STD_CFRONT) && !defined( __NONAMESPACE_STD ) + return std::vswscanf(str, wxFormatConverter(format), argptr); +#else + return vswscanf(str, wxFormatConverter(format), argptr); +#endif +#else + return vswscanf(str, wxFormatConverter(format), argptr); +#endif } #endif @@ -901,29 +907,6 @@ int wxVsnprintf(wchar_t *str, size_t size, const wxString& format, va_list argpt // ctype.h stuff (currently unused) // ---------------------------------------------------------------------------- -#if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H) -static inline WORD wxMSW_ctype(wchar_t ch) -{ - WORD ret; - GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, &ch, 1, &ret); - return ret; -} - -int wxCRT_IsalnumW(wchar_t ch) { return IsCharAlphaNumeric(ch); } -int wxCRT_IsalphaW(wchar_t ch) { return IsCharAlpha(ch); } -int wxCRT_IscntrlW(wchar_t ch) { return wxMSW_ctype(ch) & C1_CNTRL; } -int wxCRT_IsdigitW(wchar_t ch) { return wxMSW_ctype(ch) & C1_DIGIT; } -int wxCRT_IsgraphW(wchar_t ch) { return wxMSW_ctype(ch) & (C1_DIGIT|C1_PUNCT|C1_ALPHA); } -int wxCRT_IslowerW(wchar_t ch) { return IsCharLower(ch); } -int wxCRT_IsprintW(wchar_t ch) { return wxMSW_ctype(ch) & (C1_DIGIT|C1_SPACE|C1_PUNCT|C1_ALPHA); } -int wxCRT_IspunctW(wchar_t ch) { return wxMSW_ctype(ch) & C1_PUNCT; } -int wxCRT_IsspaceW(wchar_t ch) { return wxMSW_ctype(ch) & C1_SPACE; } -int wxCRT_IsupperW(wchar_t ch) { return IsCharUpper(ch); } -int wxCRT_IsxdigitW(wchar_t ch) { return wxMSW_ctype(ch) & C1_XDIGIT; } -int wxCRT_Tolower(wchar_t ch) { return (wchar_t)CharLower((LPTSTR)(ch)); } -int wxCRT_Toupper(wchar_t ch) { return (wchar_t)CharUpper((LPTSTR)(ch)); } -#endif - #ifdef wxNEED_WX_MBSTOWCS WXDLLEXPORT size_t wxMbstowcs (wchar_t * out, const char * in, size_t outlen) @@ -972,39 +955,6 @@ WXDLLEXPORT size_t wxWcstombs (char * out, const wchar_t * in, size_t outlen) #endif // wxNEED_WX_MBSTOWCS -#if defined(wxNEED_WX_CTYPE_H) - -#include - -#define cfalnumset CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric) -#define cfalphaset CFCharacterSetGetPredefined(kCFCharacterSetLetter) -#define cfcntrlset CFCharacterSetGetPredefined(kCFCharacterSetControl) -#define cfdigitset CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit) -//CFCharacterSetRef cfgraphset = kCFCharacterSetControl && !' ' -#define cflowerset CFCharacterSetGetPredefined(kCFCharacterSetLowercaseLetter) -//CFCharacterSetRef cfprintset = !kCFCharacterSetControl -#define cfpunctset CFCharacterSetGetPredefined(kCFCharacterSetPunctuation) -#define cfspaceset CFCharacterSetGetPredefined(kCFCharacterSetWhitespaceAndNewline) -#define cfupperset CFCharacterSetGetPredefined(kCFCharacterSetUppercaseLetter) - -int wxCRT_IsalnumW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfalnumset, ch); } -int wxCRT_IsalphaW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfalphaset, ch); } -int wxCRT_IscntrlW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfcntrlset, ch); } -int wxCRT_IsdigitW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfdigitset, ch); } -int wxCRT_IsgraphW(wchar_t ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch) && ch != ' '; } -int wxCRT_IslowerW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cflowerset, ch); } -int wxCRT_IsprintW(wchar_t ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch); } -int wxCRT_IspunctW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfpunctset, ch); } -int wxCRT_IsspaceW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfspaceset, ch); } -int wxCRT_IsupperW(wchar_t ch) { return CFCharacterSetIsCharacterMember(cfupperset, ch); } -int wxCRT_IsxdigitW(wchar_t ch) { return wxCRT_IsdigitW(ch) || (ch>='a' && ch<='f') || (ch>='A' && ch<='F'); } - -// FIXME: these are broken! -extern "C" int wxCRT_TolowerW(wchar_t ch) { return (wchar_t)tolower((char)(ch)); } -extern "C" int wxCRT_ToupperW(wchar_t ch) { return (wchar_t)toupper((char)(ch)); } - -#endif // wxNEED_WX_CTYPE_H - #ifndef wxCRT_StrdupA WXDLLEXPORT char *wxCRT_StrdupA(const char *s) { @@ -1078,51 +1028,10 @@ int WXDLLEXPORT wxCRT_StrnicmpW(const wchar_t *s1, const wchar_t *s2, size_t n) // string.h functions // ---------------------------------------------------------------------------- -#ifndef wxCRT_StrcatW -WXDLLEXPORT wchar_t *wxCRT_StrcatW(wchar_t *dest, const wchar_t *src) -{ - wchar_t *ret = dest; - while (*dest) dest++; - while ((*dest++ = *src++)); - return ret; -} -#endif - -#ifndef wxCRT_StrchrW -WXDLLEXPORT const wchar_t *wxCRT_StrchrW(const wchar_t *s, wchar_t c) -{ - // be careful here as the terminating NUL makes part of the string - while ( *s != c ) - { - if ( !*s++ ) - return NULL; - } - - return s; -} -#endif - -#ifndef wxCRT_StrcmpW -WXDLLEXPORT int wxCRT_StrcmpW(const wchar_t *s1, const wchar_t *s2) -{ - while ((*s1 == *s2) && *s1) s1++, s2++; - if ((wxUChar)*s1 < (wxUChar)*s2) return -1; - if ((wxUChar)*s1 > (wxUChar)*s2) return 1; - return 0; -} -#endif - -#ifndef wxCRT_StrcpyW -WXDLLEXPORT wchar_t * wxCRT_StrcpyW(wchar_t *dest, const wchar_t *src) -{ - wchar_t *ret = dest; - while ((*dest++ = *src++)); - return ret; -} -#endif - -template -static inline size_t wxCRT_DoStrlen(const T *s) +// this (and wxCRT_StrncmpW below) are extern "C" because they are needed +// by regex code, the rest isn't needed, so it's not declared as extern "C" +#ifndef wxCRT_StrlenW +extern "C" WXDLLEXPORT size_t wxCRT_StrlenW(const wchar_t *s) { size_t n = 0; while ( *s++ ) @@ -1130,175 +1039,11 @@ static inline size_t wxCRT_DoStrlen(const T *s) return n; } - -// these two (and wxCRT_StrncmpW below) are extern "C" because they are needed -// by regex code, the rest isn't needed, so it's not declared as extern "C" -#ifndef wxCRT_StrlenA -WXDLLEXPORT size_t wxCRT_StrlenA(const char *s) - { return wxCRT_DoStrlen(s); } -#endif -#ifndef wxCRT_StrlenW -extern "C" WXDLLEXPORT size_t wxCRT_StrlenW(const wchar_t *s) - { return wxCRT_DoStrlen(s); } #endif -#ifndef wxCRT_StrncatW -WXDLLEXPORT wchar_t * wxCRT_StrncatW(wchar_t *dest, const wchar_t *src, size_t n) -{ - wchar_t *ret = dest; - while (*dest) dest++; - while (n && (*dest++ = *src++)) n--; - return ret; -} -#endif - -#ifndef wxCRT_StrncmpW -extern "C" -WXDLLEXPORT int wxCRT_StrncmpW(const wchar_t *s1, const wchar_t *s2, size_t n) -{ - while (n && (*s1 == *s2) && *s1) n--, s1++, s2++; - if (n) { - if ((wxUChar)*s1 < (wxUChar)*s2) return -1; - if ((wxUChar)*s1 > (wxUChar)*s2) return 1; - } - return 0; -} -#endif - -#ifndef wxCRT_StrncpyW -WXDLLEXPORT wchar_t * wxCRT_StrncpyW(wchar_t *dest, const wchar_t *src, size_t n) -{ - wchar_t *ret = dest; - while (n && (*dest++ = *src++)) n--; - while (n) *dest++=0, n--; // the docs specify padding with zeroes - return ret; -} -#endif - -#ifndef wxCRT_StrpbrkW -WXDLLEXPORT const wchar_t * wxCRT_StrpbrkW(const wchar_t *s, const wchar_t *accept) -{ - while (*s && !wxCRT_Strchr(accept, *s)) - s++; - - return *s ? s : NULL; -} -#endif - -#ifndef wxCRT_StrrchrW -WXDLLEXPORT const wchar_t * wxCRT_StrrchrW(const wchar_t *s, wchar_t c) -{ - const wchar_t *ret = NULL; - do - { - if ( *s == c ) - ret = s; - s++; - } - while ( *s ); - - return ret; -} -#endif - -#ifndef wxCRT_StrspnW -WXDLLEXPORT size_t wxCRT_StrspnW(const wchar_t *s, const wchar_t *accept) -{ - size_t len = 0; - while (wxCRT_Strchr(accept, *s++)) len++; - return len; -} -#endif - -#ifndef wxCRT_StrstrW -WXDLLEXPORT const wchar_t *wxCRT_StrstrW(const wchar_t *haystack, const wchar_t *needle) -{ - wxASSERT_MSG( needle != NULL, _T("NULL argument in wxCRT_Strstr") ); - - // VZ: this is not exactly the most efficient string search algorithm... - - const size_t len = wxStrlen(needle); - - while ( const wchar_t *fnd = wxCRT_Strchr(haystack, *needle) ) - { - if ( !wxCRT_Strncmp(fnd, needle, len) ) - return fnd; - - haystack = fnd + 1; - } - - return NULL; -} -#endif - -#ifndef wxCRT_StrtodW -WXDLLEXPORT double wxCRT_StrtodW(const wchar_t *nptr, wchar_t **endptr) -{ - const wchar_t *start = nptr; - - // FIXME: only correct for C locale - while (wxIsspace(*nptr)) nptr++; - if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; - while (wxIsdigit(*nptr)) nptr++; - if (*nptr == wxT('.')) { - nptr++; - while (wxIsdigit(*nptr)) nptr++; - } - if (*nptr == wxT('E') || *nptr == wxT('e')) { - nptr++; - if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; - while (wxIsdigit(*nptr)) nptr++; - } - - wxString data(nptr, nptr-start); - wxWX2MBbuf dat = data.mb_str(wxConvLibc); - char *rdat = wxMBSTRINGCAST dat; - double ret = strtod(dat, &rdat); - - if (endptr) *endptr = (wchar_t *)(start + (rdat - (const char *)dat)); - - return ret; -} -#endif // !wxCRT_StrtodW - -#ifndef wxCRT_StrtolW -WXDLLEXPORT long int wxCRT_StrtolW(const wchar_t *nptr, wchar_t **endptr, int base) -{ - const wchar_t *start = nptr; - - // FIXME: only correct for C locale - while (wxIsspace(*nptr)) nptr++; - if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; - if (((base == 0) || (base == 16)) && - (nptr[0] == wxT('0') && nptr[1] == wxT('x'))) { - nptr += 2; - base = 16; - } - else if ((base == 0) && (nptr[0] == wxT('0'))) base = 8; - else if (base == 0) base = 10; - - while ((wxIsdigit(*nptr) && (*nptr - wxT('0') < base)) || - (wxIsalpha(*nptr) && (wxToupper(*nptr) - wxT('A') + 10 < base))) nptr++; - - wxString data(start, nptr-start); - wxWX2MBbuf dat = data.mb_str(wxConvLibc); - char *rdat = wxMBSTRINGCAST dat; - long int ret = strtol(dat, &rdat, base); - - if (endptr) *endptr = (wchar_t *)(start + (rdat - (const char *)dat)); - - return ret; -} -#endif // !wxCRT_StrtolW - -#ifndef wxCRT_StrtoulW -WXDLLEXPORT unsigned long int wxCRT_StrtoulW(const wchar_t *nptr, wchar_t **endptr, int base) -{ - return (unsigned long int) wxCRT_StrtolW(nptr, endptr, base); -} -#endif - - +// ---------------------------------------------------------------------------- +// stdlib.h functions +// ---------------------------------------------------------------------------- #ifndef wxCRT_GetenvW wchar_t* WXDLLEXPORT wxCRT_GetenvW(const wchar_t *name) @@ -1306,8 +1051,8 @@ wchar_t* WXDLLEXPORT wxCRT_GetenvW(const wchar_t *name) // NB: buffer returned by getenv() is allowed to be overwritten next // time getenv() is called, so it is OK to use static string // buffer to hold the data. - static wxWCharBuffer value((wxChar*)NULL); - value = wxConvLibc.cMB2WX(getenv(wxConvLibc.cWX2MB(name))); + static wxWCharBuffer value((wchar_t*)NULL); + value = wxConvLibc.cMB2WC(getenv(wxConvLibc.cWC2MB(name))); return value.data(); } #endif // !wxCRT_GetenvW @@ -1656,23 +1401,25 @@ void wxUpdateLocaleIsUtf8() // ============================================================================ #if wxUSE_UNICODE_WCHAR - #define CALL_ANSI_OR_UNICODE(callA, callW) return callW + #define CALL_ANSI_OR_UNICODE(return_kw, callA, callW) return_kw callW #elif wxUSE_UNICODE_UTF8 && !wxUSE_UTF8_LOCALE_ONLY - #define CALL_ANSI_OR_UNICODE(callA, callW) \ - return wxLocaleIsUtf8 ? callA : callW + #define CALL_ANSI_OR_UNICODE(return_kw, callA, callW) \ + return_kw wxLocaleIsUtf8 ? callA : callW #else // ANSI or UTF8 only - #define CALL_ANSI_OR_UNICODE(callA, callW) return callA + #define CALL_ANSI_OR_UNICODE(return_kw, callA, callW) return_kw callA #endif int wxPuts(const wxString& s) { - CALL_ANSI_OR_UNICODE(wxCRT_PutsA(s.mb_str()), + CALL_ANSI_OR_UNICODE(return, + wxCRT_PutsA(s.mb_str()), wxCRT_PutsW(s.wc_str())); } int wxFputs(const wxString& s, FILE *stream) { - CALL_ANSI_OR_UNICODE(wxCRT_FputsA(s.mb_str(), stream), + CALL_ANSI_OR_UNICODE(return, + wxCRT_FputsA(s.mb_str(), stream), wxCRT_FputsW(s.wc_str(), stream)); } @@ -1681,7 +1428,8 @@ int wxFputc(const wxUniChar& c, FILE *stream) #if !wxUSE_UNICODE // FIXME-UTF8: temporary, remove this with ANSI build return wxCRT_FputcA((char)c, stream); #else - CALL_ANSI_OR_UNICODE(wxCRT_FputsA(c.AsUTF8(), stream), + CALL_ANSI_OR_UNICODE(return, + wxCRT_FputsA(c.AsUTF8(), stream), wxCRT_FputcW((wchar_t)c, stream)); #endif } @@ -1689,7 +1437,9 @@ int wxFputc(const wxUniChar& c, FILE *stream) void wxPerror(const wxString& s) { #ifdef wxCRT_PerrorW - CALL_ANSI_OR_UNICODE(wxCRT_PerrorA(s.mb_str()), wxCRT_PerrorW(s.wc_str())); + CALL_ANSI_OR_UNICODE(wxEMPTY_PARAMETER_VALUE, + wxCRT_PerrorA(s.mb_str()), + wxCRT_PerrorW(s.wc_str())); #else wxCRT_PerrorA(s.mb_str()); #endif