Update.
* posix/fnmatch_loop.c: Implement equivalence class handling. * posix/tst-fnmatch.input: Add tests for equivalence class handling.
This commit is contained in:
parent
7239b3a4cf
commit
ecce00a971
@ -1,5 +1,9 @@
|
||||
2000-07-04 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* posix/fnmatch_loop.c: Implement equivalence class handling.
|
||||
* posix/tst-fnmatch.input: Add tests for equivalence class
|
||||
handling.
|
||||
|
||||
* posix/fnmatch_loop.c: Improve performance for single-byte
|
||||
character sets by not using btowc.
|
||||
|
||||
|
@ -302,6 +302,112 @@ FCT (pattern, string, no_leading_period, flags)
|
||||
#endif
|
||||
c = *p++;
|
||||
}
|
||||
#ifdef _LIBC
|
||||
else if (c == L('[') && *p == L('='))
|
||||
{
|
||||
UCHAR str[1];
|
||||
uint32_t nrules =
|
||||
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
|
||||
const CHAR *startp = p;
|
||||
|
||||
c = *++p;
|
||||
if (c == L('\0'))
|
||||
{
|
||||
p = startp;
|
||||
c = L('[');
|
||||
goto normal_bracket;
|
||||
}
|
||||
str[0] = c;
|
||||
|
||||
c = *++p;
|
||||
if (c != L('=') || p[1] != L(']'))
|
||||
{
|
||||
p = startp;
|
||||
c = L('[');
|
||||
goto normal_bracket;
|
||||
}
|
||||
p += 2;
|
||||
|
||||
if (nrules == 0)
|
||||
{
|
||||
if ((UCHAR) *n == str[0])
|
||||
goto matched;
|
||||
}
|
||||
else
|
||||
{
|
||||
const int32_t *table;
|
||||
# if WIDE_CHAR_VERSION
|
||||
const int32_t *weights;
|
||||
const int32_t *extra;
|
||||
# else
|
||||
const unsigned char *weights;
|
||||
const unsigned char *extra;
|
||||
# endif
|
||||
const int32_t *indirect;
|
||||
int32_t idx;
|
||||
const UCHAR *cp = (const UCHAR *) str;
|
||||
|
||||
/* This #include defines a local function! */
|
||||
# if WIDE_CHAR_VERSION
|
||||
# include <locale/weightwc.h>
|
||||
# else
|
||||
# include <locale/weight.h>
|
||||
# endif
|
||||
|
||||
# if WIDE_CHAR_VERSION
|
||||
table = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
|
||||
weights = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
|
||||
extra = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
|
||||
indirect = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
|
||||
# else
|
||||
table = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
|
||||
weights = (const unsigned char *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
|
||||
extra = (const unsigned char *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
||||
indirect = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
|
||||
# endif
|
||||
|
||||
idx = findidx (&cp);
|
||||
if (idx != 0)
|
||||
{
|
||||
/* We found a table entry. Now see whether the
|
||||
character we are currently at has the same
|
||||
equivalance class value. */
|
||||
int len = weights[idx];
|
||||
int32_t idx2;
|
||||
const UCHAR *np = (const UCHAR *) n;
|
||||
|
||||
idx2 = findidx (&np);
|
||||
# if !WIDE_CHAR_VERSION
|
||||
if (idx2 != 0 && len == weights[idx2])
|
||||
{
|
||||
int cnt = 0;
|
||||
|
||||
while (cnt < len
|
||||
&& (weights[idx + 1 + cnt]
|
||||
== weights[idx2 + 1 + cnt]))
|
||||
++cnt;
|
||||
|
||||
if (cnt == len)
|
||||
goto matched;
|
||||
}
|
||||
# else
|
||||
if (idx2 != 0 && weights[idx] == weights[idx2])
|
||||
goto matched;
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
c = *p++;
|
||||
}
|
||||
#endif
|
||||
else if (c == L('\0'))
|
||||
/* [ (unterminated) loses. */
|
||||
return FNM_NOMATCH;
|
||||
|
@ -79,10 +79,14 @@ C "]]" "[!a]]" 0
|
||||
# *** implement [. .]
|
||||
|
||||
# B.6 015(C)
|
||||
# *** implement [= =]
|
||||
C "a" "[[=a=]]" 0
|
||||
C "b" "[[=a=]b]" 0
|
||||
C "b" "[[=a=][=b=]]" 0
|
||||
|
||||
# B.6 016(C)
|
||||
# *** implement [= =]
|
||||
C "=" "[[=a=]b]" NOMATCH
|
||||
C "]" "[[=a=]b]" NOMATCH
|
||||
C "a" "[[=b=]]" NOMATCH
|
||||
|
||||
# B.6 017(C)
|
||||
C "a" "[[:alnum:]]" 0
|
||||
@ -385,3 +389,28 @@ de_DE.ISO-8859-1 "Z" "[[:alpha:]]" 0
|
||||
de_DE.ISO-8859-1 "Ä" "[[:alpha:]]" 0
|
||||
de_DE.ISO-8859-1 "Ö" "[[:alpha:]]" 0
|
||||
de_DE.ISO-8859-1 "Ü" "[[:alpha:]]" 0
|
||||
|
||||
de_DE.ISO-8859-1 "a" "[[=a=]b]" 0
|
||||
de_DE.ISO-8859-1 "â" "[[=a=]b]" 0
|
||||
de_DE.ISO-8859-1 "à" "[[=a=]b]" 0
|
||||
de_DE.ISO-8859-1 "á" "[[=a=]b]" 0
|
||||
de_DE.ISO-8859-1 "b" "[[=a=]b]" 0
|
||||
de_DE.ISO-8859-1 "c" "[[=a=]b]" NOMATCH
|
||||
de_DE.ISO-8859-1 "a" "[[=â=]b]" 0
|
||||
de_DE.ISO-8859-1 "â" "[[=â=]b]" 0
|
||||
de_DE.ISO-8859-1 "à" "[[=â=]b]" 0
|
||||
de_DE.ISO-8859-1 "á" "[[=â=]b]" 0
|
||||
de_DE.ISO-8859-1 "b" "[[=â=]b]" 0
|
||||
de_DE.ISO-8859-1 "c" "[[=â=]b]" NOMATCH
|
||||
de_DE.ISO-8859-1 "a" "[[=à=]b]" 0
|
||||
de_DE.ISO-8859-1 "â" "[[=à=]b]" 0
|
||||
de_DE.ISO-8859-1 "à" "[[=à=]b]" 0
|
||||
de_DE.ISO-8859-1 "á" "[[=à=]b]" 0
|
||||
de_DE.ISO-8859-1 "b" "[[=à=]b]" 0
|
||||
de_DE.ISO-8859-1 "c" "[[=à=]b]" NOMATCH
|
||||
de_DE.ISO-8859-1 "a" "[[=á=]b]" 0
|
||||
de_DE.ISO-8859-1 "â" "[[=á=]b]" 0
|
||||
de_DE.ISO-8859-1 "à" "[[=á=]b]" 0
|
||||
de_DE.ISO-8859-1 "á" "[[=á=]b]" 0
|
||||
de_DE.ISO-8859-1 "b" "[[=á=]b]" 0
|
||||
de_DE.ISO-8859-1 "c" "[[=á=]b]" NOMATCH
|
||||
|
Loading…
Reference in New Issue
Block a user