X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/73f507f52d91365eb93c085c25fe573e84cc1075..6493aacaeb7b22b9fa35c559f7753e9fec0da71f:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index cded294536..aa039f976b 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -39,10 +39,6 @@ #include #include -#ifndef __WXMSW__ -#include -#endif - #ifdef __SALFORDC__ #include #endif @@ -365,8 +361,8 @@ bool wxStringBase::Alloc(size_t nLen) if ( pData->IsEmpty() ) { nLen += EXTRA_ALLOC; - wxStringData* pData = (wxStringData*) - malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); + pData = (wxStringData *) + malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); if ( pData == NULL ) { // allocation failure handled by caller @@ -435,35 +431,35 @@ wxStringBase::iterator wxStringBase::erase(iterator it) wxStringBase& wxStringBase::erase(size_t nStart, size_t nLen) { - wxASSERT(nStart <= length()); - size_t strLen = length() - nStart; - // delete nLen or up to the end of the string characters - nLen = strLen < nLen ? strLen : nLen; - wxString strTmp(c_str(), nStart); - strTmp.append(c_str() + nStart + nLen, length() - nStart - nLen); + wxASSERT(nStart <= length()); + size_t strLen = length() - nStart; + // delete nLen or up to the end of the string characters + nLen = strLen < nLen ? strLen : nLen; + wxString strTmp(c_str(), nStart); + strTmp.append(c_str() + nStart + nLen, length() - nStart - nLen); - swap(strTmp); - return *this; + swap(strTmp); + return *this; } wxStringBase& wxStringBase::insert(size_t nPos, const wxChar *sz, size_t n) { - wxASSERT( nPos <= length() ); + wxASSERT( nPos <= length() ); - if ( n == npos ) n = wxStrlen(sz); - if ( n == 0 ) return *this; + if ( n == npos ) n = wxStrlen(sz); + if ( n == 0 ) return *this; - if ( !Alloc(length() + n) || !CopyBeforeWrite() ) { - wxFAIL_MSG( _T("out of memory in wxStringBase::insert") ); - } + if ( !Alloc(length() + n) || !CopyBeforeWrite() ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::insert") ); + } - memmove(m_pchData + nPos + n, m_pchData + nPos, - (length() - nPos) * sizeof(wxChar)); - memcpy(m_pchData + nPos, sz, n * sizeof(wxChar)); - GetStringData()->nDataLength = length() + n; - m_pchData[length()] = '\0'; + memmove(m_pchData + nPos + n, m_pchData + nPos, + (length() - nPos) * sizeof(wxChar)); + memcpy(m_pchData + nPos, sz, n * sizeof(wxChar)); + GetStringData()->nDataLength = length() + n; + m_pchData[length()] = '\0'; - return *this; + return *this; } void wxStringBase::swap(wxStringBase& str) @@ -475,50 +471,50 @@ void wxStringBase::swap(wxStringBase& str) size_t wxStringBase::find(const wxStringBase& str, size_t nStart) const { - wxASSERT( str.GetStringData()->IsValid() ); - wxASSERT( nStart <= length() ); + wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT( nStart <= length() ); - //anchor - const wxChar* p = (const wxChar*)wxTmemchr(c_str() + nStart, - str.c_str()[0], - length() - nStart); + //anchor + const wxChar* p = (const wxChar*)wxTmemchr(c_str() + nStart, + str.c_str()[0], + length() - nStart); - if(!p) - return npos; + if(!p) + return npos; - while(p - c_str() + str.length() <= length() && - wxTmemcmp(p, str.c_str(), str.length()) ) - { - //Previosly passed as the first argument to wxTmemchr, - //but C/C++ standard does not specify evaluation order - //of arguments to functions - - //http://embedded.com/showArticle.jhtml?articleID=9900607 - ++p; - - //anchor again - p = (const wxChar*)wxTmemchr(p, - str.c_str()[0], - length() - (p - c_str())); - - if(!p) - return npos; - } + while(p - c_str() + str.length() <= length() && + wxTmemcmp(p, str.c_str(), str.length()) ) + { + //Previosly passed as the first argument to wxTmemchr, + //but C/C++ standard does not specify evaluation order + //of arguments to functions - + //http://embedded.com/showArticle.jhtml?articleID=9900607 + ++p; - return (p - c_str() + str.length() <= length()) ? p - c_str() : npos; + //anchor again + p = (const wxChar*)wxTmemchr(p, + str.c_str()[0], + length() - (p - c_str())); + + if(!p) + return npos; + } + + return (p - c_str() + str.length() <= length()) ? p - c_str() : npos; } size_t wxStringBase::find(const wxChar* sz, size_t nStart, size_t n) const { - return find(wxStringBase(sz, n), nStart); + return find(wxStringBase(sz, n), nStart); } size_t wxStringBase::find(wxChar ch, size_t nStart) const { - wxASSERT( nStart <= length() ); + wxASSERT( nStart <= length() ); - const wxChar *p = (const wxChar*)wxTmemchr(c_str() + nStart, ch, length() - nStart); + const wxChar *p = (const wxChar*)wxTmemchr(c_str() + nStart, ch, length() - nStart); - return p == NULL ? npos : p - c_str(); + return p == NULL ? npos : p - c_str(); } size_t wxStringBase::rfind(const wxStringBase& str, size_t nStart) const @@ -1010,114 +1006,58 @@ int STRINGCLASS::compare(size_t nStart, size_t nLen, #if wxUSE_UNICODE // from multibyte string -wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength) +wxString::wxString(const char *psz, const wxMBConv& conv, size_t nLength) { - // if nLength != npos, then we have to make a NULL-terminated copy - // of first nLength bytes of psz first because the input buffer to MB2WC - // must always be NULL-terminated: - wxCharBuffer inBuf((const char *)NULL); - if (nLength != npos) - { - wxASSERT( psz != NULL ); - wxCharBuffer tmp(nLength); - memcpy(tmp.data(), psz, nLength); - tmp.data()[nLength] = '\0'; - inBuf = tmp; - psz = inBuf.data(); - } - - // first get the size of the buffer we need - size_t nLen; - if ( psz ) - { - // calculate the needed size ourselves or use the provided one - if (nLength == npos) - nLen = strlen(psz); - else - nLen = nLength; - } - else - { - // nothing to convert - nLen = 0; - } - - // anything to do? - if ( (nLen != 0) && (nLen != (size_t)-1) ) + if ( psz && nLength != 0 ) { - //Convert string - size_t nRealSize; - wxWCharBuffer theBuffer = conv.cMB2WC(psz, nLen, &nRealSize); + if ( nLength == npos ) + { + nLength = wxNO_LEN; + } - //Copy - if (nRealSize) - assign( theBuffer.data() , nRealSize - 1 ); + size_t nLenWide; + wxWCharBuffer wbuf = conv.cMB2WC(psz, nLength, &nLenWide); + + if ( nLenWide ) + assign(wbuf, nLenWide); } } //Convert wxString in Unicode mode to a multi-byte string -const wxCharBuffer wxString::mb_str(wxMBConv& conv) const +const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const { - size_t dwOutSize; - return conv.cWC2MB(c_str(), length(), &dwOutSize); + return conv.cWC2MB(c_str(), length() + 1 /* size, not length */, NULL); } #else // ANSI #if wxUSE_WCHAR_T + // from wide string -wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength) +wxString::wxString(const wchar_t *pwz, const wxMBConv& conv, size_t nLength) { - // if nLength != npos, then we have to make a NULL-terminated copy - // of first nLength chars of psz first because the input buffer to WC2MB - // must always be NULL-terminated: - wxWCharBuffer inBuf((const wchar_t *)NULL); - if (nLength != npos) - { - wxASSERT( pwz != NULL ); - wxWCharBuffer tmp(nLength); - memcpy(tmp.data(), pwz, nLength * sizeof(wchar_t)); - tmp.data()[nLength] = '\0'; - inBuf = tmp; - pwz = inBuf.data(); - } - - // first get the size of the buffer we need - size_t nLen; - if ( pwz ) - { - // calculate the needed size ourselves or use the provided one - if (nLength == npos) - nLen = wxWcslen(pwz); - else - nLen = nLength; - } - else - { - // nothing to convert - nLen = 0; - } - // anything to do? - if ( (nLen != 0) && (nLen != (size_t)-1) ) + if ( pwz && nLength != 0 ) { - //Convert string - size_t nRealSize; - wxCharBuffer theBuffer = conv.cWC2MB(pwz, nLen, &nRealSize); + if ( nLength == npos ) + { + nLength = wxNO_LEN; + } + + size_t nLenMB; + wxCharBuffer buf = conv.cWC2MB(pwz, nLength, &nLenMB); - //Copy - if (nRealSize) - assign( theBuffer.data() , nRealSize - 1 ); + if ( nLenMB ) + assign(buf, nLenMB); } } //Converts this string to a wide character string if unicode //mode is not enabled and wxUSE_WCHAR_T is enabled -const wxWCharBuffer wxString::wc_str(wxMBConv& conv) const +const wxWCharBuffer wxString::wc_str(const wxMBConv& conv) const { - size_t dwOutSize; - return conv.cMB2WC(c_str(), length(), &dwOutSize); + return conv.cMB2WC(c_str(), length() + 1 /* size, not length */, NULL); } #endif // wxUSE_WCHAR_T @@ -1817,7 +1757,7 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) for ( ;; ) { wxStringBuffer tmp(*this, size + 1); - wxChar* buf = tmp; + wxChar *buf = tmp; if ( !buf ) { @@ -1839,25 +1779,21 @@ 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 - if ( len >= 0 && len <= size ) + // buffer were large enough (newer standards such as Unix98) + if ( len < 0 ) { - // ok, there was enough space - break; + // still not enough, as we don't know how much we need, double the + // current size of the buffer + size *= 2; } - -#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 ) + else if ( len > size ) + { + size = len; + } + else // ok, there was enough space { - // no sense in continuing break; } -#endif // EOVERFLOW - - // still not enough, double it again - size *= 2; } // we could have overshot @@ -2497,7 +2433,11 @@ void wxArrayString::Sort(CompareFunction compareFunction) END_SORT(); } -typedef int (wxC_CALLING_CONV * wxStringCompareFn)(const void *first, const void *second); +extern "C" +{ + typedef int (wxC_CALLING_CONV * wxStringCompareFn)(const void *first, + const void *second); +} void wxArrayString::Sort(CompareFunction2 compareFunction) {