From c3543d4f39c5e551418bfdfe478b73066403e4db Mon Sep 17 00:00:00 2001 From: Mariano Reingart Date: Wed, 11 Feb 2015 06:12:33 +0000 Subject: [PATCH] Re-introduce private mbstowcs/wcstombs for wxQt-Android These functions are needed due Android NDK lacking wide character support, as wchar_t == char according to Android NDK bionic libc/include/wchar.h WARNING: They are minimally functional (provided provisorily until proper workaround is found, specially maybe using Qt built-in functionality). "Basically they produce complete garbage with non-ASCII characters" For more info see discussion in wx-dev list: https://groups.google.com/d/msg/wx-dev/71qtIFcujgM/Q-lbwl59vOIJ Thanks @seandepagnier (modified a bit the comments, added #warning and restructured #if blocks to be only specific for __ANDROID__) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/wxcrtbase.h | 11 ++++++++ src/common/wxcrt.cpp | 60 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/include/wx/wxcrtbase.h b/include/wx/wxcrtbase.h index 044759d4d3..c69a9482eb 100644 --- a/include/wx/wxcrtbase.h +++ b/include/wx/wxcrtbase.h @@ -647,8 +647,19 @@ WXDLLIMPEXP_BASE size_t wxCRT_StrftimeW(wchar_t *s, size_t max, #if defined(__WXQT__) && defined(__ANDROID__) #define wxNEED_WX_MBSTOWCS #undef HAVE_WCSRTOMBS + // TODO: use Qt built-in required functionality #endif +#if defined(wxNEED_WX_MBSTOWCS) && defined(__ANDROID__) + #warning "Custom mb/wchar conv. only works for ASCII, see Android NDK notes" + WXDLLIMPEXP_BASE size_t android_mbstowcs(wchar_t *, const char *, size_t); + WXDLLIMPEXP_BASE size_t android_wcstombs(char *, const wchar_t *, size_t); + #define wxMbstowcs android_mbstowcs + #define wxWcstombs android_wcstombs +#else + #define wxMbstowcs mbstowcs + #define wxWcstombs wcstombs +#endif /* ------------------------------------------------------------------------- diff --git a/src/common/wxcrt.cpp b/src/common/wxcrt.cpp index bd0515c477..0e49b8d351 100644 --- a/src/common/wxcrt.cpp +++ b/src/common/wxcrt.cpp @@ -89,7 +89,7 @@ WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) #ifdef HAVE_WCSRTOMBS return mbsrtowcs(buf, &psz, n, &mbstate); #else - return mbstowcs(buf, psz, n); + return wxMbstowcs(buf, psz, n); #endif } @@ -102,7 +102,7 @@ WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) #ifdef HAVE_WCSRTOMBS return mbsrtowcs(NULL, &psz, 0, &mbstate); #else - return mbstowcs(NULL, psz, 0); + return wxMbstowcs(NULL, psz, 0); #endif } @@ -122,14 +122,14 @@ WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n) #ifdef HAVE_WCSRTOMBS return wcsrtombs(buf, &pwz, n, &mbstate); #else - return wcstombs(buf, pwz, n); + return wxWcstombs(buf, pwz, n); #endif } #ifdef HAVE_WCSRTOMBS return wcsrtombs(NULL, &pwz, 0, &mbstate); #else - return wcstombs(NULL, pwz, 0); + return wxWcstombs(NULL, pwz, 0); #endif } @@ -1277,6 +1277,7 @@ int wxVsscanf(const wxCStrData& str, const wchar_t *format, va_list ap) // convert a byte at a time #ifdef __ANDROID__ + #define ANDROID_WCSTO_START \ int len = wcslen(nptr) + 1; \ char dst[len]; \ @@ -1313,4 +1314,53 @@ double android_wcstod(const wchar_t *nptr, wchar_t **endptr) double d = strtod(dst, &dstendp); ANDROID_WCSTO_END } -#endif + +#ifdef wxNEED_WX_MBSTOWCS + +WXDLLEXPORT size_t android_mbstowcs(wchar_t * out, const char * in, size_t outlen) +{ + if (!out) + { + size_t outsize = 0; + while(*in++) + outsize++; + return outsize; + } + + const char* origin = in; + + while (outlen-- && *in) + { + *out++ = (wchar_t) *in++; + } + + *out = '\0'; + + return in - origin; +} + +WXDLLEXPORT size_t android_wcstombs(char * out, const wchar_t * in, size_t outlen) +{ + if (!out) + { + size_t outsize = 0; + while(*in++) + outsize++; + return outsize; + } + + const wchar_t* origin = in; + + while (outlen-- && *in) + { + *out++ = (char) *in++; + } + + *out = '\0'; + + return in - origin; +} + +#endif // wxNEED_WX_MBSTOWCS + +#endif // __ANDROID__