// // Test of wildcard filename match function. // // 2004-07-28 /tvb // #include #include #include // // Shell-like wildcard filename match. // int FileMatch (char *name, char *patt) { int k, n; char *s, *p; char *s1, *p1; char *strnstr(char *s, char *p, int n); int wild; s = name; p = patt; while (1) { // Check for wild card wild = 0; while (*p == '*') { p += 1; wild = 1; } // Check for end conditions if (*p == '\0') { if (*s == '\0' || wild) { break; } return 0; } if (*s == '\0') { return 0; } // Get length of pattern segment to match p1 = strchr(p, '*'); if (p1) { n = p1 - p; } else { n = strlen(p); } if (wild) { // Find pattern segment anywhere in string s1 = strnstr(s, p, n); if (s1 == NULL) { return 0; } k = s1 - s; } else { // Pattern segment must equal string segment if (strncmp(s, p, n) != 0) { return 0; } k = 0; } s += k + n; p += n; } return 1; } // Variant of strstr() with length specified char *strnstr(char *s, char *p, int n) { char *t; for (t = s; *t != '\0'; t += 1) { if (strncmp(t, p, n) == 0) { return t; } } return NULL; } void test (int ok, char *s, char *p) { int b; printf("%-14s %-14s", s, p); b = FileMatch(s, p); printf(" %s", b ? "match" : "miss "); printf(" %s", b == ok ? "pass" : "FAIL!!!"); printf("\n"); return; } void main (int argc, char *argv[]) { test(0, "log", "log*.txt"); test(0, "log.", "log*.txt"); test(1, "log.txt", "log*.txt"); test(1, "log1.txt", "log*.txt"); test(1, "log12.txt", "log*.txt"); test(1, "log123.txt", "log*.txt"); test(1, "log123.txt", "*.txt"); test(1, "log123.txt", "**.txt"); test(1, "log123.txt", "log*.t*t"); test(0, "log123.txt", "log*.tx"); test(1, "log123.txt", "log*.tx*"); test(0, "log123.txt", "log*.txx"); test(1, "log123.txt", "log*.txt*"); test(0, "log123.txt", "log*.txxt"); test(1, "", ""); test(1, "", "*"); test(1, "", "**"); test(0, "", "*log"); test(0, "", "**log"); test(0, "", "log*"); test(0, "", "log**"); test(0, "", "*log*"); test(0, "", "**log**"); test(0, "log", ""); test(1, "log", "*"); test(1, "log", "**"); test(1, "log", "*log"); test(1, "log", "**log"); test(1, "log", "log*"); test(1, "log", "log**"); test(1, "log", "*log*"); test(1, "log", "**log**"); test(1, "abc", "a*b*c"); test(1, "abc", "a*c"); test(1, "a.b.c", "a*b*c"); test(0, "log123.txt", ""); test(0, "log123.txt", "log"); test(0, "log123.txt", ".txt"); test(1, "log123.txt", "*"); test(0, "log123.txt", "*."); test(1, "log123.txt", "*.txt"); test(1, "log123.txt", "*.*"); test(0, "log123.txt", ".*"); test(1, "log123.txt", "*txt"); test(1, "log123.ttxt", "*txt"); test(0, "log123.txt.txt", "*tx"); test(1, "log123.txtxt", "*txt"); test(1, "log123.txt.txt", "*txt"); test(1, "log123.txt.txt", "*txt*txt"); return; }