+
+//------------------------------------------------------------------------
+// wild character routines
+//------------------------------------------------------------------------
+
+bool wxIsWild( const wxString& pattern )
+{
+ wxString tmp = pattern;
+ wxChar *pat = WXSTRINGCAST(tmp);
+ while (*pat) {
+ switch (*pat++) {
+ case T('?'): case T('*'): case T('['): case T('{'):
+ return TRUE;
+ case T('\\'):
+ if (!*pat++)
+ return FALSE;
+ }
+ }
+ return FALSE;
+};
+
+bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
+
+#if defined(HAVE_FNMATCH_H)
+{
+// this probably won't work well for multibyte chars in Unicode mode?
+ if(dot_special)
+ return fnmatch(pat.fn_str(), text.fn_str(), FNM_PERIOD) == 0;
+ else
+ return fnmatch(pat.fn_str(), text.fn_str(), 0) == 0;
+}
+#else
+
+// #pragma error Broken implementation of wxMatchWild() -- needs fixing!
+
+ /*
+ * WARNING: this code is broken!
+ */
+{
+ wxString tmp1 = pat;
+ wxChar *pattern = WXSTRINGCAST(tmp1);
+ wxString tmp2 = text;
+ wxChar *str = WXSTRINGCAST(tmp2);
+ wxChar c;
+ wxChar *cp;
+ bool done = FALSE, ret_code, ok;
+ // Below is for vi fans
+ const wxChar OB = T('{'), CB = T('}');
+
+ // dot_special means '.' only matches '.'
+ if (dot_special && *str == T('.') && *pattern != *str)
+ return FALSE;
+
+ while ((*pattern != T('\0')) && (!done)
+ && (((*str==T('\0'))&&((*pattern==OB)||(*pattern==T('*'))))||(*str!=T('\0')))) {
+ switch (*pattern) {
+ case T('\\'):
+ pattern++;
+ if (*pattern != T('\0'))
+ pattern++;
+ break;
+ case T('*'):
+ pattern++;
+ ret_code = FALSE;
+ while ((*str!=T('\0'))
+ && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
+ /*loop*/;
+ if (ret_code) {
+ while (*str != T('\0'))
+ str++;
+ while (*pattern != T('\0'))
+ pattern++;
+ }
+ break;
+ case T('['):
+ pattern++;
+ repeat:
+ if ((*pattern == T('\0')) || (*pattern == T(']'))) {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == T('\\')) {
+ pattern++;
+ if (*pattern == T('\0')) {
+ done = TRUE;
+ break;
+ }
+ }
+ if (*(pattern + 1) == T('-')) {
+ c = *pattern;
+ pattern += 2;
+ if (*pattern == T(']')) {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == T('\\')) {
+ pattern++;
+ if (*pattern == T('\0')) {
+ done = TRUE;
+ break;
+ }
+ }
+ if ((*str < c) || (*str > *pattern)) {
+ pattern++;
+ goto repeat;
+ }
+ } else if (*pattern != *str) {
+ pattern++;
+ goto repeat;
+ }
+ pattern++;
+ while ((*pattern != T(']')) && (*pattern != T('\0'))) {
+ if ((*pattern == T('\\')) && (*(pattern + 1) != T('\0')))
+ pattern++;
+ pattern++;
+ }
+ if (*pattern != T('\0')) {
+ pattern++, str++;
+ }
+ break;
+ case T('?'):
+ pattern++;
+ str++;
+ break;
+ case OB:
+ pattern++;
+ while ((*pattern != CB) && (*pattern != T('\0'))) {
+ cp = str;
+ ok = TRUE;
+ while (ok && (*cp != T('\0')) && (*pattern != T('\0'))
+ && (*pattern != T(',')) && (*pattern != CB)) {
+ if (*pattern == T('\\'))
+ pattern++;
+ ok = (*pattern++ == *cp++);
+ }
+ if (*pattern == T('\0')) {
+ ok = FALSE;
+ done = TRUE;
+ break;
+ } else if (ok) {
+ str = cp;
+ while ((*pattern != CB) && (*pattern != T('\0'))) {
+ if (*++pattern == T('\\')) {
+ if (*++pattern == CB)
+ pattern++;
+ }
+ }
+ } else {
+ while (*pattern!=CB && *pattern!=T(',') && *pattern!=T('\0')) {
+ if (*++pattern == T('\\')) {
+ if (*++pattern == CB || *pattern == T(','))
+ pattern++;
+ }
+ }
+ }
+ if (*pattern != T('\0'))
+ pattern++;
+ }
+ break;
+ default:
+ if (*str == *pattern) {
+ str++, pattern++;
+ } else {
+ done = TRUE;
+ }
+ }
+ }
+ while (*pattern == T('*'))
+ pattern++;
+ return ((*str == T('\0')) && (*pattern == T('\0')));
+};
+
+#endif
+
+#ifdef __VISUALC__
+ #pragma warning(default:4706) // assignment within conditional expression
+#endif // VC++