version 1.1, 1999/09/26 20:53:36 |
version 1.2, 1999/11/23 22:25:54 |
|
|
|
|
/* Returns true if the given string matches the pattern (which may contain |
/* Returns true if the given string matches the pattern (which may contain |
? and * as wildcards), and zero if it does not match. */ |
? and * as wildcards), and zero if it does not match. */ |
|
|
int match_pattern(const char *s, const char *pattern) |
int |
|
match_pattern(const char *s, const char *pattern) |
{ |
{ |
while (1) |
for (;;) { |
{ |
/* If at end of pattern, accept if also at end of string. */ |
/* If at end of pattern, accept if also at end of string. */ |
if (!*pattern) |
if (!*pattern) |
return !*s; |
return !*s; |
|
|
|
/* Process '*'. */ |
/* Process '*'. */ |
if (*pattern == '*') |
if (*pattern == '*') { |
{ |
/* Skip the asterisk. */ |
/* Skip the asterisk. */ |
pattern++; |
pattern++; |
|
|
|
/* If at end of pattern, accept immediately. */ |
/* If at end of pattern, accept immediately. */ |
if (!*pattern) |
if (!*pattern) |
return 1; |
return 1; |
|
|
/* If next character in pattern is known, optimize. */ |
/* If next character in pattern is known, optimize. */ |
if (*pattern != '?' && *pattern != '*') |
if (*pattern != '?' && *pattern != '*') { |
{ |
/* Look instances of the next character in |
/* Look instances of the next character in pattern, and try |
pattern, and try to match starting from |
to match starting from those. */ |
those. */ |
for (; *s; s++) |
for (; *s; s++) |
if (*s == *pattern && |
if (*s == *pattern && |
match_pattern(s + 1, pattern + 1)) |
match_pattern(s + 1, pattern + 1)) |
return 1; |
return 1; |
/* Failed. */ |
/* Failed. */ |
return 0; |
return 0; |
} |
} |
|
/* Move ahead one character at a time and try to |
|
match at each position. */ |
|
for (; *s; s++) |
|
if (match_pattern(s, pattern)) |
|
return 1; |
|
/* Failed. */ |
|
return 0; |
|
} |
|
/* There must be at least one more character in the |
|
string. If we are at the end, fail. */ |
|
if (!*s) |
|
return 0; |
|
|
/* Move ahead one character at a time and try to match at each |
/* Check if the next character of the string is |
position. */ |
acceptable. */ |
for (; *s; s++) |
if (*pattern != '?' && *pattern != *s) |
if (match_pattern(s, pattern)) |
return 0; |
return 1; |
|
/* Failed. */ |
|
return 0; |
|
} |
|
|
|
/* There must be at least one more character in the string. If we are |
/* Move to the next character, both in string and in |
at the end, fail. */ |
pattern. */ |
if (!*s) |
s++; |
return 0; |
pattern++; |
|
} |
/* Check if the next character of the string is acceptable. */ |
/* NOTREACHED */ |
if (*pattern != '?' && *pattern != *s) |
|
return 0; |
|
|
|
/* Move to the next character, both in string and in pattern. */ |
|
s++; |
|
pattern++; |
|
} |
|
/*NOTREACHED*/ |
|
} |
} |