#include <ctype.h> #define MAX_CALLS 200 //! Returns true if the specified name matches the specified wildcard. /*! * \param mask Specifies a wildcard to test. This may contain the ? * (question mark) and * (asterisk) characters, to test for single and * unlimited character matches respectively. * \param name Specifies the string to test against. */ int match(const wchar_t *mask, const wchar_t *name) { int calls=0, wild=0, q=0; const wchar_t *m=mask, *n=name, *ma=mask, *na=name; for(;;) { if (++calls > MAX_CALLS) return 1; if (*m == '*') { while (*m == '*') ++m; wild = 1; ma = m; na = n; } if (!*m) { if (!*n) return 0; for (--m; (m > mask) && (*m == '?'); --m) ; if ((*m == '*') && (m > mask) && (m[-1] != '\\')) return 0; if (!wild) return 1; m = ma; } else if (!*n) { while(*m == '*') ++m; return (*m != 0); } if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?'))) { ++m; q = 1; } else { q = 0; } if ((towlower(*m) != towlower(*n)) && ((*m != '?') || q)) { if (!wild) return 1; m = ma; n = ++na; } else { if (*m) ++m; if (*n) ++n; } } }