mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03: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:
@ -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>
|
2009-01-05 Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/s390/bits/libc-vdso.h: New file.
|
* sysdeps/unix/sysv/linux/s390/bits/libc-vdso.h: New file.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Turkish regular expression tests.
|
/* German regular expression tests.
|
||||||
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2003, 2009 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -33,10 +33,10 @@ struct
|
|||||||
int flags, nmatch;
|
int flags, nmatch;
|
||||||
regmatch_t rm[5];
|
regmatch_t rm[5];
|
||||||
} tests[] = {
|
} tests[] = {
|
||||||
/* \xc3\x84 LATIN CAPITAL LETTER A WITH DIAERESIS
|
/* U+00C4 \xc3\x84 LATIN CAPITAL LETTER A WITH DIAERESIS
|
||||||
\xc3\x96 LATIN CAPITAL LETTER O WITH DIAERESIS
|
U+00D6 \xc3\x96 LATIN CAPITAL LETTER O WITH DIAERESIS
|
||||||
\xc3\xa4 LATIN SMALL LETTER A WITH DIAERESIS
|
U+00E4 \xc3\xa4 LATIN SMALL LETTER A WITH DIAERESIS
|
||||||
\xc3\xb6 LATIN SMALL LETTER O 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,
|
{ "\xc3\x84\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
||||||
{ { 2, 10 }, { -1, -1 } } },
|
{ { 2, 10 }, { -1, -1 } } },
|
||||||
{ "[\xc3\x84x]\xc3\x96*\xc3\xb6$", "aB\xc3\x84\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
{ "[\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 } } },
|
{ { 2, 10 }, { -1, -1 } } },
|
||||||
{ "[^x]\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
{ "[^x]\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
|
||||||
{ { 2, 10 }, { -1, -1 } } },
|
{ { 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;
|
regex_t re;
|
||||||
regmatch_t rm[5];
|
regmatch_t rm[5];
|
||||||
@ -93,3 +105,6 @@ main (void)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TEST_FUNCTION do_test ()
|
||||||
|
#include "../test-skeleton.c"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* Extended regular expression matching and search library.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
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
|
#ifdef RE_ENABLE_I18N
|
||||||
else if (type == COMPLEX_BRACKET)
|
else if (type == COMPLEX_BRACKET)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
re_charset_t *cset = dfa->nodes[node].opr.mbcset;
|
re_charset_t *cset = dfa->nodes[node].opr.mbcset;
|
||||||
if (cset->non_match || cset->ncoll_syms || cset->nequiv_classes
|
int i;
|
||||||
|| cset->nranges || cset->nchar_classes)
|
|
||||||
{
|
|
||||||
# ifdef _LIBC
|
# 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 *)
|
const int32_t *table = (const int32_t *)
|
||||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
|
||||||
for (i = 0; i < SBC_MAX; ++i)
|
for (i = 0; i < SBC_MAX; ++i)
|
||||||
if (table[i] < 0)
|
if (table[i] < 0)
|
||||||
re_set_fastmap (fastmap, icase, i);
|
re_set_fastmap (fastmap, icase, i);
|
||||||
}
|
}
|
||||||
# else
|
# endif /* _LIBC */
|
||||||
if (dfa->mb_cur_max > 1)
|
|
||||||
for (i = 0; i < SBC_MAX; ++i)
|
/* See if we have to start the match at all multibyte characters,
|
||||||
if (__btowc (i) == WEOF)
|
i.e. where we would not find an invalid sequence. This only
|
||||||
re_set_fastmap (fastmap, icase, i);
|
applies to multibyte character sets; for single byte character
|
||||||
# endif /* not _LIBC */
|
sets, the SIMPLE_BRACKET again suffices. */
|
||||||
}
|
if (dfa->mb_cur_max > 1
|
||||||
for (i = 0; i < cset->nmbchars; ++i)
|
&& (cset->nchar_classes || cset->non_match
|
||||||
|
# ifdef _LIBC
|
||||||
|
|| cset->nequiv_classes
|
||||||
|
# endif /* _LIBC */
|
||||||
|
))
|
||||||
{
|
{
|
||||||
char buf[256];
|
unsigned char c = 0;
|
||||||
mbstate_t state;
|
do
|
||||||
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)
|
mbstate_t mbs;
|
||||||
!= (size_t) -1)
|
memset (&mbs, 0, sizeof (mbs));
|
||||||
re_set_fastmap (fastmap, 0, *(unsigned char *) buf);
|
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 */
|
#endif /* RE_ENABLE_I18N */
|
||||||
else if (type == OP_PERIOD
|
else if (type == OP_PERIOD
|
||||||
|
Reference in New Issue
Block a user