version 1.3, 1999/11/24 00:26:02 |
version 1.4, 1999/11/24 19:53:48 |
|
|
|
|
#include "ssh.h" |
#include "ssh.h" |
|
|
/* Returns true if the given string matches the pattern (which may contain |
/* |
? and * as wildcards), and zero if it does not match. */ |
* Returns true if the given string matches the pattern (which may contain ? |
|
* and * as wildcards), and zero if it does not match. |
|
*/ |
|
|
int |
int |
match_pattern(const char *s, const char *pattern) |
match_pattern(const char *s, const char *pattern) |
|
|
if (!*pattern) |
if (!*pattern) |
return !*s; |
return !*s; |
|
|
/* Process '*'. */ |
|
if (*pattern == '*') { |
if (*pattern == '*') { |
/* Skip the asterisk. */ |
/* Skip the asterisk. */ |
pattern++; |
pattern++; |
|
|
|
|
/* 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 |
/* |
pattern, and try to match starting from |
* Look instances of the next character in |
those. */ |
* pattern, and try to match starting from |
|
* 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)) |
|
|
/* Failed. */ |
/* Failed. */ |
return 0; |
return 0; |
} |
} |
/* Move ahead one character at a time and try to |
/* |
match at each position. */ |
* Move ahead one character at a time and try to |
|
* match at each position. |
|
*/ |
for (; *s; s++) |
for (; *s; s++) |
if (match_pattern(s, pattern)) |
if (match_pattern(s, pattern)) |
return 1; |
return 1; |
/* Failed. */ |
/* Failed. */ |
return 0; |
return 0; |
} |
} |
/* There must be at least one more character in the |
/* |
string. If we are at the end, fail. */ |
* There must be at least one more character in the string. |
|
* If we are at the end, fail. |
|
*/ |
if (!*s) |
if (!*s) |
return 0; |
return 0; |
|
|
/* Check if the next character of the string is |
/* Check if the next character of the string is acceptable. */ |
acceptable. */ |
|
if (*pattern != '?' && *pattern != *s) |
if (*pattern != '?' && *pattern != *s) |
return 0; |
return 0; |
|
|
/* Move to the next character, both in string and in |
/* Move to the next character, both in string and in pattern. */ |
pattern. */ |
|
s++; |
s++; |
pattern++; |
pattern++; |
} |
} |