Format match_pattern().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@714 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-05-05 07:11:21 +00:00
parent dc07d46cca
commit 1a280d859d

View File

@@ -39,69 +39,76 @@
* vim: ts=2 sw=2 et cindent * vim: ts=2 sw=2 et cindent
*/ */
#include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
#include <sys/types.h>
#include "libssh/priv.h" #include "libssh/priv.h"
/* /*
* 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.
*/ */
static int match_pattern(const char *s, const char *pattern) { static int match_pattern(const char *s, const char *pattern) {
for (;;) { 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;
}
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 to match starting from * pattern, and try 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 * Move ahead one character at a time and try to
* match at each position. * 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. */ }
return 0; }
} /* Failed. */
/* 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 (!*s) * If we are at the end, fail.
return 0; */
if (!*s) {
return 0;
}
/* Check if the next character of the string is acceptable. */ /* Check if the next character of the string is acceptable. */
if (*pattern != '?' && *pattern != *s) if (*pattern != '?' && *pattern != *s) {
return 0; return 0;
}
/* Move to the next character, both in string and in pattern. */ /* Move to the next character, both in string and in pattern. */
s++; s++;
pattern++; pattern++;
} }
/* NOTREACHED */
/* NOTREACHED */
} }
/* /*