summaryrefslogtreecommitdiff
path: root/lib/wildmatch.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2003-07-05 17:30:53 +0000
committerWayne Davison <wayned@samba.org>2003-07-05 17:30:53 +0000
commit710faea9a47ff9709f8536bc52b542270446a414 (patch)
tree72868ae879f25461a65d3e795f561cbedfb24977 /lib/wildmatch.c
parent70a6051cf12ffe4984f2ccb8147877c587cca564 (diff)
downloadrsync-710faea9a47ff9709f8536bc52b542270446a414.tar.gz
Added in the ABORT optimization logic from a newer wildmat release,
adapted for our code that distinguishes "**" from "*".
Diffstat (limited to 'lib/wildmatch.c')
-rw-r--r--lib/wildmatch.c51
1 files changed, 28 insertions, 23 deletions
diff --git a/lib/wildmatch.c b/lib/wildmatch.c
index 06eb4d79..99da11eb 100644
--- a/lib/wildmatch.c
+++ b/lib/wildmatch.c
@@ -14,19 +14,18 @@
/* What character marks an inverted character class? */
#define NEGATE_CLASS '!'
-#define false 0
-#define true 1
+#define FALSE 0
+#define TRUE 1
+#define ABORT -1
-/* Look for pattern "p" in the "text" string. */
-int
-wildmatch(const char *p, const char *text)
+static int domatch(const char *p, const char *text)
{
int matched, special;
char ch, prev;
for ( ; (ch = *p) != '\0'; text++, p++) {
if (*text == '\0' && ch != '*')
- return false;
+ return FALSE;
switch (ch) {
case '\\':
/* Literal match with following character. Note that the test
@@ -35,62 +34,68 @@ wildmatch(const char *p, const char *text)
/* FALLTHROUGH */
default:
if (*text != ch)
- return false;
+ return FALSE;
continue;
case '?':
/* Match anything but '/'. */
if (*text == '/')
- return false;
+ return FALSE;
continue;
case '*':
if (*++p == '*') {
while (*++p == '*') {}
- special = true;
+ special = TRUE;
}
else
- special = false;
+ special = FALSE;
if (*p == '\0') {
- /* Trailing "**" matches everything. */
- return special? true : strchr(text, '/') == 0;
+ /* Trailing "**" matches everything. Trailing "*" matches
+ * only if there are no more slash characters. */
+ return special? TRUE : strchr(text, '/') == 0;
}
for ( ; *text; text++) {
- if (wildmatch(p, text))
- return true;
+ if ((matched = domatch(p, text)) != FALSE)
+ return matched;
if (!special && *text == '/')
- return false;
+ return FALSE;
}
- return false;
+ return ABORT;
case '[':
- special = *++p == NEGATE_CLASS ? true : false;
+ special = *++p == NEGATE_CLASS ? TRUE : FALSE;
if (special) {
/* Inverted character class. */
p++;
}
prev = 0;
- matched = false;
+ matched = FALSE;
ch = *p;
if (ch == ']' || ch == '-') {
if (*text == ch)
- matched = true;
+ matched = TRUE;
prev = ch;
ch = *++p;
}
for ( ; ch != ']'; prev = ch, ch = *++p) {
if (!ch)
- return false;
+ return FALSE;
if (ch == '-' && prev && p[1] && p[1] != ']') {
if (*text <= *++p && *text >= prev)
- matched = true;
+ matched = TRUE;
ch = 0; /* This makes "prev" get set to 0. */
}
else if (*text == ch)
- matched = true;
+ matched = TRUE;
}
if (matched == special)
- return false;
+ return FALSE;
continue;
}
}
return *text == '\0';
}
+
+int wildmatch(const char *p, const char *text)
+{
+ return domatch(p, text) == TRUE;
+}