match: Reformat match_pattern

Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
Jakub Jelen
2022-02-09 17:16:41 +01:00
parent 314c57d414
commit 354438e758

View File

@@ -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;
} }
/* /*