1 /***********************************************************************
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
13 * Information and Software Systems Research *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
21 ***********************************************************************/
24 * fnmatch implementation
35 int fnm
; /* fnmatch flag */
36 int reg
; /* regex flag */
39 static const Map_t map
[] =
41 FNM_AUGMENTED
, REG_AUGMENTED
,
43 FNM_NOESCAPE
, REG_SHELL_ESCAPED
,
44 FNM_PATHNAME
, REG_SHELL_PATH
,
45 FNM_PERIOD
, REG_SHELL_DOT
,
48 #if defined(__EXPORT__)
49 #define extern __EXPORT__
53 fnmatch(const char* pattern
, const char* subject
, register int flags
)
55 register int reflags
= REG_SHELL
|REG_LEFT
;
56 register const Map_t
* mp
;
60 for (mp
= map
; mp
< &map
[elementsof(map
)]; mp
++)
63 if (flags
& FNM_LEADING_DIR
)
65 if (!(reflags
= regcomp(&re
, pattern
, reflags
)))
67 reflags
= regexec(&re
, subject
, 1, &match
, 0);
69 if (!reflags
&& (reflags
= subject
[match
.rm_eo
]))
70 reflags
= reflags
== '/' ? 0 : FNM_NOMATCH
;
73 else if (!(reflags
= regcomp(&re
, pattern
, reflags
|REG_RIGHT
)))
75 reflags
= regexec(&re
, subject
, 0, NiL
, 0);