annotate lib/fnmatch_loop.c @ 4739:04758f7475fd

Merge changes from glibc.
author Paul Eggert <eggert@cs.ucla.edu>
date Fri, 26 Sep 2003 07:35:01 +0000
parents 6ad23581140d
children c47569f6dfaa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001,
4502
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
2 2002, 2003 Free Software Foundation, Inc.
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* Match STRING against the filename pattern PATTERN, returning zero if
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 it matches, nonzero if not. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 const CHAR *string_end, int no_leading_period, int flags)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 internal_function;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 static const CHAR *END (const CHAR *patternp) internal_function;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 static int
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 internal_function
4643
6ad23581140d Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4502
diff changeset
27 FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
6ad23581140d Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4502
diff changeset
28 int no_leading_period, int flags)
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 register const CHAR *p = pattern, *n = string;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 register UCHAR c;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #ifdef _LIBC
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 # if WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 const char *collseq = (const char *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 const UCHAR *collseq = (const UCHAR *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 while ((c = *p++) != L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 int new_no_leading_period = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 c = FOLD (c);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 switch (c)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 case L('?'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 int res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 res = EXT (c, p, n, string_end, no_leading_period,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 flags);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 if (res != -1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 return res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 if (n == string_end)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 else if (*n == L('/') && (flags & FNM_FILE_NAME))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 else if (*n == L('.') && no_leading_period)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 case L('\\'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 if (!(flags & FNM_NOESCAPE))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 /* Trailing \ loses. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 c = FOLD (c);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 if (n == string_end || FOLD ((UCHAR) *n) != c)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 case L('*'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 int res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 res = EXT (c, p, n, string_end, no_leading_period,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 flags);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 if (res != -1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 return res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 if (n != string_end && *n == L('.') && no_leading_period)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 for (c = *p++; c == L('?') || c == L('*'); c = *p++)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 if (*p == L('(') && (flags & FNM_EXTMATCH) != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 const CHAR *endp = END (p);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 if (endp != p)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 /* This is a pattern. Skip over it. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 p = endp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 continue;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 if (c == L('?'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 /* A ? needs to match one character. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 if (n == string_end)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 /* There isn't another character; no match. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 else if (*n == L('/')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 && __builtin_expect (flags & FNM_FILE_NAME, 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 /* A slash does not match a wildcard under
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 FNM_FILE_NAME. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 /* One character of the string is consumed in matching
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 this ? wildcard, so *??? won't match if there are
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 less than three characters. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 ++n;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 /* The wildcard(s) is/are the last element of the pattern.
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 If the name is a file name and contains another slash
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 this means it cannot match, unless the FNM_LEADING_DIR
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 flag is set. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 if (flags & FNM_FILE_NAME)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 if (flags & FNM_LEADING_DIR)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 result = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 if (MEMCHR (n, L('/'), string_end - n) == NULL)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142 result = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146 return result;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 const CHAR *endp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152 endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L('/') : L('\0'),
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 string_end - n);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 if (endp == NULL)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 endp = string_end;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 if (c == L('[')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158 || (__builtin_expect (flags & FNM_EXTMATCH, 0) != 0
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159 && (c == L('@') || c == L('+') || c == L('!'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160 && *p == L('(')))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 int flags2 = ((flags & FNM_FILE_NAME)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 ? flags : (flags & ~FNM_PERIOD));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164 int no_leading_period2 = no_leading_period;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 for (--p; n < endp; ++n, no_leading_period2 = 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 if (FCT (p, n, string_end, no_leading_period2, flags2)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 else if (c == L('/') && (flags & FNM_FILE_NAME))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 while (n < string_end && *n != L('/'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 ++n;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175 if (n < string_end && *n == L('/')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176 && (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 == 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182 int flags2 = ((flags & FNM_FILE_NAME)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 ? flags : (flags & ~FNM_PERIOD));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184 int no_leading_period2 = no_leading_period;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 if (c == L('\\') && !(flags & FNM_NOESCAPE))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187 c = *p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 c = FOLD (c);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 for (--p; n < endp; ++n, no_leading_period2 = 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 if (FOLD ((UCHAR) *n) == c
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 && (FCT (p, n, string_end, no_leading_period2, flags2)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 == 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 /* If we come here no match is possible with the wildcard. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 case L('['):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 /* Nonzero if the sense of the character class is inverted. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 register int not;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
204 CHAR cold;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
205 UCHAR fn;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
207 if (posixly_correct == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208 posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 if (n == string_end)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
213 if (*n == L('.') && no_leading_period)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216 if (*n == L('/') && (flags & FNM_FILE_NAME))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 /* `/' cannot be matched. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220 not = (*p == L('!') || (posixly_correct < 0 && *p == L('^')));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221 if (not)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224 fn = FOLD ((UCHAR) *n);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
227 for (;;)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 if (!(flags & FNM_NOESCAPE) && c == L('\\'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
231 if (*p == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
232 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
233 c = FOLD ((UCHAR) *p);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
234 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
236 if (c == fn)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
237 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
238 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
239 else if (c == L('[') && *p == L(':'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
240 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
241 /* Leave room for the null. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
242 CHAR str[CHAR_CLASS_MAX_LENGTH + 1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
243 size_t c1 = 0;
3920
678b6b899b7c (WIDE_CHAR_SUPPORT): New macro. Use it uniformly instead of
Jim Meyering <jim@meyering.net>
parents: 3914
diff changeset
244 #if defined _LIBC || WIDE_CHAR_SUPPORT
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
245 wctype_t wt;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
246 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 const CHAR *startp = p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
249 for (;;)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
250 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
251 if (c1 == CHAR_CLASS_MAX_LENGTH)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
252 /* The name is too long and therefore the pattern
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
253 is ill-formed. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
254 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
255
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
256 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
257 if (c == L(':') && p[1] == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
259 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
260 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
261 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
262 if (c < L('a') || c >= L('z'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
263 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
264 /* This cannot possibly be a character class name.
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
265 Match it as a normal range. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
266 p = startp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
267 c = L('[');
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
268 goto normal_bracket;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
269 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
270 str[c1++] = c;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
271 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
272 str[c1] = L('\0');
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
273
3920
678b6b899b7c (WIDE_CHAR_SUPPORT): New macro. Use it uniformly instead of
Jim Meyering <jim@meyering.net>
parents: 3914
diff changeset
274 #if defined _LIBC || WIDE_CHAR_SUPPORT
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
275 wt = IS_CHAR_CLASS (str);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
276 if (wt == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
277 /* Invalid character class name. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
278 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
279
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
280 # if defined _LIBC && ! WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
281 /* The following code is glibc specific but does
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
282 there a good job in speeding up the code since
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
283 we can avoid the btowc() call. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
284 if (_ISCTYPE ((UCHAR) *n, wt))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
285 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
286 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
287 if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
288 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
289 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
290 #else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
291 if ((STREQ (str, L("alnum")) && ISALNUM ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
292 || (STREQ (str, L("alpha")) && ISALPHA ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
293 || (STREQ (str, L("blank")) && ISBLANK ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
294 || (STREQ (str, L("cntrl")) && ISCNTRL ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
295 || (STREQ (str, L("digit")) && ISDIGIT ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296 || (STREQ (str, L("graph")) && ISGRAPH ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
297 || (STREQ (str, L("lower")) && ISLOWER ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
298 || (STREQ (str, L("print")) && ISPRINT ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
299 || (STREQ (str, L("punct")) && ISPUNCT ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
300 || (STREQ (str, L("space")) && ISSPACE ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
301 || (STREQ (str, L("upper")) && ISUPPER ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
302 || (STREQ (str, L("xdigit")) && ISXDIGIT ((UCHAR) *n)))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
303 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
304 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
305 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
306 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
307 #ifdef _LIBC
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
308 else if (c == L('[') && *p == L('='))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
309 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
310 UCHAR str[1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
311 uint32_t nrules =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
312 _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
313 const CHAR *startp = p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
314
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
315 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
316 if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
317 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
318 p = startp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
319 c = L('[');
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
320 goto normal_bracket;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
321 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
322 str[0] = c;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
323
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
324 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
325 if (c != L('=') || p[1] != L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
326 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
327 p = startp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
328 c = L('[');
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
329 goto normal_bracket;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
330 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
331 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
332
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
333 if (nrules == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
334 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
335 if ((UCHAR) *n == str[0])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
336 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
337 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
338 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
339 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
340 const int32_t *table;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
341 # if WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
342 const int32_t *weights;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
343 const int32_t *extra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
344 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
345 const unsigned char *weights;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
346 const unsigned char *extra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
347 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
348 const int32_t *indirect;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
349 int32_t idx;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
350 const UCHAR *cp = (const UCHAR *) str;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
351
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
352 /* This #include defines a local function! */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
353 # if WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
354 # include <locale/weightwc.h>
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
355 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
356 # include <locale/weight.h>
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
357 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
358
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
359 # if WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
360 table = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
361 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
362 weights = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
363 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
364 extra = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
365 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
366 indirect = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
367 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
368 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
369 table = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
370 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
371 weights = (const unsigned char *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
372 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
373 extra = (const unsigned char *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
374 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
375 indirect = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
376 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
377 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
378
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
379 idx = findidx (&cp);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
380 if (idx != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
381 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
382 /* We found a table entry. Now see whether the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
383 character we are currently at has the same
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
384 equivalance class value. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
385 int len = weights[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
386 int32_t idx2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
387 const UCHAR *np = (const UCHAR *) n;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
388
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
389 idx2 = findidx (&np);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
390 if (idx2 != 0 && len == weights[idx2])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
391 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
392 int cnt = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
393
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
394 while (cnt < len
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
395 && (weights[idx + 1 + cnt]
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
396 == weights[idx2 + 1 + cnt]))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
397 ++cnt;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
398
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
399 if (cnt == len)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
400 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
401 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
402 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
403 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
404
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
405 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
406 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
407 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
408 else if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
409 /* [ (unterminated) loses. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
410 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
411 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
412 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
413 int is_range = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
414
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
415 #ifdef _LIBC
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
416 int is_seqval = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
417
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
418 if (c == L('[') && *p == L('.'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
419 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
420 uint32_t nrules =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
421 _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
422 const CHAR *startp = p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
423 size_t c1 = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
424
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
425 while (1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
426 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
427 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
428 if (c == L('.') && p[1] == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
429 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
430 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
431 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
432 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
433 if (c == '\0')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
434 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
435 ++c1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
436 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
437
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
438 /* We have to handling the symbols differently in
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
439 ranges since then the collation sequence is
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
440 important. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
441 is_range = *p == L('-') && p[1] != L('\0');
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
442
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
443 if (nrules == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
444 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
445 /* There are no names defined in the collation
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
446 data. Therefore we only accept the trivial
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
447 names consisting of the character itself. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
448 if (c1 != 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
449 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
450
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
451 if (!is_range && *n == startp[1])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
452 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
453
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
454 cold = startp[1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
455 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
456 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
457 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
458 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
459 int32_t table_size;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
460 const int32_t *symb_table;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
461 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
462 char str[c1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
463 unsigned int strcnt;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
464 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
465 # define str (startp + 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
466 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
467 const unsigned char *extra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
468 int32_t idx;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
469 int32_t elem;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
470 int32_t second;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
471 int32_t hash;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
472
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
473 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
474 /* We have to convert the name to a single-byte
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
475 string. This is possible since the names
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
476 consist of ASCII characters and the internal
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
477 representation is UCS4. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
478 for (strcnt = 0; strcnt < c1; ++strcnt)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
479 str[strcnt] = startp[1 + strcnt];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
480 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
481
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
482 table_size =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
483 _NL_CURRENT_WORD (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
484 _NL_COLLATE_SYMB_HASH_SIZEMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
485 symb_table = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
486 _NL_CURRENT (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
487 _NL_COLLATE_SYMB_TABLEMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
488 extra = (const unsigned char *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
489 _NL_CURRENT (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
490 _NL_COLLATE_SYMB_EXTRAMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
491
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
492 /* Locate the character in the hashing table. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
493 hash = elem_hash (str, c1);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
494
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
495 idx = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
496 elem = hash % table_size;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
497 second = hash % (table_size - 2);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
498 while (symb_table[2 * elem] != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
499 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
500 /* First compare the hashing value. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
501 if (symb_table[2 * elem] == hash
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
502 && c1 == extra[symb_table[2 * elem + 1]]
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
503 && memcmp (str,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
504 &extra[symb_table[2 * elem + 1]
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
505 + 1], c1) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
506 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
507 /* Yep, this is the entry. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
508 idx = symb_table[2 * elem + 1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
509 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
510 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
511 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
512
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
513 /* Next entry. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
514 elem += second;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
515 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
516
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
517 if (symb_table[2 * elem] != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
518 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
519 /* Compare the byte sequence but only if
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
520 this is not part of a range. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
521 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
522 int32_t *wextra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
523
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
524 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
525 /* Adjust for the alignment. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
526 idx = (idx + 3) & ~3;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
527
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
528 wextra = (int32_t *) &extra[idx + 4];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
529 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
530
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
531 if (! is_range)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
532 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
533 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
534 for (c1 = 0; c1 < wextra[idx]; ++c1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
535 if (n[c1] != wextra[1 + c1])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
536 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
537
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
538 if (c1 == wextra[idx])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
539 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
540 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
541 for (c1 = 0; c1 < extra[idx]; ++c1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
542 if (n[c1] != extra[1 + c1])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
543 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
544
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
545 if (c1 == extra[idx])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
546 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
547 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
548 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
549
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
550 /* Get the collation sequence value. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
551 is_seqval = 1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
552 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
553 cold = wextra[1 + wextra[idx]];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
554 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
555 /* Adjust for the alignment. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
556 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
557 idx = (idx + 3) & ~4;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
558 cold = *((int32_t *) &extra[idx]);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
559 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
560
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
561 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
562 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
563 else if (c1 == 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
564 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
565 /* No valid character. Match it as a
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
566 single byte. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
567 if (!is_range && *n == str[0])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
568 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
569
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
570 cold = str[0];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
571 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
572 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
573 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
574 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
575 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
576 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
577 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
578 # undef str
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
579 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
580 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
581 c = FOLD (c);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
582 normal_bracket:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
583
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
584 /* We have to handling the symbols differently in
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
585 ranges since then the collation sequence is
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
586 important. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
587 is_range = (*p == L('-') && p[1] != L('\0')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
588 && p[1] != L(']'));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
589
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
590 if (!is_range && c == fn)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
591 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
592
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
593 cold = c;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
594 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
595 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
596
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
597 if (c == L('-') && *p != L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
598 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
599 #if _LIBC
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
600 /* We have to find the collation sequence
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
601 value for C. Collation sequence is nothing
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
602 we can regularly access. The sequence
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
603 value is defined by the order in which the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
604 definitions of the collation values for the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
605 various characters appear in the source
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
606 file. A strange concept, nowhere
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
607 documented. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
608 uint32_t fcollseq;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
609 uint32_t lcollseq;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
610 UCHAR cend = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
611
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
612 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
613 /* Search in the `names' array for the characters. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
614 fcollseq = collseq_table_lookup (collseq, fn);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
615 if (fcollseq == ~((uint32_t) 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
616 /* XXX We don't know anything about the character
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
617 we are supposed to match. This means we are
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
618 failing. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
619 goto range_not_matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
620
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
621 if (is_seqval)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
622 lcollseq = cold;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
623 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
624 lcollseq = collseq_table_lookup (collseq, cold);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
625 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
626 fcollseq = collseq[fn];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
627 lcollseq = is_seqval ? cold : collseq[(UCHAR) cold];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
628 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
629
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
630 is_seqval = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
631 if (cend == L('[') && *p == L('.'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
632 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
633 uint32_t nrules =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
634 _NL_CURRENT_WORD (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
635 _NL_COLLATE_NRULES);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
636 const CHAR *startp = p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
637 size_t c1 = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
638
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
639 while (1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
640 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
641 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
642 if (c == L('.') && p[1] == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
643 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
644 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
645 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
646 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
647 if (c == '\0')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
648 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
649 ++c1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
650 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
651
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
652 if (nrules == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
653 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
654 /* There are no names defined in the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
655 collation data. Therefore we only
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
656 accept the trivial names consisting
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
657 of the character itself. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
658 if (c1 != 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
659 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
660
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
661 cend = startp[1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
662 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
663 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
664 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
665 int32_t table_size;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
666 const int32_t *symb_table;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
667 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
668 char str[c1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
669 unsigned int strcnt;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
670 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
671 # define str (startp + 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
672 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
673 const unsigned char *extra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
674 int32_t idx;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
675 int32_t elem;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
676 int32_t second;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
677 int32_t hash;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
678
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
679 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
680 /* We have to convert the name to a single-byte
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
681 string. This is possible since the names
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
682 consist of ASCII characters and the internal
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
683 representation is UCS4. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
684 for (strcnt = 0; strcnt < c1; ++strcnt)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
685 str[strcnt] = startp[1 + strcnt];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
686 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
687
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
688 table_size =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
689 _NL_CURRENT_WORD (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
690 _NL_COLLATE_SYMB_HASH_SIZEMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
691 symb_table = (const int32_t *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
692 _NL_CURRENT (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
693 _NL_COLLATE_SYMB_TABLEMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
694 extra = (const unsigned char *)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
695 _NL_CURRENT (LC_COLLATE,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
696 _NL_COLLATE_SYMB_EXTRAMB);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
697
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
698 /* Locate the character in the hashing
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
699 table. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
700 hash = elem_hash (str, c1);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
701
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
702 idx = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
703 elem = hash % table_size;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
704 second = hash % (table_size - 2);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
705 while (symb_table[2 * elem] != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
706 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
707 /* First compare the hashing value. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
708 if (symb_table[2 * elem] == hash
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
709 && (c1
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
710 == extra[symb_table[2 * elem + 1]])
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
711 && memcmp (str,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
712 &extra[symb_table[2 * elem + 1]
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
713 + 1], c1) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
714 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
715 /* Yep, this is the entry. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
716 idx = symb_table[2 * elem + 1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
717 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
718 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
719 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
720
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
721 /* Next entry. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
722 elem += second;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
723 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
724
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
725 if (symb_table[2 * elem] != 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
726 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
727 /* Compare the byte sequence but only if
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
728 this is not part of a range. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
729 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
730 int32_t *wextra;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
731
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
732 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
733 /* Adjust for the alignment. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
734 idx = (idx + 3) & ~4;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
735
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
736 wextra = (int32_t *) &extra[idx + 4];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
737 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
738 /* Get the collation sequence value. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
739 is_seqval = 1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
740 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
741 cend = wextra[1 + wextra[idx]];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
742 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
743 /* Adjust for the alignment. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
744 idx += 1 + extra[idx];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
745 idx = (idx + 3) & ~4;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
746 cend = *((int32_t *) &extra[idx]);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
747 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
748 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
749 else if (symb_table[2 * elem] != 0 && c1 == 1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
750 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
751 cend = str[0];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
752 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
753 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
754 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
755 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
756 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
757 # undef str
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
758 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
759 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
760 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
761 if (!(flags & FNM_NOESCAPE) && cend == L('\\'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
762 cend = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
763 if (cend == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
764 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
765 cend = FOLD (cend);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
766 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
767
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
768 /* XXX It is not entirely clear to me how to handle
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
769 characters which are not mentioned in the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
770 collation specification. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
771 if (
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
772 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
773 lcollseq == 0xffffffff ||
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
774 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
775 lcollseq <= fcollseq)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
776 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
777 /* We have to look at the upper bound. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
778 uint32_t hcollseq;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
779
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
780 if (is_seqval)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
781 hcollseq = cend;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
782 else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
783 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
784 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
785 hcollseq =
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
786 collseq_table_lookup (collseq, cend);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
787 if (hcollseq == ~((uint32_t) 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
788 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
789 /* Hum, no information about the upper
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
790 bound. The matching succeeds if the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
791 lower bound is matched exactly. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
792 if (lcollseq != fcollseq)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
793 goto range_not_matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
794
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
795 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
796 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
797 # else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
798 hcollseq = collseq[cend];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
799 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
800 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
801
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
802 if (lcollseq <= hcollseq && fcollseq <= hcollseq)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
803 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
804 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
805 # ifdef WIDE_CHAR_VERSION
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
806 range_not_matched:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
807 # endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
808 #else
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
809 /* We use a boring value comparison of the character
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
810 values. This is better than comparing using
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
811 `strcoll' since the latter would have surprising
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
812 and sometimes fatal consequences. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
813 UCHAR cend = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
814
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
815 if (!(flags & FNM_NOESCAPE) && cend == L('\\'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
816 cend = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
817 if (cend == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
818 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
819
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
820 /* It is a range. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
821 if (cold <= fn && fn <= cend)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
822 goto matched;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
823 #endif
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
824
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
825 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
826 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
827 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
828
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
829 if (c == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
830 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
831 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
832
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
833 if (!not)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
834 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
835 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
836
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
837 matched:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
838 /* Skip the rest of the [...] that already matched. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
839 do
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
840 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
841 ignore_next:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
842 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
843
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
844 if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
845 /* [... (unterminated) loses. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
846 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
847
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
848 if (!(flags & FNM_NOESCAPE) && c == L('\\'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
849 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
850 if (*p == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
851 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
852 /* XXX 1003.2d11 is unclear if this is right. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
853 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
854 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
855 else if (c == L('[') && *p == L(':'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
856 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
857 int c1 = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
858 const CHAR *startp = p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
859
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
860 while (1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
861 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
862 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
863 if (++c1 == CHAR_CLASS_MAX_LENGTH)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
864 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
865
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
866 if (*p == L(':') && p[1] == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
867 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
868
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
869 if (c < L('a') || c >= L('z'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
870 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
871 p = startp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
872 goto ignore_next;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
873 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
874 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
875 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
876 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
877 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
878 else if (c == L('[') && *p == L('='))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
879 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
880 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
881 if (c == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
882 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
883 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
884 if (c != L('=') || p[1] != L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
885 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
886 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
887 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
888 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
889 else if (c == L('[') && *p == L('.'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
890 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
891 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
892 while (1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
893 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
894 c = *++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
895 if (c == '\0')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
896 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
897
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
898 if (*p == L('.') && p[1] == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
899 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
900 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
901 p += 2;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
902 c = *p++;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
903 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
904 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
905 while (c != L(']'));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
906 if (not)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
907 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
908 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
909 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
910
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
911 case L('+'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
912 case L('@'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
913 case L('!'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
914 if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
915 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
916 int res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
917
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
918 res = EXT (c, p, n, string_end, no_leading_period, flags);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
919 if (res != -1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
920 return res;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
921 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
922 goto normal_match;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
923
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
924 case L('/'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
925 if (NO_LEADING_PERIOD (flags))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
926 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
927 if (n == string_end || c != *n)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
928 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
929
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
930 new_no_leading_period = 1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
931 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
932 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
933 /* FALLTHROUGH */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
934 default:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
935 normal_match:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
936 if (n == string_end || c != FOLD ((UCHAR) *n))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
937 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
938 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
939
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
940 no_leading_period = new_no_leading_period;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
941 ++n;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
942 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
943
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
944 if (n == string_end)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
945 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
946
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
947 if ((flags & FNM_LEADING_DIR) && n != string_end && *n == L('/'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
948 /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
949 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
950
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
951 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
952 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
953
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
954
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
955 static const CHAR *
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
956 internal_function
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
957 END (const CHAR *pattern)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
958 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
959 const CHAR *p = pattern;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
960
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
961 while (1)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
962 if (*++p == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
963 /* This is an invalid pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
964 return pattern;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
965 else if (*p == L('['))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
966 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
967 /* Handle brackets special. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
968 if (posixly_correct == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
969 posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
970
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
971 /* Skip the not sign. We have to recognize it because of a possibly
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
972 following ']'. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
973 if (*++p == L('!') || (posixly_correct < 0 && *p == L('^')))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
974 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
975 /* A leading ']' is recognized as such. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
976 if (*p == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
977 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
978 /* Skip over all characters of the list. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
979 while (*p != L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
980 if (*p++ == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
981 /* This is no valid pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
982 return pattern;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
983 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
984 else if ((*p == L('?') || *p == L('*') || *p == L('+') || *p == L('@')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
985 || *p == L('!')) && p[1] == L('('))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
986 p = END (p + 1);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
987 else if (*p == L(')'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
988 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
989
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
990 return p + 1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
991 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
992
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
993
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
994 static int
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
995 internal_function
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
996 EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
997 int no_leading_period, int flags)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
998 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
999 const CHAR *startp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1000 int level;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1001 struct patternlist
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1002 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1003 struct patternlist *next;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1004 CHAR str[1];
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1005 } *list = NULL;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1006 struct patternlist **lastp = &list;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1007 size_t pattern_len = STRLEN (pattern);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1008 const CHAR *p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1009 const CHAR *rs;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1010
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1011 /* Parse the pattern. Store the individual parts in the list. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1012 level = 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1013 for (startp = p = pattern + 1; level >= 0; ++p)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1014 if (*p == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1015 /* This is an invalid pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1016 return -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1017 else if (*p == L('['))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1018 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1019 /* Handle brackets special. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1020 if (posixly_correct == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1021 posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1022
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1023 /* Skip the not sign. We have to recognize it because of a possibly
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1024 following ']'. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1025 if (*++p == L('!') || (posixly_correct < 0 && *p == L('^')))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1026 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1027 /* A leading ']' is recognized as such. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1028 if (*p == L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1029 ++p;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1030 /* Skip over all characters of the list. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1031 while (*p != L(']'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1032 if (*p++ == L('\0'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1033 /* This is no valid pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1034 return -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1035 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1036 else if ((*p == L('?') || *p == L('*') || *p == L('+') || *p == L('@')
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1037 || *p == L('!')) && p[1] == L('('))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1038 /* Remember the nesting level. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1039 ++level;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1040 else if (*p == L(')'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1041 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1042 if (level-- == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1043 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1044 /* This means we found the end of the pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1045 #define NEW_PATTERN \
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1046 struct patternlist *newp; \
4502
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1047 size_t plen; \
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1048 \
4502
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1049 plen = (opt == L('?') || opt == L('@') \
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1050 ? pattern_len \
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1051 : p - startp + 1); \
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1052 newp = (struct patternlist *) \
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1053 alloca (offsetof (struct patternlist, str) \
83b0c8b8ce8f (NEW_PATTERN): Cast alloca return value to proper type.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3920
diff changeset
1054 + (plen * sizeof (CHAR))); \
3914
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1055 *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1056 newp->next = NULL; \
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1057 *lastp = newp; \
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1058 lastp = &newp->next
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1059 NEW_PATTERN;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1060 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1061 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1062 else if (*p == L('|'))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1063 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1064 if (level == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1065 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1066 NEW_PATTERN;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1067 startp = p + 1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1068 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1069 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1070 assert (list != NULL);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1071 assert (p[-1] == L(')'));
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1072 #undef NEW_PATTERN
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1073
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1074 switch (opt)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1075 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1076 case L('*'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1077 if (FCT (p, string, string_end, no_leading_period, flags) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1078 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1079 /* FALLTHROUGH */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1080
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1081 case L('+'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1082 do
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1083 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1084 for (rs = string; rs <= string_end; ++rs)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1085 /* First match the prefix with the current pattern with the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1086 current pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1087 if (FCT (list->str, string, rs, no_leading_period,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1088 flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1089 /* This was successful. Now match the rest with the rest
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1090 of the pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1091 && (FCT (p, rs, string_end,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1092 rs == string
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1093 ? no_leading_period
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1094 : rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1095 flags & FNM_FILE_NAME
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1096 ? flags : flags & ~FNM_PERIOD) == 0
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1097 /* This didn't work. Try the whole pattern. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1098 || (rs != string
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1099 && FCT (pattern - 1, rs, string_end,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1100 rs == string
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1101 ? no_leading_period
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1102 : (rs[-1] == '/' && NO_LEADING_PERIOD (flags)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1103 ? 1 : 0),
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1104 flags & FNM_FILE_NAME
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1105 ? flags : flags & ~FNM_PERIOD) == 0)))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1106 /* It worked. Signal success. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1107 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1108 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1109 while ((list = list->next) != NULL);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1110
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1111 /* None of the patterns lead to a match. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1112 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1113
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1114 case L('?'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1115 if (FCT (p, string, string_end, no_leading_period, flags) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1116 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1117 /* FALLTHROUGH */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1118
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1119 case L('@'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1120 do
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1121 /* I cannot believe it but `strcat' is actually acceptable
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1122 here. Match the entire string with the prefix from the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1123 pattern list and the rest of the pattern following the
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1124 pattern list. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1125 if (FCT (STRCAT (list->str, p), string, string_end,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1126 no_leading_period,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1127 flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1128 /* It worked. Signal success. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1129 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1130 while ((list = list->next) != NULL);
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1131
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1132 /* None of the patterns lead to a match. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1133 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1134
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1135 case L('!'):
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1136 for (rs = string; rs <= string_end; ++rs)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1137 {
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1138 struct patternlist *runp;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1139
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1140 for (runp = list; runp != NULL; runp = runp->next)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1141 if (FCT (runp->str, string, rs, no_leading_period,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1142 flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1143 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1144
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1145 /* If none of the patterns matched see whether the rest does. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1146 if (runp == NULL
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1147 && (FCT (p, rs, string_end,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1148 rs == string
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1149 ? no_leading_period
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1150 : rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0,
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1151 flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD)
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1152 == 0))
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1153 /* This is successful. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1154 return 0;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1155 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1156
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1157 /* None of the patterns together with the rest of the pattern
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1158 lead to a match. */
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1159 return FNM_NOMATCH;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1160
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1161 default:
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1162 assert (! "Invalid extended matching operator");
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1163 break;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1164 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1165
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1166 return -1;
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1167 }
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1168
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1169
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1170 #undef FOLD
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1171 #undef CHAR
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1172 #undef UCHAR
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1173 #undef INT
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1174 #undef FCT
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1175 #undef EXT
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1176 #undef END
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1177 #undef MEMPCPY
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1178 #undef MEMCHR
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1179 #undef STRCOLL
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1180 #undef STRLEN
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1181 #undef STRCAT
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1182 #undef L
554b8e360216 from libc
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1183 #undef BTOWC