X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4fdfe2f3ae110c1f1ba2d925749cac5b761eff4b..66e2ba91b27a5867ef46cc16049c2a7c61c811f1:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index d36f85bd5a..d0a6a44569 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -407,7 +407,7 @@ const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const if ( !wcLen ) return wxCharBuffer(""); - return conv.cWC2MB(wcBuf, wcLen, NULL); + return conv.cWC2MB(wcBuf, wcLen+1, NULL); } #else // ANSI @@ -986,7 +986,7 @@ wxString wxString::FromAscii(const char *ascii, size_t len) wxString res; { - wxImplStringBuffer buf(res, len); + wxStringInternalBuffer buf(res, len); wxStringCharType *dest = buf; for ( ; len > 0; --len ) @@ -1007,7 +1007,7 @@ wxString wxString::FromAscii(const char *ascii) return FromAscii(ascii, wxStrlen(ascii)); } -wxString wxString::FromAscii(const char ascii) +wxString wxString::FromAscii(char ascii) { // What do we do with '\0' ? @@ -1391,49 +1391,46 @@ int wxString::Find(wxUniChar ch, bool bFromEnd) const // it out. Note that number extraction works correctly on UTF-8 strings, so // we can use wxStringCharType and wx_str() for maximum efficiency. -template -bool wxStringToIntType(const wxStringCharType *start, - T *val, - int base, - T (*func)(const wxStringCharType*, wxStringCharType**, int)) -{ - wxCHECK_MSG( val, false, _T("NULL output pointer") ); - wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); - #ifndef __WXWINCE__ - errno = 0; + #define DO_IF_NOT_WINCE(x) x +#else + #define DO_IF_NOT_WINCE(x) #endif - wxStringCharType *end; - *val = (*func)(start, &end, base); - - // return true only if scan was stopped by the terminating NUL and if the - // string was not empty to start with and no under/overflow occurred - return !*end && (end != start) -#ifndef __WXWINCE__ - && (errno != ERANGE) -#endif - ; -} +#define WX_STRING_TO_INT_TYPE(val, base, func) \ + wxCHECK_MSG( val, false, _T("NULL output pointer") ); \ + wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); \ + \ + DO_IF_NOT_WINCE( errno = 0; ) \ + \ + const wxStringCharType *start = wx_str(); \ + wxStringCharType *end; \ + *val = func(start, &end, base); \ + \ + /* return true only if scan was stopped by the terminating NUL and */ \ + /* if the string was not empty to start with and no under/overflow */ \ + /* occurred: */ \ + return !*end && (end != start) \ + DO_IF_NOT_WINCE( && (errno != ERANGE) ) bool wxString::ToLong(long *val, int base) const { - return wxStringToIntType(wx_str(), val, base, wxStrtol); + WX_STRING_TO_INT_TYPE(val, base, wxStrtol); } bool wxString::ToULong(unsigned long *val, int base) const { - return wxStringToIntType(wx_str(), val, base, wxStrtoul); + WX_STRING_TO_INT_TYPE(val, base, wxStrtoul); } bool wxString::ToLongLong(wxLongLong_t *val, int base) const { - return wxStringToIntType(wx_str(), val, base, wxStrtoll); + WX_STRING_TO_INT_TYPE(val, base, wxStrtoll); } bool wxString::ToULongLong(wxULongLong_t *val, int base) const { - return wxStringToIntType(wx_str(), val, base, wxStrtoull); + WX_STRING_TO_INT_TYPE(val, base, wxStrtoull); } bool wxString::ToDouble(double *val) const @@ -1644,7 +1641,7 @@ int wxString::PrintfV(const wxString& format, va_list argptr) #if wxUSE_STL_BASED_WXSTRING typedef wxStringTypeBuffer Utf8Buffer; #else - typedef wxImplStringBuffer Utf8Buffer; + typedef wxStringInternalBuffer Utf8Buffer; #endif #endif @@ -1832,3 +1829,32 @@ wxString wxString::Upper() const // convert to lower case, return the copy of the string wxString wxString::Lower() const { wxString s(*this); return s.MakeLower(); } + +// ---------------------------------------------------------------------------- +// wxUTF8StringBuffer +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE_WCHAR +wxUTF8StringBuffer::~wxUTF8StringBuffer() +{ + wxMBConvStrictUTF8 conv; + size_t wlen = conv.ToWChar(NULL, 0, m_buf); + wxCHECK_RET( wlen != wxCONV_FAILED, "invalid UTF-8 data in string buffer?" ); + + wxStringInternalBuffer wbuf(m_str, wlen); + conv.ToWChar(wbuf, wlen, m_buf); +} + +wxUTF8StringBufferLength::~wxUTF8StringBufferLength() +{ + wxCHECK_RET(m_lenSet, "length not set"); + + wxMBConvStrictUTF8 conv; + size_t wlen = conv.ToWChar(NULL, 0, m_buf, m_len); + wxCHECK_RET( wlen != wxCONV_FAILED, "invalid UTF-8 data in string buffer?" ); + + wxStringInternalBufferLength wbuf(m_str, wlen); + conv.ToWChar(wbuf, wlen, m_buf, m_len); + wbuf.SetLength(wlen); +} +#endif // wxUSE_UNICODE_WCHAR