X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9f96b16267a51aadbb9c388f5c3bc028fd9e9387..24b9f055150de329d1fb61df5ce8d14e6d657cd0:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index b0550b816f..902b9a5af7 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -86,10 +86,10 @@ static const struct } g_strEmpty = { {-1, 0, 0}, wxT('\0') }; #if defined(__VISAGECPP__) && __IBMCPP__ >= 400 -// must define this static for VA or else you get multiply defined symbols everywhere +// must define this static for VA or else you get multiply defined symbols +// everywhere const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100; - -#endif +#endif // Visual Age // empty C style string: points to 'string data' byte of g_strEmpty extern const wxChar WXDLLEXPORT *wxEmptyString = &g_strEmpty.dummy; @@ -153,7 +153,7 @@ extern const wxChar WXDLLEXPORT *wxEmptyString = &g_strEmpty.dummy; // // ATTN: you can _not_ use both of these in the same program! -istream& operator>>(istream& is, wxString& WXUNUSED(str)) +wxSTD istream& operator>>(wxSTD istream& is, wxString& WXUNUSED(str)) { #if 0 int w = is.width(0); @@ -184,7 +184,7 @@ istream& operator>>(istream& is, wxString& WXUNUSED(str)) return is; } -ostream& operator<<(ostream& os, const wxString& str) +wxSTD ostream& operator<<(wxSTD ostream& os, const wxString& str) { os << str.c_str(); return os; @@ -201,7 +201,8 @@ extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, int iLen = s.PrintfV(format, argptr); if ( iLen != -1 ) { - wxStrncpy(buf, s.c_str(), iLen); + wxStrncpy(buf, s.c_str(), len); + buf[len-1] = wxT('\0'); } return iLen; @@ -1455,21 +1456,34 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) // of them) bool wxString::Matches(const wxChar *pszMask) const { - // check char by char - const wxChar *pszTxt; - for ( pszTxt = c_str(); *pszMask != wxT('\0'); pszMask++, pszTxt++ ) { + // TODO: this is, of course, awfully inefficient... + + // the char currently being checked + const wxChar *pszTxt = c_str(); + + // the last location where '*' matched + const wxChar *pszLastStarInText = NULL; + const wxChar *pszLastStarInMask = NULL; + +match: + for ( ; *pszMask != wxT('\0'); pszMask++, pszTxt++ ) { switch ( *pszMask ) { case wxT('?'): if ( *pszTxt == wxT('\0') ) return FALSE; - // pszText and pszMask will be incremented in the loop statement + // pszTxt and pszMask will be incremented in the loop statement break; case wxT('*'): { + // remember where we started to be able to backtrack later + pszLastStarInText = pszTxt; + pszLastStarInMask = pszMask; + // ignore special chars immediately following this one + // (should this be an error?) while ( *pszMask == wxT('*') || *pszMask == wxT('?') ) pszMask++; @@ -1509,7 +1523,22 @@ bool wxString::Matches(const wxChar *pszMask) const } // match only if nothing left - return *pszTxt == wxT('\0'); + if ( *pszTxt == wxT('\0') ) + return TRUE; + + // if we failed to match, backtrack if we can + if ( pszLastStarInText ) { + pszTxt = pszLastStarInText + 1; + pszMask = pszLastStarInMask; + + pszLastStarInText = NULL; + + // don't bother resetting pszLastStarInMask, it's unnecessary + + goto match; + } + + return FALSE; } // Count the number of chars @@ -1853,6 +1882,8 @@ wxArrayString& wxArrayString::operator=(const wxArrayString& src) Copy(src); + m_autoSort = src.m_autoSort; + return *this; } @@ -1869,8 +1900,14 @@ void wxArrayString::Copy(const wxArrayString& src) void wxArrayString::Grow() { // only do it if no more place - if( m_nCount == m_nSize ) { - if( m_nSize == 0 ) { + if ( m_nCount == m_nSize ) { + // if ARRAY_DEFAULT_INITIAL_SIZE were set to 0, the initially empty would + // be never resized! + #if ARRAY_DEFAULT_INITIAL_SIZE == 0 + #error "ARRAY_DEFAULT_INITIAL_SIZE must be > 0!" + #endif + + if ( m_nSize == 0 ) { // was empty, alloc some memory m_nSize = ARRAY_DEFAULT_INITIAL_SIZE; m_pItems = new wxChar *[m_nSize]; @@ -1878,13 +1915,6 @@ void wxArrayString::Grow() else { // otherwise when it's called for the first time, nIncrement would be 0 // and the array would never be expanded -#if defined(__VISAGECPP__) && defined(__WXDEBUG__) - int array_size = ARRAY_DEFAULT_INITIAL_SIZE; - wxASSERT( array_size != 0 ); -#else - wxASSERT( ARRAY_DEFAULT_INITIAL_SIZE != 0 ); -#endif - // add 50% but not too much size_t nIncrement = m_nSize < ARRAY_DEFAULT_INITIAL_SIZE ? ARRAY_DEFAULT_INITIAL_SIZE : m_nSize >> 1;