mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
* posix/fnmatch_loop.c: Take rule index returned as part of
findidx return value into account when accessing weights. * posix/regcomp.c: Likewise. * posix/regexec.c: Likewise.
This commit is contained in:
parent
d074d36dde
commit
b7d1c5fa30
@ -1,5 +1,10 @@
|
|||||||
2007-10-12 Ulrich Drepper <drepper@redhat.com>
|
2007-10-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* posix/fnmatch_loop.c: Take rule index returned as part of
|
||||||
|
findidx return value into account when accessing weights.
|
||||||
|
* posix/regcomp.c: Likewise.
|
||||||
|
* posix/regexec.c: Likewise.
|
||||||
|
|
||||||
* locale/programs/ld-collate.c (collate_read): Optimize a bit.
|
* locale/programs/ld-collate.c (collate_read): Optimize a bit.
|
||||||
(skip_to): Fix problems with parameter of elifdef/elifndef.
|
(skip_to): Fix problems with parameter of elifdef/elifndef.
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2003,2004,2005,
|
/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007
|
||||||
2007 Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -418,15 +418,20 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends)
|
|||||||
/* We found a table entry. Now see whether the
|
/* We found a table entry. Now see whether the
|
||||||
character we are currently at has the same
|
character we are currently at has the same
|
||||||
equivalance class value. */
|
equivalance class value. */
|
||||||
int len = weights[idx];
|
int len = weights[idx & 0xffffff];
|
||||||
int32_t idx2;
|
int32_t idx2;
|
||||||
const UCHAR *np = (const UCHAR *) n;
|
const UCHAR *np = (const UCHAR *) n;
|
||||||
|
|
||||||
idx2 = findidx (&np);
|
idx2 = findidx (&np);
|
||||||
if (idx2 != 0 && len == weights[idx2])
|
if (idx2 != 0
|
||||||
|
&& (idx >> 24) == (idx2 >> 24)
|
||||||
|
&& len == weights[idx2 & 0xffffff])
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
|
idx &= 0xffffff;
|
||||||
|
idx2 &= 0xffffff;
|
||||||
|
|
||||||
while (cnt < len
|
while (cnt < len
|
||||||
&& (weights[idx + 1 + cnt]
|
&& (weights[idx + 1 + cnt]
|
||||||
== weights[idx2 + 1 + cnt]))
|
== weights[idx2 + 1 + cnt]))
|
||||||
|
@ -3378,7 +3378,7 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name)
|
|||||||
|
|
||||||
/* Build single byte matcing table for this equivalence class. */
|
/* Build single byte matcing table for this equivalence class. */
|
||||||
char_buf[1] = (unsigned char) '\0';
|
char_buf[1] = (unsigned char) '\0';
|
||||||
len = weights[idx1];
|
len = weights[idx1 & 0xffffff];
|
||||||
for (ch = 0; ch < SBC_MAX; ++ch)
|
for (ch = 0; ch < SBC_MAX; ++ch)
|
||||||
{
|
{
|
||||||
char_buf[0] = ch;
|
char_buf[0] = ch;
|
||||||
@ -3390,11 +3390,15 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name)
|
|||||||
if (idx2 == 0)
|
if (idx2 == 0)
|
||||||
/* This isn't a valid character. */
|
/* This isn't a valid character. */
|
||||||
continue;
|
continue;
|
||||||
if (len == weights[idx2])
|
/* Compare only if the length matches and the collation rule
|
||||||
|
index is the same. */
|
||||||
|
if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24))
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
while (cnt <= len &&
|
while (cnt <= len &&
|
||||||
weights[idx1 + 1 + cnt] == weights[idx2 + 1 + cnt])
|
weights[(idx1 & 0xffffff) + 1 + cnt]
|
||||||
|
== weights[(idx2 & 0xffffff) + 1 + cnt])
|
||||||
++cnt;
|
++cnt;
|
||||||
|
|
||||||
if (cnt > len)
|
if (cnt > len)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2003, 2004, 2005, 2007 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>.
|
||||||
|
|
||||||
@ -3825,7 +3825,6 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx,
|
|||||||
const int32_t *table, *indirect;
|
const int32_t *table, *indirect;
|
||||||
const unsigned char *weights, *extra;
|
const unsigned char *weights, *extra;
|
||||||
const char *collseqwc;
|
const char *collseqwc;
|
||||||
int32_t idx;
|
|
||||||
/* This #include defines a local function! */
|
/* This #include defines a local function! */
|
||||||
# include <locale/weight.h>
|
# include <locale/weight.h>
|
||||||
|
|
||||||
@ -3883,15 +3882,20 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx,
|
|||||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
||||||
indirect = (const int32_t *)
|
indirect = (const int32_t *)
|
||||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
|
||||||
idx = findidx (&cp);
|
int32_t idx = findidx (&cp);
|
||||||
if (idx > 0)
|
if (idx > 0)
|
||||||
for (i = 0; i < cset->nequiv_classes; ++i)
|
for (i = 0; i < cset->nequiv_classes; ++i)
|
||||||
{
|
{
|
||||||
int32_t equiv_class_idx = cset->equiv_classes[i];
|
int32_t equiv_class_idx = cset->equiv_classes[i];
|
||||||
size_t weight_len = weights[idx];
|
size_t weight_len = weights[idx & 0xffffff];
|
||||||
if (weight_len == weights[equiv_class_idx])
|
if (weight_len == weights[equiv_class_idx & 0xffffff]
|
||||||
|
&& (idx >> 24) == (equiv_class_idx >> 24))
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
|
idx &= 0xffffff;
|
||||||
|
equiv_class_idx &= 0xffffff;
|
||||||
|
|
||||||
while (cnt <= weight_len
|
while (cnt <= weight_len
|
||||||
&& (weights[equiv_class_idx + 1 + cnt]
|
&& (weights[equiv_class_idx + 1 + cnt]
|
||||||
== weights[idx + 1 + cnt]))
|
== weights[idx + 1 + cnt]))
|
||||||
|
Loading…
Reference in New Issue
Block a user