1
/* -*- buffer-read-only: t -*- vi: set ro: */
2
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
4
/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5
2003, 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
6
This file is part of the GNU C Library.
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software Foundation,
20
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
22
/* Match STRING against the file name pattern PATTERN, returning zero if
23
it matches, nonzero if not. */
24
static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
25
const CHAR *string_end, bool no_leading_period, int flags)
27
static const CHAR *END (const CHAR *patternp) internal_function;
31
FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
32
bool no_leading_period, int flags)
34
register const CHAR *p = pattern, *n = string;
37
# if WIDE_CHAR_VERSION
38
const char *collseq = (const char *)
39
_NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
41
const UCHAR *collseq = (const UCHAR *)
42
_NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB);
46
while ((c = *p++) != L_('\0'))
48
bool new_no_leading_period = false;
54
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
58
res = EXT (c, p, n, string_end, no_leading_period,
66
else if (*n == L_('/') && (flags & FNM_FILE_NAME))
68
else if (*n == L_('.') && no_leading_period)
73
if (!(flags & FNM_NOESCAPE))
77
/* Trailing \ loses. */
81
if (n == string_end || FOLD ((UCHAR) *n) != c)
86
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
90
res = EXT (c, p, n, string_end, no_leading_period,
96
if (n != string_end && *n == L_('.') && no_leading_period)
99
for (c = *p++; c == L_('?') || c == L_('*'); c = *p++)
101
if (*p == L_('(') && (flags & FNM_EXTMATCH) != 0)
103
const CHAR *endp = END (p);
106
/* This is a pattern. Skip over it. */
114
/* A ? needs to match one character. */
116
/* There isn't another character; no match. */
118
else if (*n == L_('/')
119
&& __builtin_expect (flags & FNM_FILE_NAME, 0))
120
/* A slash does not match a wildcard under
124
/* One character of the string is consumed in matching
125
this ? wildcard, so *??? won't match if there are
126
less than three characters. */
132
/* The wildcard(s) is/are the last element of the pattern.
133
If the name is a file name and contains another slash
134
this means it cannot match, unless the FNM_LEADING_DIR
137
int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
139
if (flags & FNM_FILE_NAME)
141
if (flags & FNM_LEADING_DIR)
145
if (MEMCHR (n, L_('/'), string_end - n) == NULL)
156
endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L_('/') : L_('\0'),
162
|| (__builtin_expect (flags & FNM_EXTMATCH, 0) != 0
163
&& (c == L_('@') || c == L_('+') || c == L_('!'))
166
int flags2 = ((flags & FNM_FILE_NAME)
167
? flags : (flags & ~FNM_PERIOD));
168
bool no_leading_period2 = no_leading_period;
170
for (--p; n < endp; ++n, no_leading_period2 = false)
171
if (FCT (p, n, string_end, no_leading_period2, flags2)
175
else if (c == L_('/') && (flags & FNM_FILE_NAME))
177
while (n < string_end && *n != L_('/'))
179
if (n < string_end && *n == L_('/')
180
&& (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags)
186
int flags2 = ((flags & FNM_FILE_NAME)
187
? flags : (flags & ~FNM_PERIOD));
188
int no_leading_period2 = no_leading_period;
190
if (c == L_('\\') && !(flags & FNM_NOESCAPE))
193
for (--p; n < endp; ++n, no_leading_period2 = false)
194
if (FOLD ((UCHAR) *n) == c
195
&& (FCT (p, n, string_end, no_leading_period2, flags2)
201
/* If we come here no match is possible with the wildcard. */
206
/* Nonzero if the sense of the character class is inverted. */
211
if (posixly_correct == 0)
212
posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
217
if (*n == L_('.') && no_leading_period)
220
if (*n == L_('/') && (flags & FNM_FILE_NAME))
221
/* `/' cannot be matched. */
224
not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
228
fn = FOLD ((UCHAR) *n);
233
if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
237
c = FOLD ((UCHAR) *p);
242
else if (c == L_('[') && *p == L_(':'))
244
/* Leave room for the null. */
245
CHAR str[CHAR_CLASS_MAX_LENGTH + 1];
247
#if defined _LIBC || WIDE_CHAR_SUPPORT
250
const CHAR *startp = p;
254
if (c1 == CHAR_CLASS_MAX_LENGTH)
255
/* The name is too long and therefore the pattern
260
if (c == L_(':') && p[1] == L_(']'))
265
if (c < L_('a') || c >= L_('z'))
267
/* This cannot possibly be a character class name.
268
Match it as a normal range. */
277
#if defined _LIBC || WIDE_CHAR_SUPPORT
278
wt = IS_CHAR_CLASS (str);
280
/* Invalid character class name. */
283
# if defined _LIBC && ! WIDE_CHAR_VERSION
284
/* The following code is glibc specific but does
285
there a good job in speeding up the code since
286
we can avoid the btowc() call. */
287
if (_ISCTYPE ((UCHAR) *n, wt))
290
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
294
if ((STREQ (str, L_("alnum")) && isalnum ((UCHAR) *n))
295
|| (STREQ (str, L_("alpha")) && isalpha ((UCHAR) *n))
296
|| (STREQ (str, L_("blank")) && isblank ((UCHAR) *n))
297
|| (STREQ (str, L_("cntrl")) && iscntrl ((UCHAR) *n))
298
|| (STREQ (str, L_("digit")) && isdigit ((UCHAR) *n))
299
|| (STREQ (str, L_("graph")) && isgraph ((UCHAR) *n))
300
|| (STREQ (str, L_("lower")) && islower ((UCHAR) *n))
301
|| (STREQ (str, L_("print")) && isprint ((UCHAR) *n))
302
|| (STREQ (str, L_("punct")) && ispunct ((UCHAR) *n))
303
|| (STREQ (str, L_("space")) && isspace ((UCHAR) *n))
304
|| (STREQ (str, L_("upper")) && isupper ((UCHAR) *n))
305
|| (STREQ (str, L_("xdigit")) && isxdigit ((UCHAR) *n)))
311
else if (c == L_('[') && *p == L_('='))
315
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
316
const CHAR *startp = p;
328
if (c != L_('=') || p[1] != L_(']'))
338
if ((UCHAR) *n == str[0])
343
const int32_t *table;
344
# if WIDE_CHAR_VERSION
345
const int32_t *weights;
346
const int32_t *extra;
348
const unsigned char *weights;
349
const unsigned char *extra;
351
const int32_t *indirect;
353
const UCHAR *cp = (const UCHAR *) str;
355
/* This #include defines a local function! */
356
# if WIDE_CHAR_VERSION
357
# include <locale/weightwc.h>
359
# include <locale/weight.h>
362
# if WIDE_CHAR_VERSION
363
table = (const int32_t *)
364
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
365
weights = (const int32_t *)
366
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
367
extra = (const int32_t *)
368
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
369
indirect = (const int32_t *)
370
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
372
table = (const int32_t *)
373
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
374
weights = (const unsigned char *)
375
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
376
extra = (const unsigned char *)
377
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
378
indirect = (const int32_t *)
379
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
385
/* We found a table entry. Now see whether the
386
character we are currently at has the same
387
equivalance class value. */
388
int len = weights[idx & 0xffffff];
390
const UCHAR *np = (const UCHAR *) n;
392
idx2 = findidx (&np);
394
&& (idx >> 24) == (idx2 >> 24)
395
&& len == weights[idx2 & 0xffffff])
403
&& (weights[idx + 1 + cnt]
404
== weights[idx2 + 1 + cnt]))
416
else if (c == L_('\0'))
417
/* [ (unterminated) loses. */
421
bool is_range = false;
424
bool is_seqval = false;
426
if (c == L_('[') && *p == L_('.'))
429
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
430
const CHAR *startp = p;
436
if (c == L_('.') && p[1] == L_(']'))
446
/* We have to handling the symbols differently in
447
ranges since then the collation sequence is
449
is_range = *p == L_('-') && p[1] != L_('\0');
453
/* There are no names defined in the collation
454
data. Therefore we only accept the trivial
455
names consisting of the character itself. */
459
if (!is_range && *n == startp[1])
468
const int32_t *symb_table;
469
# ifdef WIDE_CHAR_VERSION
473
# define str (startp + 1)
475
const unsigned char *extra;
481
# ifdef WIDE_CHAR_VERSION
482
/* We have to convert the name to a single-byte
483
string. This is possible since the names
484
consist of ASCII characters and the internal
485
representation is UCS4. */
486
for (strcnt = 0; strcnt < c1; ++strcnt)
487
str[strcnt] = startp[1 + strcnt];
491
_NL_CURRENT_WORD (LC_COLLATE,
492
_NL_COLLATE_SYMB_HASH_SIZEMB);
493
symb_table = (const int32_t *)
494
_NL_CURRENT (LC_COLLATE,
495
_NL_COLLATE_SYMB_TABLEMB);
496
extra = (const unsigned char *)
497
_NL_CURRENT (LC_COLLATE,
498
_NL_COLLATE_SYMB_EXTRAMB);
500
/* Locate the character in the hashing table. */
501
hash = elem_hash (str, c1);
504
elem = hash % table_size;
505
if (symb_table[2 * elem] != 0)
507
second = hash % (table_size - 2) + 1;
511
/* First compare the hashing value. */
512
if (symb_table[2 * elem] == hash
514
== extra[symb_table[2 * elem + 1]])
516
&extra[symb_table[2 * elem
520
/* Yep, this is the entry. */
521
idx = symb_table[2 * elem + 1];
522
idx += 1 + extra[idx];
529
while (symb_table[2 * elem] != 0);
532
if (symb_table[2 * elem] != 0)
534
/* Compare the byte sequence but only if
535
this is not part of a range. */
536
# ifdef WIDE_CHAR_VERSION
539
idx += 1 + extra[idx];
540
/* Adjust for the alignment. */
541
idx = (idx + 3) & ~3;
543
wextra = (int32_t *) &extra[idx + 4];
548
# ifdef WIDE_CHAR_VERSION
550
(int32_t) c1 < wextra[idx];
552
if (n[c1] != wextra[1 + c1])
555
if ((int32_t) c1 == wextra[idx])
558
for (c1 = 0; c1 < extra[idx]; ++c1)
559
if (n[c1] != extra[1 + c1])
562
if (c1 == extra[idx])
567
/* Get the collation sequence value. */
569
# ifdef WIDE_CHAR_VERSION
570
cold = wextra[1 + wextra[idx]];
572
/* Adjust for the alignment. */
573
idx += 1 + extra[idx];
574
idx = (idx + 3) & ~4;
575
cold = *((int32_t *) &extra[idx]);
582
/* No valid character. Match it as a
584
if (!is_range && *n == str[0])
601
/* We have to handling the symbols differently in
602
ranges since then the collation sequence is
604
is_range = (*p == L_('-') && p[1] != L_('\0')
607
if (!is_range && c == fn)
611
/* This is needed if we goto normal_bracket; from
612
outside of is_seqval's scope. */
620
if (c == L_('-') && *p != L_(']'))
623
/* We have to find the collation sequence
624
value for C. Collation sequence is nothing
625
we can regularly access. The sequence
626
value is defined by the order in which the
627
definitions of the collation values for the
628
various characters appear in the source
629
file. A strange concept, nowhere
635
# ifdef WIDE_CHAR_VERSION
636
/* Search in the `names' array for the characters. */
637
fcollseq = __collseq_table_lookup (collseq, fn);
638
if (fcollseq == ~((uint32_t) 0))
639
/* XXX We don't know anything about the character
640
we are supposed to match. This means we are
642
goto range_not_matched;
647
lcollseq = __collseq_table_lookup (collseq, cold);
649
fcollseq = collseq[fn];
650
lcollseq = is_seqval ? cold : collseq[(UCHAR) cold];
654
if (cend == L_('[') && *p == L_('.'))
657
_NL_CURRENT_WORD (LC_COLLATE,
659
const CHAR *startp = p;
665
if (c == L_('.') && p[1] == L_(']'))
677
/* There are no names defined in the
678
collation data. Therefore we only
679
accept the trivial names consisting
680
of the character itself. */
689
const int32_t *symb_table;
690
# ifdef WIDE_CHAR_VERSION
694
# define str (startp + 1)
696
const unsigned char *extra;
702
# ifdef WIDE_CHAR_VERSION
703
/* We have to convert the name to a single-byte
704
string. This is possible since the names
705
consist of ASCII characters and the internal
706
representation is UCS4. */
707
for (strcnt = 0; strcnt < c1; ++strcnt)
708
str[strcnt] = startp[1 + strcnt];
712
_NL_CURRENT_WORD (LC_COLLATE,
713
_NL_COLLATE_SYMB_HASH_SIZEMB);
714
symb_table = (const int32_t *)
715
_NL_CURRENT (LC_COLLATE,
716
_NL_COLLATE_SYMB_TABLEMB);
717
extra = (const unsigned char *)
718
_NL_CURRENT (LC_COLLATE,
719
_NL_COLLATE_SYMB_EXTRAMB);
721
/* Locate the character in the hashing
723
hash = elem_hash (str, c1);
726
elem = hash % table_size;
727
if (symb_table[2 * elem] != 0)
729
second = hash % (table_size - 2) + 1;
733
/* First compare the hashing value. */
734
if (symb_table[2 * elem] == hash
736
== extra[symb_table[2 * elem + 1]])
738
&extra[symb_table[2 * elem + 1]
741
/* Yep, this is the entry. */
742
idx = symb_table[2 * elem + 1];
743
idx += 1 + extra[idx];
750
while (symb_table[2 * elem] != 0);
753
if (symb_table[2 * elem] != 0)
755
/* Compare the byte sequence but only if
756
this is not part of a range. */
757
# ifdef WIDE_CHAR_VERSION
760
idx += 1 + extra[idx];
761
/* Adjust for the alignment. */
762
idx = (idx + 3) & ~4;
764
wextra = (int32_t *) &extra[idx + 4];
766
/* Get the collation sequence value. */
768
# ifdef WIDE_CHAR_VERSION
769
cend = wextra[1 + wextra[idx]];
771
/* Adjust for the alignment. */
772
idx += 1 + extra[idx];
773
idx = (idx + 3) & ~4;
774
cend = *((int32_t *) &extra[idx]);
777
else if (symb_table[2 * elem] != 0 && c1 == 1)
789
if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
791
if (cend == L_('\0'))
796
/* XXX It is not entirely clear to me how to handle
797
characters which are not mentioned in the
798
collation specification. */
800
# ifdef WIDE_CHAR_VERSION
801
lcollseq == 0xffffffff ||
803
lcollseq <= fcollseq)
805
/* We have to look at the upper bound. */
812
# ifdef WIDE_CHAR_VERSION
814
__collseq_table_lookup (collseq, cend);
815
if (hcollseq == ~((uint32_t) 0))
817
/* Hum, no information about the upper
818
bound. The matching succeeds if the
819
lower bound is matched exactly. */
820
if (lcollseq != fcollseq)
821
goto range_not_matched;
826
hcollseq = collseq[cend];
830
if (lcollseq <= hcollseq && fcollseq <= hcollseq)
833
# ifdef WIDE_CHAR_VERSION
837
/* We use a boring value comparison of the character
838
values. This is better than comparing using
839
`strcoll' since the latter would have surprising
840
and sometimes fatal consequences. */
843
if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
845
if (cend == L_('\0'))
849
if (cold <= fn && fn <= cend)
866
/* Skip the rest of the [...] that already matched. */
873
/* [... (unterminated) loses. */
876
if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
880
/* XXX 1003.2d11 is unclear if this is right. */
883
else if (c == L_('[') && *p == L_(':'))
886
const CHAR *startp = p;
891
if (++c1 == CHAR_CLASS_MAX_LENGTH)
894
if (*p == L_(':') && p[1] == L_(']'))
897
if (c < L_('a') || c >= L_('z'))
906
else if (c == L_('[') && *p == L_('='))
912
if (c != L_('=') || p[1] != L_(']'))
917
else if (c == L_('[') && *p == L_('.'))
926
if (*p == L_('.') && p[1] == L_(']'))
933
while (c != L_(']'));
942
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
946
res = EXT (c, p, n, string_end, no_leading_period, flags);
953
if (NO_LEADING_PERIOD (flags))
955
if (n == string_end || c != (UCHAR) *n)
958
new_no_leading_period = true;
964
if (n == string_end || c != FOLD ((UCHAR) *n))
968
no_leading_period = new_no_leading_period;
975
if ((flags & FNM_LEADING_DIR) && n != string_end && *n == L_('/'))
976
/* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
985
END (const CHAR *pattern)
987
const CHAR *p = pattern;
990
if (*++p == L_('\0'))
991
/* This is an invalid pattern. */
993
else if (*p == L_('['))
995
/* Handle brackets special. */
996
if (posixly_correct == 0)
997
posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
999
/* Skip the not sign. We have to recognize it because of a possibly
1001
if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
1003
/* A leading ']' is recognized as such. */
1006
/* Skip over all characters of the list. */
1007
while (*p != L_(']'))
1008
if (*p++ == L_('\0'))
1009
/* This is no valid pattern. */
1012
else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
1013
|| *p == L_('!')) && p[1] == L_('('))
1015
else if (*p == L_(')'))
1024
EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
1025
bool no_leading_period, int flags)
1031
struct patternlist *next;
1034
struct patternlist **lastp = &list;
1035
size_t pattern_len = STRLEN (pattern);
1038
enum { ALLOCA_LIMIT = 8000 };
1040
/* Parse the pattern. Store the individual parts in the list. */
1042
for (startp = p = pattern + 1; ; ++p)
1044
/* This is an invalid pattern. */
1046
else if (*p == L_('['))
1048
/* Handle brackets special. */
1049
if (posixly_correct == 0)
1050
posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
1052
/* Skip the not sign. We have to recognize it because of a possibly
1054
if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
1056
/* A leading ']' is recognized as such. */
1059
/* Skip over all characters of the list. */
1060
while (*p != L_(']'))
1061
if (*p++ == L_('\0'))
1062
/* This is no valid pattern. */
1065
else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
1066
|| *p == L_('!')) && p[1] == L_('('))
1067
/* Remember the nesting level. */
1069
else if (*p == L_(')'))
1073
/* This means we found the end of the pattern. */
1074
#define NEW_PATTERN \
1075
struct patternlist *newp; \
1080
plen = (opt == L_('?') || opt == L_('@') \
1082
: p - startp + 1UL); \
1083
plensize = plen * sizeof (CHAR); \
1084
newpsize = offsetof (struct patternlist, str) + plensize; \
1085
if ((size_t) -1 / sizeof (CHAR) < plen \
1086
|| newpsize < offsetof (struct patternlist, str) \
1087
|| ALLOCA_LIMIT <= newpsize) \
1089
newp = (struct patternlist *) alloca (newpsize); \
1090
*((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L_('\0'); \
1091
newp->next = NULL; \
1098
else if (*p == L_('|'))
1106
assert (list != NULL);
1107
assert (p[-1] == L_(')'));
1113
if (FCT (p, string, string_end, no_leading_period, flags) == 0)
1120
for (rs = string; rs <= string_end; ++rs)
1121
/* First match the prefix with the current pattern with the
1123
if (FCT (list->str, string, rs, no_leading_period,
1124
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0
1125
/* This was successful. Now match the rest with the rest
1127
&& (FCT (p, rs, string_end,
1130
: rs[-1] == '/' && NO_LEADING_PERIOD (flags),
1131
flags & FNM_FILE_NAME
1132
? flags : flags & ~FNM_PERIOD) == 0
1133
/* This didn't work. Try the whole pattern. */
1135
&& FCT (pattern - 1, rs, string_end,
1138
: rs[-1] == '/' && NO_LEADING_PERIOD (flags),
1139
flags & FNM_FILE_NAME
1140
? flags : flags & ~FNM_PERIOD) == 0)))
1141
/* It worked. Signal success. */
1144
while ((list = list->next) != NULL);
1146
/* None of the patterns lead to a match. */
1150
if (FCT (p, string, string_end, no_leading_period, flags) == 0)
1156
/* I cannot believe it but `strcat' is actually acceptable
1157
here. Match the entire string with the prefix from the
1158
pattern list and the rest of the pattern following the
1160
if (FCT (STRCAT (list->str, p), string, string_end,
1162
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
1163
/* It worked. Signal success. */
1165
while ((list = list->next) != NULL);
1167
/* None of the patterns lead to a match. */
1171
for (rs = string; rs <= string_end; ++rs)
1173
struct patternlist *runp;
1175
for (runp = list; runp != NULL; runp = runp->next)
1176
if (FCT (runp->str, string, rs, no_leading_period,
1177
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
1180
/* If none of the patterns matched see whether the rest does. */
1182
&& (FCT (p, rs, string_end,
1185
: rs[-1] == '/' && NO_LEADING_PERIOD (flags),
1186
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD)
1188
/* This is successful. */
1192
/* None of the patterns together with the rest of the pattern
1197
assert (! "Invalid extended matching operator");