+match:
+ for ( ; *pszMask != wxT('\0'); pszMask++, pszTxt++ ) {
+ switch ( *pszMask ) {
+ case wxT('?'):
+ if ( *pszTxt == wxT('\0') )
+ return false;
+
+ // 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++;
+
+ // if there is nothing more, match
+ if ( *pszMask == wxT('\0') )
+ return true;
+
+ // are there any other metacharacters in the mask?
+ size_t uiLenMask;
+ const wxChar *pEndMask = wxStrpbrk(pszMask, wxT("*?"));
+
+ if ( pEndMask != NULL ) {
+ // we have to match the string between two metachars
+ uiLenMask = pEndMask - pszMask;
+ }
+ else {
+ // we have to match the remainder of the string
+ uiLenMask = wxStrlen(pszMask);
+ }
+
+ wxString strToMatch(pszMask, uiLenMask);
+ const wxChar* pMatch = wxStrstr(pszTxt, strToMatch);
+ if ( pMatch == NULL )
+ return false;
+
+ // -1 to compensate "++" in the loop
+ pszTxt = pMatch + uiLenMask - 1;
+ pszMask += uiLenMask - 1;
+ }
+ break;
+
+ default:
+ if ( *pszMask != *pszTxt )
+ return false;
+ break;
+ }
+ }
+
+ // match only if nothing left
+ 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;
+#endif // wxUSE_REGEX/!wxUSE_REGEX
+}
+
+// Count the number of chars
+int wxString::Freq(wxUniChar ch) const