1fbf5b9f8SEnji Cooper /*- 2fbf5b9f8SEnji Cooper * Copyright (c) 2010 Jilles Tjoelker 3fbf5b9f8SEnji Cooper * All rights reserved. 4fbf5b9f8SEnji Cooper * 5fbf5b9f8SEnji Cooper * Redistribution and use in source and binary forms, with or without 6fbf5b9f8SEnji Cooper * modification, are permitted provided that the following conditions 7fbf5b9f8SEnji Cooper * are met: 8fbf5b9f8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 9fbf5b9f8SEnji Cooper * notice, this list of conditions and the following disclaimer. 10fbf5b9f8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 11fbf5b9f8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 12fbf5b9f8SEnji Cooper * documentation and/or other materials provided with the distribution. 13fbf5b9f8SEnji Cooper * 14fbf5b9f8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15fbf5b9f8SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16fbf5b9f8SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17fbf5b9f8SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18fbf5b9f8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19fbf5b9f8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20fbf5b9f8SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21fbf5b9f8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22fbf5b9f8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23fbf5b9f8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24fbf5b9f8SEnji Cooper * SUCH DAMAGE. 25fbf5b9f8SEnji Cooper */ 26fbf5b9f8SEnji Cooper 27fbf5b9f8SEnji Cooper #include <fnmatch.h> 28fbf5b9f8SEnji Cooper 29fbf5b9f8SEnji Cooper struct testcase { 30fbf5b9f8SEnji Cooper const char *pattern; 31fbf5b9f8SEnji Cooper const char *string; 32fbf5b9f8SEnji Cooper int flags; 33fbf5b9f8SEnji Cooper int result; 34fbf5b9f8SEnji Cooper } testcases[] = { 35dd3d75baSEnji Cooper { "", "", 0, 0 }, 36dd3d75baSEnji Cooper { "a", "a", 0, 0 }, 37dd3d75baSEnji Cooper { "a", "b", 0, FNM_NOMATCH }, 38dd3d75baSEnji Cooper { "a", "A", 0, FNM_NOMATCH }, 39dd3d75baSEnji Cooper { "*", "a", 0, 0 }, 40dd3d75baSEnji Cooper { "*", "aa", 0, 0 }, 41dd3d75baSEnji Cooper { "*a", "a", 0, 0 }, 42dd3d75baSEnji Cooper { "*a", "b", 0, FNM_NOMATCH }, 43dd3d75baSEnji Cooper { "*a*", "b", 0, FNM_NOMATCH }, 44dd3d75baSEnji Cooper { "*a*b*", "ab", 0, 0 }, 45dd3d75baSEnji Cooper { "*a*b*", "qaqbq", 0, 0 }, 46dd3d75baSEnji Cooper { "*a*bb*", "qaqbqbbq", 0, 0 }, 47dd3d75baSEnji Cooper { "*a*bc*", "qaqbqbcq", 0, 0 }, 48dd3d75baSEnji Cooper { "*a*bb*", "qaqbqbb", 0, 0 }, 49dd3d75baSEnji Cooper { "*a*bc*", "qaqbqbc", 0, 0 }, 50dd3d75baSEnji Cooper { "*a*bb", "qaqbqbb", 0, 0 }, 51dd3d75baSEnji Cooper { "*a*bc", "qaqbqbc", 0, 0 }, 52dd3d75baSEnji Cooper { "*a*bb", "qaqbqbbq", 0, FNM_NOMATCH }, 53dd3d75baSEnji Cooper { "*a*bc", "qaqbqbcq", 0, FNM_NOMATCH }, 54dd3d75baSEnji Cooper { "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaa", 0, FNM_NOMATCH }, 55dd3d75baSEnji Cooper { "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaa", 0, 0 }, 56dd3d75baSEnji Cooper { "*a*a*a*a*a*a*a*a*a*a*", "aaaaaaaaaaa", 0, 0 }, 57dd3d75baSEnji Cooper { ".*.*.*.*.*.*.*.*.*.*", ".........", 0, FNM_NOMATCH }, 58dd3d75baSEnji Cooper { ".*.*.*.*.*.*.*.*.*.*", "..........", 0, 0 }, 59dd3d75baSEnji Cooper { ".*.*.*.*.*.*.*.*.*.*", "...........", 0, 0 }, 60dd3d75baSEnji Cooper { "*?*?*?*?*?*?*?*?*?*?*", "123456789", 0, FNM_NOMATCH }, 61dd3d75baSEnji Cooper { "??????????*", "123456789", 0, FNM_NOMATCH }, 62dd3d75baSEnji Cooper { "*??????????", "123456789", 0, FNM_NOMATCH }, 63dd3d75baSEnji Cooper { "*?*?*?*?*?*?*?*?*?*?*", "1234567890", 0, 0 }, 64dd3d75baSEnji Cooper { "??????????*", "1234567890", 0, 0 }, 65dd3d75baSEnji Cooper { "*??????????", "1234567890", 0, 0 }, 66dd3d75baSEnji Cooper { "*?*?*?*?*?*?*?*?*?*?*", "12345678901", 0, 0 }, 67dd3d75baSEnji Cooper { "??????????*", "12345678901", 0, 0 }, 68dd3d75baSEnji Cooper { "*??????????", "12345678901", 0, 0 }, 69dd3d75baSEnji Cooper { "[x]", "x", 0, 0 }, 70dd3d75baSEnji Cooper { "[*]", "*", 0, 0 }, 71dd3d75baSEnji Cooper { "[?]", "?", 0, 0 }, 72dd3d75baSEnji Cooper { "[", "[", 0, 0 }, 73dd3d75baSEnji Cooper { "[[]", "[", 0, 0 }, 74dd3d75baSEnji Cooper { "[[]", "x", 0, FNM_NOMATCH }, 75dd3d75baSEnji Cooper { "[*]", "", 0, FNM_NOMATCH }, 76dd3d75baSEnji Cooper { "[*]", "x", 0, FNM_NOMATCH }, 77dd3d75baSEnji Cooper { "[?]", "x", 0, FNM_NOMATCH }, 78dd3d75baSEnji Cooper { "*[*]*", "foo*foo", 0, 0 }, 79dd3d75baSEnji Cooper { "*[*]*", "foo", 0, FNM_NOMATCH }, 80dd3d75baSEnji Cooper { "[0-9]", "0", 0, 0 }, 81dd3d75baSEnji Cooper { "[0-9]", "5", 0, 0 }, 82dd3d75baSEnji Cooper { "[0-9]", "9", 0, 0 }, 83dd3d75baSEnji Cooper { "[0-9]", "/", 0, FNM_NOMATCH }, 84dd3d75baSEnji Cooper { "[0-9]", ":", 0, FNM_NOMATCH }, 85dd3d75baSEnji Cooper { "[0-9]", "*", 0, FNM_NOMATCH }, 86dd3d75baSEnji Cooper { "[!0-9]", "0", 0, FNM_NOMATCH }, 87dd3d75baSEnji Cooper { "[!0-9]", "5", 0, FNM_NOMATCH }, 88dd3d75baSEnji Cooper { "[!0-9]", "9", 0, FNM_NOMATCH }, 89dd3d75baSEnji Cooper { "[!0-9]", "/", 0, 0 }, 90dd3d75baSEnji Cooper { "[!0-9]", ":", 0, 0 }, 91dd3d75baSEnji Cooper { "[!0-9]", "*", 0, 0 }, 92dd3d75baSEnji Cooper { "*[0-9]", "a0", 0, 0 }, 93dd3d75baSEnji Cooper { "*[0-9]", "a5", 0, 0 }, 94dd3d75baSEnji Cooper { "*[0-9]", "a9", 0, 0 }, 95dd3d75baSEnji Cooper { "*[0-9]", "a/", 0, FNM_NOMATCH }, 96dd3d75baSEnji Cooper { "*[0-9]", "a:", 0, FNM_NOMATCH }, 97dd3d75baSEnji Cooper { "*[0-9]", "a*", 0, FNM_NOMATCH }, 98dd3d75baSEnji Cooper { "*[!0-9]", "a0", 0, FNM_NOMATCH }, 99dd3d75baSEnji Cooper { "*[!0-9]", "a5", 0, FNM_NOMATCH }, 100dd3d75baSEnji Cooper { "*[!0-9]", "a9", 0, FNM_NOMATCH }, 101dd3d75baSEnji Cooper { "*[!0-9]", "a/", 0, 0 }, 102dd3d75baSEnji Cooper { "*[!0-9]", "a:", 0, 0 }, 103dd3d75baSEnji Cooper { "*[!0-9]", "a*", 0, 0 }, 104dd3d75baSEnji Cooper { "*[0-9]", "a00", 0, 0 }, 105dd3d75baSEnji Cooper { "*[0-9]", "a55", 0, 0 }, 106dd3d75baSEnji Cooper { "*[0-9]", "a99", 0, 0 }, 107dd3d75baSEnji Cooper { "*[0-9]", "a0a0", 0, 0 }, 108dd3d75baSEnji Cooper { "*[0-9]", "a5a5", 0, 0 }, 109dd3d75baSEnji Cooper { "*[0-9]", "a9a9", 0, 0 }, 110dd3d75baSEnji Cooper { "\\*", "*", 0, 0 }, 111dd3d75baSEnji Cooper { "\\?", "?", 0, 0 }, 112dd3d75baSEnji Cooper { "\\[x]", "[x]", 0, 0 }, 113dd3d75baSEnji Cooper { "\\[", "[", 0, 0 }, 114dd3d75baSEnji Cooper { "\\\\", "\\", 0, 0 }, 115dd3d75baSEnji Cooper { "*\\**", "foo*foo", 0, 0 }, 116dd3d75baSEnji Cooper { "*\\**", "foo", 0, FNM_NOMATCH }, 117dd3d75baSEnji Cooper { "*\\\\*", "foo\\foo", 0, 0 }, 118dd3d75baSEnji Cooper { "*\\\\*", "foo", 0, FNM_NOMATCH }, 119dd3d75baSEnji Cooper { "\\(", "(", 0, 0 }, 120dd3d75baSEnji Cooper { "\\a", "a", 0, 0 }, 121dd3d75baSEnji Cooper { "\\*", "a", 0, FNM_NOMATCH }, 122dd3d75baSEnji Cooper { "\\?", "a", 0, FNM_NOMATCH }, 123dd3d75baSEnji Cooper { "\\*", "\\*", 0, FNM_NOMATCH }, 124dd3d75baSEnji Cooper { "\\?", "\\?", 0, FNM_NOMATCH }, 125dd3d75baSEnji Cooper { "\\[x]", "\\[x]", 0, FNM_NOMATCH }, 126dd3d75baSEnji Cooper { "\\[x]", "\\x", 0, FNM_NOMATCH }, 127dd3d75baSEnji Cooper { "\\[", "\\[", 0, FNM_NOMATCH }, 128dd3d75baSEnji Cooper { "\\(", "\\(", 0, FNM_NOMATCH }, 129dd3d75baSEnji Cooper { "\\a", "\\a", 0, FNM_NOMATCH }, 130dd3d75baSEnji Cooper { "\\", "\\", 0, FNM_NOMATCH }, 131*9404dae2SPedro F. Giffuni { "\\", "", 0, FNM_NOMATCH }, 132dd3d75baSEnji Cooper { "\\*", "\\*", FNM_NOESCAPE, 0 }, 133dd3d75baSEnji Cooper { "\\?", "\\?", FNM_NOESCAPE, 0 }, 134dd3d75baSEnji Cooper { "\\", "\\", FNM_NOESCAPE, 0 }, 135dd3d75baSEnji Cooper { "\\\\", "\\", FNM_NOESCAPE, FNM_NOMATCH }, 136dd3d75baSEnji Cooper { "\\\\", "\\\\", FNM_NOESCAPE, 0 }, 137dd3d75baSEnji Cooper { "*\\*", "foo\\foo", FNM_NOESCAPE, 0 }, 138dd3d75baSEnji Cooper { "*\\*", "foo", FNM_NOESCAPE, FNM_NOMATCH }, 139dd3d75baSEnji Cooper { "*", ".", FNM_PERIOD, FNM_NOMATCH }, 140dd3d75baSEnji Cooper { "?", ".", FNM_PERIOD, FNM_NOMATCH }, 141dd3d75baSEnji Cooper { ".*", ".", 0, 0 }, 142dd3d75baSEnji Cooper { ".*", "..", 0, 0 }, 143dd3d75baSEnji Cooper { ".*", ".a", 0, 0 }, 144dd3d75baSEnji Cooper { "[0-9]", ".", FNM_PERIOD, FNM_NOMATCH }, 145dd3d75baSEnji Cooper { "a*", "a.", 0, 0 }, 146dd3d75baSEnji Cooper { "a/a", "a/a", FNM_PATHNAME, 0 }, 147dd3d75baSEnji Cooper { "a/*", "a/a", FNM_PATHNAME, 0 }, 148dd3d75baSEnji Cooper { "*/a", "a/a", FNM_PATHNAME, 0 }, 149dd3d75baSEnji Cooper { "*/*", "a/a", FNM_PATHNAME, 0 }, 150dd3d75baSEnji Cooper { "a*b/*", "abbb/x", FNM_PATHNAME, 0 }, 151dd3d75baSEnji Cooper { "a*b/*", "abbb/.x", FNM_PATHNAME, 0 }, 152dd3d75baSEnji Cooper { "*", "a/a", FNM_PATHNAME, FNM_NOMATCH }, 153dd3d75baSEnji Cooper { "*/*", "a/a/a", FNM_PATHNAME, FNM_NOMATCH }, 154dd3d75baSEnji Cooper { "b/*", "b/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH }, 155dd3d75baSEnji Cooper { "b*/*", "a/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH }, 156dd3d75baSEnji Cooper { "b/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0 }, 157dd3d75baSEnji Cooper { "b*/.*", "b/.x", FNM_PATHNAME | FNM_PERIOD, 0 }, 158dd3d75baSEnji Cooper { "a", "A", FNM_CASEFOLD, 0 }, 159dd3d75baSEnji Cooper { "A", "a", FNM_CASEFOLD, 0 }, 160dd3d75baSEnji Cooper { "[a]", "A", FNM_CASEFOLD, 0 }, 161dd3d75baSEnji Cooper { "[A]", "a", FNM_CASEFOLD, 0 }, 162dd3d75baSEnji Cooper { "a", "b", FNM_CASEFOLD, FNM_NOMATCH }, 163dd3d75baSEnji Cooper { "a", "a/b", FNM_PATHNAME, FNM_NOMATCH }, 164dd3d75baSEnji Cooper { "*", "a/b", FNM_PATHNAME, FNM_NOMATCH }, 165dd3d75baSEnji Cooper { "*b", "a/b", FNM_PATHNAME, FNM_NOMATCH }, 166dd3d75baSEnji Cooper { "a", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0 }, 167dd3d75baSEnji Cooper { "*", "a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0 }, 168dd3d75baSEnji Cooper { "*", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0 }, 169dd3d75baSEnji Cooper { "*a", ".a/b", FNM_PATHNAME | FNM_LEADING_DIR, 0 }, 170dd3d75baSEnji Cooper { "*", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH }, 171dd3d75baSEnji Cooper { "*a", ".a/b", FNM_PATHNAME | FNM_PERIOD | FNM_LEADING_DIR, FNM_NOMATCH }, 172dd3d75baSEnji Cooper { "a*b/*", "abbb/.x", FNM_PATHNAME | FNM_PERIOD, FNM_NOMATCH }, 173fbf5b9f8SEnji Cooper }; 174