mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-09 09:54:25 +09:00
match: Reformat match_pattern
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
127
src/match.c
127
src/match.c
@@ -51,74 +51,75 @@
|
|||||||
*/
|
*/
|
||||||
static int match_pattern(const char *s, const char *pattern, size_t limit)
|
static int match_pattern(const char *s, const char *pattern, size_t limit)
|
||||||
{
|
{
|
||||||
bool had_asterisk = false;
|
bool had_asterisk = false;
|
||||||
if (s == NULL || pattern == NULL || limit <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
if (s == NULL || pattern == NULL || limit <= 0) {
|
||||||
/* If at end of pattern, accept if also at end of string. */
|
|
||||||
if (*pattern == '\0') {
|
|
||||||
return (*s == '\0');
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*pattern == '*') {
|
|
||||||
/* Skip the asterisk. */
|
|
||||||
had_asterisk = true;
|
|
||||||
pattern++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (had_asterisk) {
|
|
||||||
/* If at end of pattern, accept immediately. */
|
|
||||||
if (!*pattern)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* If next character in pattern is known, optimize. */
|
|
||||||
if (*pattern != '?') {
|
|
||||||
/*
|
|
||||||
* Look instances of the next character in
|
|
||||||
* pattern, and try to match starting from
|
|
||||||
* those.
|
|
||||||
*/
|
|
||||||
for (; *s; s++)
|
|
||||||
if (*s == *pattern && match_pattern(s + 1, pattern + 1, limit - 1)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/* Failed. */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Move ahead one character at a time and try to
|
for (;;) {
|
||||||
* match at each position.
|
/* If at end of pattern, accept if also at end of string. */
|
||||||
*/
|
if (*pattern == '\0') {
|
||||||
for (; *s; s++) {
|
return (*s == '\0');
|
||||||
if (match_pattern(s, pattern, limit - 1)) {
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/* Failed. */
|
while (*pattern == '*') {
|
||||||
return 0;
|
/* Skip all the asterisks. */
|
||||||
}
|
had_asterisk = true;
|
||||||
/*
|
pattern++;
|
||||||
* There must be at least one more character in the string.
|
}
|
||||||
* If we are at the end, fail.
|
|
||||||
*/
|
if (had_asterisk) {
|
||||||
if (!*s) {
|
/* If at end of pattern, accept immediately. */
|
||||||
return 0;
|
if (!*pattern)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* If next character in pattern is known, optimize. */
|
||||||
|
if (*pattern != '?') {
|
||||||
|
/*
|
||||||
|
* Look instances of the next character in
|
||||||
|
* pattern, and try to match starting from
|
||||||
|
* those.
|
||||||
|
*/
|
||||||
|
for (; *s; s++)
|
||||||
|
if (*s == *pattern && match_pattern(s + 1, pattern + 1, limit - 1)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* Failed. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Move ahead one character at a time and try to
|
||||||
|
* match at each position.
|
||||||
|
*/
|
||||||
|
for (; *s; s++) {
|
||||||
|
if (match_pattern(s, pattern, limit - 1)) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the next character of the string is acceptable. */
|
||||||
|
if (*pattern != '?' && *pattern != *s) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move to the next character, both in string and in pattern. */
|
||||||
|
s++;
|
||||||
|
pattern++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the next character of the string is acceptable. */
|
/* NOTREACHED */
|
||||||
if (*pattern != '?' && *pattern != *s) {
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move to the next character, both in string and in pattern. */
|
|
||||||
s++;
|
|
||||||
pattern++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTREACHED */
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user