X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffunctional%2Ffnmatch.c;h=96b8e06dec19ae207b54eec247dd44f56bd100f3;hb=2c671f66e28ac079ae1148f5135c9a52129cc807;hp=e822456cedeb7915bdfb778027fbf0c2a4cd7491;hpb=cfa23cc1bd01f5c44d7746b8b1839f84d5e1b6eb;p=libc-test diff --git a/src/functional/fnmatch.c b/src/functional/fnmatch.c index e822456..96b8e06 100644 --- a/src/functional/fnmatch.c +++ b/src/functional/fnmatch.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE 1 #include #include #include @@ -16,6 +17,9 @@ struct xlat { FLAG(FNM_NOESCAPE), FLAG(FNM_PATHNAME), FLAG(FNM_PERIOD), +#ifdef FNM_CASEFOLD + FLAG(FNM_CASEFOLD), +#endif {0, NULL}, }; @@ -23,15 +27,17 @@ static char *flagstr(const struct xlat *map, int flags) { static char buf[1000]; char *sep; + int n; if (!flags) { sprintf(buf, "0"); return buf; } + n = 0; sep = ""; for (; map->str; map++) { if (map->val && (flags & map->val) == map->val) { - sprintf(buf, "%s%s", sep, map->str); + n += sprintf(buf+n, "%s%s", sep, map->str); sep = "|"; flags &= ~(map->val); } @@ -116,6 +122,25 @@ struct { { "a?b", "a.b", FNM_PATHNAME|FNM_PERIOD, 0 }, { "a*b", "a.b", FNM_PATHNAME|FNM_PERIOD, 0 }, { "a[.]b", "a.b", FNM_PATHNAME|FNM_PERIOD, 0 }, + + /* posix 2008 is unclear about these cases */ + { "\\", "\\", 0, 0 }, + { "\\", "", 0, FNM_NOMATCH }, + + /* musl bug fixed in da0fcdb8e913ca7cdf8931328f2b37e93309b2c5 */ + { "/", "\0", FNM_PATHNAME, FNM_NOMATCH }, + /* musl bug fixed in 6ec82a3b58ee1b873ff0dfad8fa9d41c3d25dcc0 */ + { "\\/", "/", FNM_PATHNAME, 0 }, + +#ifdef FNM_CASEFOLD + { "a", "A", FNM_CASEFOLD, 0 }, + { "aaAA", "AaAa", FNM_CASEFOLD, 0 }, + { "[a]", "A", FNM_CASEFOLD, 0 }, + { "[!a]", "A", FNM_CASEFOLD, FNM_NOMATCH }, + { "[!A-C]", "b", FNM_CASEFOLD, FNM_NOMATCH }, + { "[!a-c]", "B", FNM_CASEFOLD, FNM_NOMATCH }, + { "[!a-c]", "d", FNM_CASEFOLD, 0 }, +#endif }; int main(void)