On Sat, Mar 23, 2013 at 11:18:24AM +0700, Duy Nguyen wrote:
> You can use nwildmatch() from this patch. I tested it lightly with
> t3070-wildmatch.sh, feeding the strings with no terminating NUL. It
> seems to work ok.
And valgrind spotted my faults, especially for using strchr. You would
need this on top:
-- 8< --
diff --git a/wildmatch.c b/wildmatch.c
index f97ae2a..939bac8 100644
--- a/wildmatch.c
+++ b/wildmatch.c
@@ -61,9 +61,13 @@ static int dowild(const uchar *p, const uchar *text,
for ( ; (p_ch = *p) != '\0'; text++, p++) {
int matched, match_slash, negated;
uchar t_ch, prev_ch;
- if (text >= textend && p_ch != '*')
- return WM_ABORT_ALL;
- t_ch = *text;
+ if (text >= textend) {
+ if (p_ch != '*')
+ return WM_ABORT_ALL;
+ else
+ t_ch = '\0';
+ } else
+ t_ch = *text;
if ((flags & WM_CASEFOLD) && ISUPPER(t_ch))
t_ch = tolower(t_ch);
if ((flags & WM_CASEFOLD) && ISUPPER(p_ch))
@@ -115,8 +119,9 @@ static int dowild(const uchar *p, const uchar *text,
/* Trailing "**" matches everything. Trailing
"*" matches
* only if there are no more slash characters.
*/
if (!match_slash) {
- if (strchr((char*)text, '/') != NULL)
- return WM_NOMATCH;
+ for (;text < textend; text++)
+ if (*text == '/')
+ return WM_NOMATCH;
}
return WM_MATCH;
} else if (!match_slash && *p == '/') {
@@ -125,10 +130,11 @@ static int dowild(const uchar *p, const uchar *text,
* with WM_PATHNAME matches the next
* directory
*/
- const char *slash = strchr((char*)text, '/');
- if (!slash)
+ for (;text < textend; text++)
+ if (*text == '/')
+ break;
+ if (text == textend)
return WM_NOMATCH;
- text = (const uchar*)slash;
/* the slash is consumed by the top-level for
loop */
break;
}
@@ -151,7 +157,7 @@ static int dowild(const uchar *p, const uchar *text,
t_ch = tolower(t_ch);
if (t_ch == p_ch)
break;
- t_ch = *++text;
+ t_ch = ++text < textend ? *text
: '\0';
}
if (t_ch != p_ch)
return WM_NOMATCH;
-- 8< --
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html