mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-12 14:21:18 +08:00
[BZ 9697]
* posix/bug-regex17.c: Add testcases. * posix/regcomp.c (re_compile_fastmap_iter): Rewrite COMPLEX_BRACKET handling.
This commit is contained in:
parent
0480c90173
commit
bdb56bacd5
@ -1,3 +1,10 @@
|
||||
2009-01-04 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
[BZ 9697]
|
||||
* posix/bug-regex17.c: Add testcases.
|
||||
* posix/regcomp.c (re_compile_fastmap_iter): Rewrite COMPLEX_BRACKET
|
||||
handling.
|
||||
|
||||
2009-01-05 Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/s390/bits/libc-vdso.h: New file.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Turkish regular expression tests.
|
||||
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||
/* German regular expression tests.
|
||||
Copyright (C) 2002, 2003, 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
||||
|
||||
@ -33,10 +33,10 @@ struct
|
||||
int flags, nmatch;
|
||||
regmatch_t rm[5];
|
||||
} tests[] = {
|
||||
/* \xc3\x84 LATIN CAPITAL LETTER A WITH DIAERESIS
|
||||
\xc3\x96 LATIN CAPITAL LETTER O WITH DIAERESIS
|
||||
\xc3\xa4 LATIN SMALL LETTER A WITH DIAERESIS
|
||||
\xc3\xb6 LATIN SMALL LETTER O WITH DIAERESIS */
|
||||
/* U+00C4 \xc3\x84 LATIN CAPITAL LETTER A WITH DIAERESIS
|
||||
U+00D6 \xc3\x96 LATIN CAPITAL LETTER O WITH DIAERESIS
|
||||
U+00E4 \xc3\xa4 LATIN SMALL LETTER A WITH DIAERESIS
|
||||
U+00F6 \xc3\xb6 LATIN SMALL LETTER O WITH DIAERESIS */
|
||||
{ "\xc3\x84\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
||||
{ { 2, 10 }, { -1, -1 } } },
|
||||
{ "[\xc3\x84x]\xc3\x96*\xc3\xb6$", "aB\xc3\x84\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
||||
@ -45,10 +45,22 @@ struct
|
||||
{ { 2, 10 }, { -1, -1 } } },
|
||||
{ "[^x]\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
||||
{ { 2, 10 }, { -1, -1 } } },
|
||||
|
||||
/* Tests for bug 9697:
|
||||
U+00DF \xc3\x9f LATIN SMALL LETTER SHARP S
|
||||
U+02DA \xcb\x9a RING ABOVE
|
||||
U+02E2 \xcb\xa2 MODIFIER LETTER SMALL S */
|
||||
{ "[a-z]|[^a-z]", "\xcb\xa2", REG_EXTENDED, 2,
|
||||
{ { 0, 2 }, { -1, -1 } } },
|
||||
{ "[a-z]", "\xc3\x9f", REG_EXTENDED, 2,
|
||||
{ { 0, 2 }, { -1, -1 } } },
|
||||
{ "[^a-z]", "\xcb\x9a", REG_EXTENDED, 2,
|
||||
{ { 0, 2 }, { -1, -1 } } },
|
||||
};
|
||||
|
||||
int
|
||||
main (void)
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
regex_t re;
|
||||
regmatch_t rm[5];
|
||||
@ -93,3 +105,6 @@ main (void)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Extended regular expression matching and search library.
|
||||
Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002,2003,2004,2005,2006,2007,2009
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||
|
||||
@ -350,47 +351,67 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
|
||||
#ifdef RE_ENABLE_I18N
|
||||
else if (type == COMPLEX_BRACKET)
|
||||
{
|
||||
int i;
|
||||
re_charset_t *cset = dfa->nodes[node].opr.mbcset;
|
||||
if (cset->non_match || cset->ncoll_syms || cset->nequiv_classes
|
||||
|| cset->nranges || cset->nchar_classes)
|
||||
{
|
||||
int i;
|
||||
|
||||
# ifdef _LIBC
|
||||
if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0)
|
||||
/* See if we have to try all bytes which start multiple collation
|
||||
elements.
|
||||
e.g. In da_DK, we want to catch 'a' since "aa" is a valid
|
||||
collation element, and don't catch 'b' since 'b' is
|
||||
the only collation element which starts from 'b' (and
|
||||
it is caught by SIMPLE_BRACKET). */
|
||||
if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
|
||||
&& (cset->ncoll_syms || cset->nranges))
|
||||
{
|
||||
/* In this case we want to catch the bytes which are
|
||||
the first byte of any collation elements.
|
||||
e.g. In da_DK, we want to catch 'a' since "aa"
|
||||
is a valid collation element, and don't catch
|
||||
'b' since 'b' is the only collation element
|
||||
which starts from 'b'. */
|
||||
const int32_t *table = (const int32_t *)
|
||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
|
||||
for (i = 0; i < SBC_MAX; ++i)
|
||||
if (table[i] < 0)
|
||||
re_set_fastmap (fastmap, icase, i);
|
||||
}
|
||||
# else
|
||||
if (dfa->mb_cur_max > 1)
|
||||
for (i = 0; i < SBC_MAX; ++i)
|
||||
if (__btowc (i) == WEOF)
|
||||
re_set_fastmap (fastmap, icase, i);
|
||||
# endif /* not _LIBC */
|
||||
}
|
||||
for (i = 0; i < cset->nmbchars; ++i)
|
||||
# endif /* _LIBC */
|
||||
|
||||
/* See if we have to start the match at all multibyte characters,
|
||||
i.e. where we would not find an invalid sequence. This only
|
||||
applies to multibyte character sets; for single byte character
|
||||
sets, the SIMPLE_BRACKET again suffices. */
|
||||
if (dfa->mb_cur_max > 1
|
||||
&& (cset->nchar_classes || cset->non_match
|
||||
# ifdef _LIBC
|
||||
|| cset->nequiv_classes
|
||||
# endif /* _LIBC */
|
||||
))
|
||||
{
|
||||
char buf[256];
|
||||
mbstate_t state;
|
||||
memset (&state, '\0', sizeof (state));
|
||||
if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
|
||||
re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
|
||||
if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
|
||||
unsigned char c = 0;
|
||||
do
|
||||
{
|
||||
if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
|
||||
!= (size_t) -1)
|
||||
re_set_fastmap (fastmap, 0, *(unsigned char *) buf);
|
||||
mbstate_t mbs;
|
||||
memset (&mbs, 0, sizeof (mbs));
|
||||
if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
|
||||
re_set_fastmap (fastmap, false, (int) c);
|
||||
}
|
||||
while (++c != 0);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
/* ... Else catch all bytes which can start the mbchars. */
|
||||
for (i = 0; i < cset->nmbchars; ++i)
|
||||
{
|
||||
char buf[256];
|
||||
mbstate_t state;
|
||||
memset (&state, '\0', sizeof (state));
|
||||
if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
|
||||
re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
|
||||
if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
|
||||
{
|
||||
if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
|
||||
!= (size_t) -1)
|
||||
re_set_fastmap (fastmap, false, *(unsigned char *) buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* RE_ENABLE_I18N */
|
||||
else if (type == OP_PERIOD
|
||||
|
Loading…
x
Reference in New Issue
Block a user