xref: /minix3/external/bsd/libarchive/dist/cpio/test/test_pathmatch.c (revision 543adbed3a3a783ed36434adafbc258b6bde442d)
1*543adbedSBen Gras /*-
2*543adbedSBen Gras  * Copyright (c) 2003-2007 Tim Kientzle
3*543adbedSBen Gras  * All rights reserved.
4*543adbedSBen Gras  *
5*543adbedSBen Gras  * Redistribution and use in source and binary forms, with or without
6*543adbedSBen Gras  * modification, are permitted provided that the following conditions
7*543adbedSBen Gras  * are met:
8*543adbedSBen Gras  * 1. Redistributions of source code must retain the above copyright
9*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer.
10*543adbedSBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
11*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer in the
12*543adbedSBen Gras  *    documentation and/or other materials provided with the distribution.
13*543adbedSBen Gras  *
14*543adbedSBen Gras  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15*543adbedSBen Gras  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16*543adbedSBen Gras  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17*543adbedSBen Gras  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18*543adbedSBen Gras  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19*543adbedSBen Gras  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20*543adbedSBen Gras  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21*543adbedSBen Gras  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22*543adbedSBen Gras  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23*543adbedSBen Gras  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24*543adbedSBen Gras  */
25*543adbedSBen Gras #include "test.h"
26*543adbedSBen Gras __FBSDID("$FreeBSD$");
27*543adbedSBen Gras 
28*543adbedSBen Gras #include "pathmatch.h"
29*543adbedSBen Gras 
30*543adbedSBen Gras /*
31*543adbedSBen Gras  * Verify that the pattern matcher implements the wildcard logic specified
32*543adbedSBen Gras  * in SUSv2 for the cpio command.  This is essentially the
33*543adbedSBen Gras  * shell glob syntax:
34*543adbedSBen Gras  *   * - matches any sequence of chars, including '/'
35*543adbedSBen Gras  *   ? - matches any single char, including '/'
36*543adbedSBen Gras  *   [...] - matches any of a set of chars, '-' specifies a range,
37*543adbedSBen Gras  *        initial '!' is undefined
38*543adbedSBen Gras  *
39*543adbedSBen Gras  * The specification in SUSv2 is a bit incomplete, I assume the following:
40*543adbedSBen Gras  *   Trailing '-' in [...] is not special.
41*543adbedSBen Gras  *
42*543adbedSBen Gras  * TODO: Figure out if there's a good way to extend this to handle
43*543adbedSBen Gras  * Windows paths that use '\' as a path separator.  <sigh>
44*543adbedSBen Gras  */
45*543adbedSBen Gras 
DEFINE_TEST(test_pathmatch)46*543adbedSBen Gras DEFINE_TEST(test_pathmatch)
47*543adbedSBen Gras {
48*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a/b/c", "a/b/c", 0));
49*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/b/", "a/b/c", 0));
50*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/b", "a/b/c", 0));
51*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b/", 0));
52*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/b/c", "a/b", 0));
53*543adbedSBen Gras 
54*543adbedSBen Gras 	/* Empty pattern only matches empty string. */
55*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("","", 0));
56*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("","a", 0));
57*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*","", 0));
58*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*","a", 0));
59*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*","abcd", 0));
60*543adbedSBen Gras 	/* SUSv2: * matches / */
61*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*","abcd/efgh/ijkl", 0));
62*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0));
63*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0));
64*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0));
65*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("?", "", 0));
66*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("?", "\0", 0));
67*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("?", "a", 0));
68*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("?", "ab", 0));
69*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("?", ".", 0));
70*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("?", "?", 0));
71*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a", "a", 0));
72*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
73*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a", "ab", 0));
74*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a?c", "abc", 0));
75*543adbedSBen Gras 	/* SUSv2: ? matches / */
76*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a?c", "a/c", 0));
77*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a?*c*", "a/c", 0));
78*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*a*", "a/c", 0));
79*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*a*", "/a/c", 0));
80*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("*a*", "defaaaaaaa", 0));
81*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a*", "defghi", 0));
82*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("*a*", "defghi", 0));
83*543adbedSBen Gras 
84*543adbedSBen Gras 	/* Character classes */
85*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[def", "abc[def", 0));
86*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[def]", "abc[def", 0));
87*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[def", "abcd", 0));
88*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[def]", "abcd", 0));
89*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[def]", "abce", 0));
90*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[def]", "abcf", 0));
91*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[def]", "abcg", 0));
92*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abcd", 0));
93*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d*f]", "abc*", 0));
94*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d*f]", "abcdefghi", 0));
95*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d*", "abcdefghi", 0));
96*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d*", "abc[defghi", 0));
97*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcd", 0));
98*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abce", 0));
99*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-f]", "abcf", 0));
100*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-f]", "abcg", 0));
101*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abca", 0));
102*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcd", 0));
103*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abce", 0));
104*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcf", 0));
105*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcg", 0));
106*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abch", 0));
107*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abci", 0));
108*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abcj", 0));
109*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-k]", "abck", 0));
110*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abcl", 0));
111*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-fh-k]", "abc-", 0));
112*543adbedSBen Gras 
113*543adbedSBen Gras 	/* [] matches nothing, [!] is the same as ? */
114*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcdefg", 0));
115*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcqefg", 0));
116*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[]efg", "abcefg", 0));
117*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcdefg", 0));
118*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!]efg", "abcqefg", 0));
119*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[!]efg", "abcefg", 0));
120*543adbedSBen Gras 
121*543adbedSBen Gras 	/* I assume: Trailing '-' is non-special. */
122*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d-fh-]", "abcl", 0));
123*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abch", 0));
124*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
125*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-fh-]", "abc-", 0));
126*543adbedSBen Gras 
127*543adbedSBen Gras 	/* ']' can be backslash-quoted within a character class. */
128*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\]]", "abc]", 0));
129*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abc]", 0));
130*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\]d]", "abcd", 0));
131*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abc]", 0));
132*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d\\]]", "abcd", 0));
133*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d]e]", "abcde]", 0));
134*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d\\]e]", "abc]", 0));
135*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d\\]e]", "abcd]e", 0));
136*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d]e]", "abc]", 0));
137*543adbedSBen Gras 
138*543adbedSBen Gras 	/* backslash-quoted chars can appear as either end of a range. */
139*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\d-f]gh", "abcegh", 0));
140*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abcggh", 0));
141*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[\\d-f]gh", "abc\\gh", 0));
142*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d-\\f]gh", "abcegh", 0));
143*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
144*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
145*543adbedSBen Gras 	/* backslash-quoted '-' isn't special. */
146*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[d\\-f]gh", "abcegh", 0));
147*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[d\\-f]gh", "abc-gh", 0));
148*543adbedSBen Gras 
149*543adbedSBen Gras 	/* Leading '!' negates a character class. */
150*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[!d]", "abcd", 0));
151*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!d]", "abce", 0));
152*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!d]", "abcc", 0));
153*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[!d-z]", "abcq", 0));
154*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!d-gi-z]", "abch", 0));
155*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc[!fgijkl]", "abch", 0));
156*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc[!fghijkl]", "abch", 0));
157*543adbedSBen Gras 
158*543adbedSBen Gras 	/* Backslash quotes next character. */
159*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc\\[def]", "abc\\d", 0));
160*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc\\[def]", "abc[def]", 0));
161*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc[def]", 0));
162*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abc\\\\[def]", "abc\\[def]", 0));
163*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc\\\\[def]", "abc\\d", 0));
164*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abcd\\", "abcd\\", 0));
165*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abcd\\", "abcd\\[", 0));
166*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abcd\\", "abcde", 0));
167*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("abcd\\[", "abcd\\", 0));
168*543adbedSBen Gras 
169*543adbedSBen Gras 	/*
170*543adbedSBen Gras 	 * Because '.' and '/' have special meanings, we can
171*543adbedSBen Gras 	 * identify many equivalent paths even if they're expressed
172*543adbedSBen Gras 	 * differently.  (But quoting a character with '\\' suppresses
173*543adbedSBen Gras 	 * special meanings!)
174*543adbedSBen Gras 	 */
175*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/b/", "a/bc", 0));
176*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("a/./b", "a/b", 0));
177*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a\\/./b", "a/b", 0));
178*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/\\./b", "a/b", 0));
179*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a/.\\/b", "a/b", 0));
180*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("a\\/\\.\\/b", "a/b", 0));
181*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def/", 0));
182*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc/def", "./././abc/./def", 0));
183*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("abc/def/././//", "./././abc/./def/", 0));
184*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch(".////abc/.//def", "./././abc/./def", 0));
185*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc?def/", "abc/def/", 0));
186*543adbedSBen Gras 	failure("\"?./\" is not the same as \"/./\"");
187*543adbedSBen Gras 	assertEqualInt(0, lafe_pathmatch("./abc?./def/", "abc/def/", 0));
188*543adbedSBen Gras 	failure("Trailing '/' should match no trailing '/'");
189*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def/", "abc/def", 0));
190*543adbedSBen Gras 	failure("Trailing '/./' is still the same directory.");
191*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def/./", "abc/def", 0));
192*543adbedSBen Gras 	failure("Trailing '/.' is still the same directory.");
193*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def/.", "abc/def", 0));
194*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/", 0));
195*543adbedSBen Gras 	failure("Trailing '/./' is still the same directory.");
196*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc/./def", "abc/def/./", 0));
197*543adbedSBen Gras 	failure("Trailing '/.' is still the same directory.");
198*543adbedSBen Gras 	assertEqualInt(1, lafe_pathmatch("./abc*/./def", "abc/def/.", 0));
199*543adbedSBen Gras 
200*543adbedSBen Gras 	/* Matches not anchored at beginning. */
201*543adbedSBen Gras 	assertEqualInt(0,
202*543adbedSBen Gras 	    lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
203*543adbedSBen Gras 	assertEqualInt(1,
204*543adbedSBen Gras 	    lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_START));
205*543adbedSBen Gras 	assertEqualInt(0,
206*543adbedSBen Gras 	    lafe_pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
207*543adbedSBen Gras 	assertEqualInt(1,
208*543adbedSBen Gras 	    lafe_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
209*543adbedSBen Gras 	assertEqualInt(0,
210*543adbedSBen Gras 	    lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
211*543adbedSBen Gras 	assertEqualInt(0,
212*543adbedSBen Gras 	    lafe_pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
213*543adbedSBen Gras 
214*543adbedSBen Gras 	/* Matches not anchored at end. */
215*543adbedSBen Gras 	assertEqualInt(0,
216*543adbedSBen Gras 	    lafe_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END));
217*543adbedSBen Gras 	assertEqualInt(1,
218*543adbedSBen Gras 	    lafe_pathmatch("abcd", "abcd", PATHMATCH_NO_ANCHOR_END));
219*543adbedSBen Gras 	assertEqualInt(1,
220*543adbedSBen Gras 	    lafe_pathmatch("abcd", "abcd/", PATHMATCH_NO_ANCHOR_END));
221*543adbedSBen Gras 	assertEqualInt(1,
222*543adbedSBen Gras 	    lafe_pathmatch("abcd", "abcd/.", PATHMATCH_NO_ANCHOR_END));
223*543adbedSBen Gras 	assertEqualInt(0,
224*543adbedSBen Gras 	    lafe_pathmatch("abc", "abcd", PATHMATCH_NO_ANCHOR_END));
225*543adbedSBen Gras 	assertEqualInt(1,
226*543adbedSBen Gras 	    lafe_pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
227*543adbedSBen Gras 	assertEqualInt(0,
228*543adbedSBen Gras 	    lafe_pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
229*543adbedSBen Gras 	assertEqualInt(1,
230*543adbedSBen Gras 	    lafe_pathmatch("a/b/c$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
231*543adbedSBen Gras 	assertEqualInt(1,
232*543adbedSBen Gras 	    lafe_pathmatch("a/b/c$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
233*543adbedSBen Gras 	assertEqualInt(1,
234*543adbedSBen Gras 	    lafe_pathmatch("a/b/c/", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
235*543adbedSBen Gras 	assertEqualInt(0,
236*543adbedSBen Gras 	    lafe_pathmatch("a/b/c/$", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
237*543adbedSBen Gras 	assertEqualInt(1,
238*543adbedSBen Gras 	    lafe_pathmatch("a/b/c/$", "a/b/c/", PATHMATCH_NO_ANCHOR_END));
239*543adbedSBen Gras 	assertEqualInt(1,
240*543adbedSBen Gras 	    lafe_pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
241*543adbedSBen Gras 	assertEqualInt(0,
242*543adbedSBen Gras 	    lafe_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
243*543adbedSBen Gras }
244