X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f017c64bbad70dac236202cf208889f08f75a8c..893758d507abf66a429666b9f0b2c1baa195b398:/src/common/string.cpp?ds=sidebyside diff --git a/src/common/string.cpp b/src/common/string.cpp index 917bd82d09..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; @@ -1456,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++; @@ -1510,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 @@ -1854,6 +1882,8 @@ wxArrayString& wxArrayString::operator=(const wxArrayString& src) Copy(src); + m_autoSort = src.m_autoSort; + return *this; } @@ -1870,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]; @@ -1879,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;