]>
git.saurik.com Git - apple/libc.git/blob - gen.subproj/fnmatch.c
93bb36138119c33d552b6010de1c45c6d2bbe5bf
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 * Copyright (c) 1989, 1993, 1994
24 * The Regents of the University of California. All rights reserved.
26 * This code is derived from software contributed to Berkeley by
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by the University of
40 * California, Berkeley and its contributors.
41 * 4. Neither the name of the University nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60 * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
61 * Compares a filename or pathname to a pattern.
69 static const char *rangematch
__P((const char *, int, int));
72 fnmatch(pattern
, string
, flags
)
73 const char *pattern
, *string
;
76 const char *stringstart
;
79 for (stringstart
= string
;;)
80 switch (c
= *pattern
++) {
82 return (*string
== EOS
? 0 : FNM_NOMATCH
);
86 if (*string
== '/' && (flags
& FNM_PATHNAME
))
88 if (*string
== '.' && (flags
& FNM_PERIOD
) &&
89 (string
== stringstart
||
90 ((flags
& FNM_PATHNAME
) && *(string
- 1) == '/')))
96 /* Collapse multiple stars. */
100 if (*string
== '.' && (flags
& FNM_PERIOD
) &&
101 (string
== stringstart
||
102 ((flags
& FNM_PATHNAME
) && *(string
- 1) == '/')))
103 return (FNM_NOMATCH
);
105 /* Optimize for pattern with * at end or before /. */
107 if (flags
& FNM_PATHNAME
)
108 return (strchr(string
, '/') == NULL
?
112 else if (c
== '/' && flags
& FNM_PATHNAME
) {
113 if ((string
= strchr(string
, '/')) == NULL
)
114 return (FNM_NOMATCH
);
118 /* General case, use recursion. */
119 while ((test
= *string
) != EOS
) {
120 if (!fnmatch(pattern
, string
, flags
& ~FNM_PERIOD
))
122 if (test
== '/' && flags
& FNM_PATHNAME
)
126 return (FNM_NOMATCH
);
129 return (FNM_NOMATCH
);
130 if (*string
== '/' && flags
& FNM_PATHNAME
)
131 return (FNM_NOMATCH
);
133 rangematch(pattern
, *string
, flags
)) == NULL
)
134 return (FNM_NOMATCH
);
138 if (!(flags
& FNM_NOESCAPE
)) {
139 if ((c
= *pattern
++) == EOS
) {
147 return (FNM_NOMATCH
);
154 rangematch(pattern
, test
, flags
)
162 * A bracket expression starting with an unquoted circumflex
163 * character produces unspecified results (IEEE 1003.2-1992,
164 * 3.13.2). This implementation treats it like '!', for
165 * consistency with the regular expression syntax.
166 * J.T. Conklin (conklin@ngai.kaleida.com)
168 if (negate
= (*pattern
== '!' || *pattern
== '^'))
171 for (ok
= 0; (c
= *pattern
++) != ']';) {
172 if (c
== '\\' && !(flags
& FNM_NOESCAPE
))
177 && (c2
= *(pattern
+1)) != EOS
&& c2
!= ']') {
179 if (c2
== '\\' && !(flags
& FNM_NOESCAPE
))
183 if (c
<= test
&& test
<= c2
)
185 } else if (c
== test
)
188 return (ok
== negate
? NULL
: pattern
);