mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-11 02:38:09 +09:00
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:
107
libssh/match.c
107
libssh/match.c
@@ -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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user