X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b7a5d6ca90e80cd842c448b8673b4164848ef1a5..53920141b504db01a5af56b5b16fd0b4a251031b:/src/common/wxchar.cpp diff --git a/src/common/wxchar.cpp b/src/common/wxchar.cpp index 85c6bfc716..f95e5d6c8f 100644 --- a/src/common/wxchar.cpp +++ b/src/common/wxchar.cpp @@ -24,6 +24,10 @@ #pragma hdrstop #endif +#define _ISOC9X_SOURCE 1 // to get vsscanf() +#define _BSD_SOURCE 1 // to still get strdup() + +#include #include #include #include @@ -35,9 +39,14 @@ #include "wx/hash.h" #endif -size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) +#if wxUSE_WCHAR_T +size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t n) { if (buf) { + if (!n || !*psz) { + if (n) *buf = _T('\0'); + return 0; + } return mbstowcs(buf, psz, n); } @@ -53,9 +62,14 @@ size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) #endif // GNU } -size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n) +size_t WXDLLEXPORT wxWC2MB(char *buf, const wchar_t *pwz, size_t n) { if (buf) { + if (!n || !*pwz) { + // glibc2.1 chokes on null input + if (n) *buf = '\0'; + return 0; + } return wcstombs(buf, pwz, n); } @@ -70,6 +84,36 @@ size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n) return wcstombs((char *) NULL, pwz, 0); #endif // GNU } +#endif + +bool WXDLLEXPORT wxOKlibc() +{ +#if wxUSE_WCHAR_T && defined(__UNIX__) && defined(__GLIBC__) + // GNU libc uses UTF-8 even when it shouldn't + wchar_t res; + if ((MB_CUR_MAX == 2) && + (wxMB2WC(&res, "\xdd\xa5", 1)>0) && + (res==0x765)) { + // this is UTF-8 allright, check whether that's what we want + char *cur_locale = setlocale(LC_ALL, NULL); + if ((strlen(cur_locale) < 4) || + (strcasecmp(cur_locale + strlen(cur_locale) - 4, "utf8"))) { + // nope, don't use libc conversion + return FALSE; + } + } +#endif + return TRUE; +} + +#ifdef wxNEED_WCSLEN +size_t WXDLLEXPORT wcslen(const wchar_t *s) +{ + size_t len; + while (s[len]) len++; + return len; +} +#endif #ifndef wxStrdup wxChar * WXDLLEXPORT wxStrdup(const wxChar *psz) @@ -81,6 +125,18 @@ wxChar * WXDLLEXPORT wxStrdup(const wxChar *psz) } #endif +#ifndef wxStricmp +int WXDLLEXPORT wxStricmp(const wxChar *psz1, const wxChar *psz2) +{ + register wxChar c1, c2; + do { + c1 = wxTolower(*psz1++); + c2 = wxTolower(*psz2++); + } while ( c1 && (c1 == c2) ); + return c1 - c2; +} +#endif + #ifndef wxStrtok wxChar * WXDLLEXPORT wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr) { @@ -111,6 +167,44 @@ wxChar * WXDLLEXPORT wxSetlocale(int category, const wxChar *locale) #endif #ifdef wxNEED_WX_STDIO_H +int WXDLLEXPORT wxPrintf(const wxChar *fmt, ...) +{ + va_list argptr; + int ret; + + va_start(argptr, fmt); + ret = wxVprintf(fmt, argptr); + va_end(argptr); + return ret; +} + +int WXDLLEXPORT wxVprintf(const wxChar *fmt, va_list argptr) +{ + wxString str; + str.PrintfV(fmt,argptr); + printf("%s", (const char*)str.mb_str()); + return str.Len(); +} + +int WXDLLEXPORT wxFprintf(FILE *stream, const wxChar *fmt, ...) +{ + va_list argptr; + int ret; + + va_start(argptr, fmt); + ret = wxVfprintf(stream, fmt, argptr); + va_end(argptr); + return ret; +} + +int WXDLLEXPORT wxVfprintf(FILE *stream, const wxChar *fmt, va_list argptr) +{ + wxString str; + str.PrintfV(fmt,argptr); + fprintf(stream, "%s", (const char*)str.mb_str()); + return str.Len(); +} + int WXDLLEXPORT wxSprintf(wxChar *buf, const wxChar *fmt, ...) { va_list argptr; @@ -131,6 +225,26 @@ int WXDLLEXPORT wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr) wxStrcpy(buf,str.c_str()); return str.Len(); } + +int WXDLLEXPORT wxSscanf(const wxChar *buf, const wxChar *fmt, ...) +{ + va_list argptr; + int ret; + + va_start(argptr, fmt); + ret = wxVsscanf(buf, fmt, argptr); + va_end(argptr); + return ret; +} + +int WXDLLEXPORT wxVsscanf(const wxChar *buf, const wxChar *fmt, va_list argptr) +{ + int ret; + // this will work only for numeric conversion! Strings will not be converted correctly + // hopefully this is all we'll need + ret = vsscanf(wxConv_libc.cWX2MB(buf), wxConv_libc.cWX2MB(fmt), argptr); + return ret; +} #endif #ifndef wxAtof