Normally we need recursion for "*". In this case we know that it matches everything until "/" so we can skip the recursion. glibc, '*/*/*' on linux-2.6.git file list 2000 times before: wildmatch 8s 74513us fnmatch 1s 97042us or 13.59% faster after: wildmatch 3s 521862us fnmatch 3s 488616us or 99.06% slower Same test with compat/fnmatch: wildmatch 8s 110763us fnmatch 2s 980845us or 36.75% faster wildmatch 3s 522156us fnmatch 1s 544487us or 43.85% slower Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- wildmatch.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/wildmatch.c b/wildmatch.c index 4fe1d65..3794c4d 100644 --- a/wildmatch.c +++ b/wildmatch.c @@ -116,6 +116,18 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags) return WM_NOMATCH; } return WM_MATCH; + } else if (*p == '/' && (flags & WM_PATHNAME) && !special) { + /* + * an asterisk followed by a slash + * with WM_PATHNAME matches the next + * directory + */ + const char *slash = strchr((char*)text, '/'); + if (!slash) + return WM_NOMATCH; + text = (const uchar*)slash; + /* the slash is consumed by the top-level for loop */ + break; } while (1) { if (t_ch == '\0') -- 1.8.0.rc2.23.g1fb49df -- 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