X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/710faea9a47ff9709f8536bc52b542270446a414..c9a59880f0ddf58c700834fea80c08c39c27ccb3:/lib/wildmatch.c diff --git a/lib/wildmatch.c b/lib/wildmatch.c index 99da11eb..9276954c 100644 --- a/lib/wildmatch.c +++ b/lib/wildmatch.c @@ -16,13 +16,22 @@ #define FALSE 0 #define TRUE 1 -#define ABORT -1 +#define ABORT_ALL -1 +#define ABORT_TO_STARSTAR -2 + +#ifdef WILD_TEST_ITERATIONS +int wildmatch_iteration_count; +#endif static int domatch(const char *p, const char *text) { int matched, special; char ch, prev; +#ifdef WILD_TEST_ITERATIONS + wildmatch_iteration_count++; +#endif + for ( ; (ch = *p) != '\0'; text++, p++) { if (*text == '\0' && ch != '*') return FALSE; @@ -51,31 +60,28 @@ static int domatch(const char *p, const char *text) if (*p == '\0') { /* Trailing "**" matches everything. Trailing "*" matches * only if there are no more slash characters. */ - return special? TRUE : strchr(text, '/') == 0; + return special? TRUE : strchr(text, '/') == NULL; } for ( ; *text; text++) { - if ((matched = domatch(p, text)) != FALSE) - return matched; - if (!special && *text == '/') - return FALSE; + if ((matched = domatch(p, text)) != FALSE) { + if (!special || matched != ABORT_TO_STARSTAR) + return matched; + } + else if (!special && *text == '/') + return ABORT_TO_STARSTAR; } - return ABORT; + return ABORT_ALL; case '[': - special = *++p == NEGATE_CLASS ? TRUE : FALSE; + ch = *++p; + /* Assign literal TRUE/FALSE because of "matched" comparison. */ + special = ch == NEGATE_CLASS? TRUE : FALSE; if (special) { /* Inverted character class. */ - p++; + ch = *++p; } prev = 0; matched = FALSE; - ch = *p; - if (ch == ']' || ch == '-') { - if (*text == ch) - matched = TRUE; - prev = ch; - ch = *++p; - } - for ( ; ch != ']'; prev = ch, ch = *++p) { + do { if (!ch) return FALSE; if (ch == '-' && prev && p[1] && p[1] != ']') { @@ -85,7 +91,7 @@ static int domatch(const char *p, const char *text) } else if (*text == ch) matched = TRUE; - } + } while (prev = ch, (ch = *++p) != ']'); if (matched == special) return FALSE; continue; @@ -97,5 +103,8 @@ static int domatch(const char *p, const char *text) int wildmatch(const char *p, const char *text) { +#ifdef WILD_TEST_ITERATIONS + wildmatch_iteration_count = 0; +#endif return domatch(p, text) == TRUE; }