adapted for our code that distinguishes "**" from "*".
/* What character marks an inverted character class? */
#define NEGATE_CLASS '!'
/* 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 != '*')
{
int matched, special;
char ch, prev;
for ( ; (ch = *p) != '\0'; text++, p++) {
if (*text == '\0' && ch != '*')
switch (ch) {
case '\\':
/* Literal match with following character. Note that the test
switch (ch) {
case '\\':
/* Literal match with following character. Note that the test
/* FALLTHROUGH */
default:
if (*text != ch)
/* FALLTHROUGH */
default:
if (*text != ch)
continue;
case '?':
/* Match anything but '/'. */
if (*text == '/')
continue;
case '?':
/* Match anything but '/'. */
if (*text == '/')
continue;
case '*':
if (*++p == '*') {
while (*++p == '*') {}
continue;
case '*':
if (*++p == '*') {
while (*++p == '*') {}
- /* 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++) {
}
for ( ; *text; text++) {
- if (wildmatch(p, text))
- return true;
+ if ((matched = domatch(p, text)) != FALSE)
+ return matched;
if (!special && *text == '/')
if (!special && *text == '/')
- special = *++p == NEGATE_CLASS ? true : false;
+ special = *++p == NEGATE_CLASS ? TRUE : FALSE;
if (special) {
/* Inverted character class. */
p++;
}
prev = 0;
if (special) {
/* Inverted character class. */
p++;
}
prev = 0;
ch = *p;
if (ch == ']' || ch == '-') {
if (*text == ch)
ch = *p;
if (ch == ']' || ch == '-') {
if (*text == ch)
prev = ch;
ch = *++p;
}
for ( ; ch != ']'; prev = ch, ch = *++p) {
if (!ch)
prev = ch;
ch = *++p;
}
for ( ; ch != ']'; prev = ch, ch = *++p) {
if (!ch)
if (ch == '-' && prev && p[1] && p[1] != ']') {
if (*text <= *++p && *text >= prev)
if (ch == '-' && prev && p[1] && p[1] != ']') {
if (*text <= *++p && *text >= prev)
ch = 0; /* This makes "prev" get set to 0. */
}
else if (*text == ch)
ch = 0; /* This makes "prev" get set to 0. */
}
else if (*text == ch)
}
if (matched == special)
}
if (matched == special)
continue;
}
}
return *text == '\0';
}
continue;
}
}
return *text == '\0';
}
+
+int wildmatch(const char *p, const char *text)
+{
+ return domatch(p, text) == TRUE;
+}