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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html