X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2df0258e2b2925ff664f6bcbe241f6007f760046..66e9a9f0ae9cccd52b1a8f9828a3e054803fefb6:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index bd9857e5cc..cded294536 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -131,8 +131,12 @@ wxSTD istream& operator>>(wxSTD istream& is, wxString& WXUNUSED(str)) wxSTD ostream& operator<<(wxSTD ostream& os, const wxString& str) { - os << str.c_str(); - return os; +#ifdef __BORLANDC__ + os << str.mb_str(); +#else + os << str.c_str(); +#endif + return os; } #endif // wxUSE_STD_IOSTREAM @@ -744,7 +748,7 @@ wxStringBase& wxStringBase::replace(size_t nStart, size_t nLen, //do it manually because this string can contain null characters for(size_t i1 = 0; i1 < nStart; ++i1) strTmp.append(1, this->c_str()[i1]); - + //its safe to do the full version here because //sz must be a normal c string strTmp.append(sz); @@ -1393,32 +1397,33 @@ const wxCharBuffer wxString::ToAscii() const // extract string of length nCount starting at nFirst wxString wxString::Mid(size_t nFirst, size_t nCount) const { - size_t nLen = length(); + size_t nLen = length(); - // default value of nCount is npos and means "till the end" - if ( nCount == npos ) - { - nCount = nLen - nFirst; - } + // default value of nCount is npos and means "till the end" + if ( nCount == npos ) + { + nCount = nLen - nFirst; + } - // out-of-bounds requests return sensible things - if ( nFirst + nCount > nLen ) - { - nCount = nLen - nFirst; - } + // out-of-bounds requests return sensible things + if ( nFirst + nCount > nLen ) + { + nCount = nLen - nFirst; + } - if ( nFirst > nLen ) - { - // AllocCopy() will return empty string - nCount = 0; - } + if ( nFirst > nLen ) + { + // AllocCopy() will return empty string + return wxEmptyString; + } - wxString dest(*this, nFirst, nCount); - if ( dest.length() != nCount ) { - wxFAIL_MSG( _T("out of memory in wxString::Mid") ); - } + wxString dest(*this, nFirst, nCount); + if ( dest.length() != nCount ) + { + wxFAIL_MSG( _T("out of memory in wxString::Mid") ); + } - return dest; + return dest; } // check that the string starts with prefix and return the rest of the string @@ -1524,7 +1529,7 @@ wxString wxString::AfterFirst(wxChar ch) const } // replace first (or all) occurences of some substring with another one -size_t wxString::Replace(const wxChar *szOld, +size_t wxString::Replace(const wxChar *szOld, const wxChar *szNew, bool bReplaceAll) { // if we tried to replace an empty string we'd enter an infinite loop below @@ -1538,15 +1543,15 @@ size_t wxString::Replace(const wxChar *szOld, size_t dwPos = 0; - while ( this->c_str()[dwPos] != wxT('\0') ) + while ( this->c_str()[dwPos] != wxT('\0') ) { //DO NOT USE STRSTR HERE //this string can contain embedded null characters, //so strstr will function incorrectly dwPos = find(szOld, dwPos); - if ( dwPos == npos ) + if ( dwPos == npos ) break; // exit the loop - else + else { //replace this occurance of the old string with the new one replace(dwPos, uiOldLen, szNew, uiNewLen); @@ -1556,9 +1561,9 @@ size_t wxString::Replace(const wxChar *szOld, //increase replace count ++uiCount; - + // stop now? - if ( !bReplaceAll ) + if ( !bReplaceAll ) break; // exit the loop } } @@ -1835,20 +1840,22 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) // vsnprintf() may return either -1 (traditional Unix behaviour) or the // total number of characters which would have been written if the // buffer were large enough - // also, it may return an errno may be something like EILSEQ, - // in which case we need to break out - if ( (len >= 0 && len <= size) - // No EOVERFLOW on Windows nor Palm 6.0 nor OpenVMS nor MacOS (not X) - // not OS/2 (not Innotek libc). -#if !defined(__WXMSW__) && !defined(__WXPALMOS__) && !defined( __VMS ) && !(defined(__WXMAC__) && !defined(__WXMAC_OSX__)) && !(defined(__EMX__) && !defined(__INNOTEK_LIBC__)) - || errno != EOVERFLOW -#endif - ) + if ( len >= 0 && len <= size ) { // ok, there was enough space break; } +#ifdef EOVERFLOW + // if the error is not due to not having enough space (it could be e.g. + // EILSEQ), break too -- we'd just eat all available memory uselessly + if ( errno != EOVERFLOW ) + { + // no sense in continuing + break; + } +#endif // EOVERFLOW + // still not enough, double it again size *= 2; }