add _DEFAULT_SOURCE wherever _BSD_SOURCE was used
[libc-test] / src / functional / fnmatch.c
index 33f508f..96b8e06 100644 (file)
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE 1
 #include <stdio.h>
 #include <stdlib.h>
 #include <fnmatch.h>
@@ -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)
@@ -128,11 +153,11 @@ int main(void)
                r = fnmatch(tests[i].pattern, tests[i].string, tests[i].flags);
                x = tests[i].expected;
                if (r != x && (r != FNM_NOMATCH || x != -FNM_NOMATCH)) {
-                       error("fnmatch(\"%s\", \"%s\", %s) failed, got %d want %d\n",
+                       t_error("fnmatch(\"%s\", \"%s\", %s) failed, got %d want %d\n",
                                tests[i].pattern, tests[i].string,
                                flagstr(fnmatch_flags, tests[i].flags),
                                r, x);
                }
        }
-       return test_status;
+       return t_status;
 }