56 lines
999 B
C
56 lines
999 B
C
#define MAX_CALLS 200
|
|
#include <ctype.h>
|
|
|
|
int match(const char *mask, const char *name)
|
|
{
|
|
int calls = 0, wild = 0, q = 0;
|
|
const char *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 ((tolower(*m) != tolower(*n)) && ((*m != '?') || q)) {
|
|
if (!wild)
|
|
return 1;
|
|
m = ma;
|
|
n = ++na;
|
|
} else {
|
|
if (*m)
|
|
++m;
|
|
if (*n)
|
|
++n;
|
|
}
|
|
}
|
|
}
|