From: Paul Eggert Date: Wed, 24 Jan 2007 00:15:58 +0000 (+0000) Subject: Import the following changes from libc. X-Git-Tag: cvs-readonly~1289 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=ae3973f4685a0a316ab9cf50942374a7f77d401d;p=gnulib.git Import the following changes from libc. 2005-10-14 Ulrich Drepper * lib/fnmatch_loop.c: Adjust for changed secondary hash function. 2004-12-01 Jakub Jelinek * lib/fnmatch_loop.c (internal_fnmatch): Clear is_seqval after normal_bracket label. 2004-09-01 Jakub Jelinek [BZ #361] * lib/fnmatch_loop.c (FCT): For backslash between brackets, branch to normal_bracket after fetching the next character. --- diff --git a/ChangeLog b/ChangeLog index 56d829480..1f7c68277 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2007-01-23 Paul Eggert + + Import the following changes from libc. + + 2005-10-14 Ulrich Drepper + + * lib/fnmatch_loop.c: Adjust for changed secondary hash function. + + 2004-12-01 Jakub Jelinek + + * lib/fnmatch_loop.c (internal_fnmatch): Clear is_seqval after + normal_bracket label. + + 2004-09-01 Jakub Jelinek + + [BZ #361] + * lib/fnmatch_loop.c (FCT): For backslash between brackets, branch + to normal_bracket after fetching the next character. + 2007-01-22 Bruno Haible * lib/striconveh.h (mem_cd_iconveh, mem_iconveh): Add 'offsets' diff --git a/lib/fnmatch_loop.c b/lib/fnmatch_loop.c index 308d311f9..5f803924b 100644 --- a/lib/fnmatch_loop.c +++ b/lib/fnmatch_loop.c @@ -1,5 +1,6 @@ /* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006 - Free Software Foundation, Inc. + Free Software Foundation, Inc. + This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -233,8 +234,7 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, c = FOLD ((UCHAR) *p); ++p; - if (c == fn) - goto matched; + goto normal_bracket; } else if (c == L_('[') && *p == L_(':')) { @@ -494,24 +494,31 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, idx = 0; elem = hash % table_size; - second = hash % (table_size - 2); - while (symb_table[2 * elem] != 0) + if (symb_table[2 * elem] != 0) { - /* First compare the hashing value. */ - if (symb_table[2 * elem] == hash - && c1 == extra[symb_table[2 * elem + 1]] - && memcmp (str, - &extra[symb_table[2 * elem + 1] - + 1], c1) == 0) + second = hash % (table_size - 2) + 1; + + do { - /* Yep, this is the entry. */ - idx = symb_table[2 * elem + 1]; - idx += 1 + extra[idx]; - break; - } + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && (c1 + == extra[symb_table[2 * elem + 1]]) + && memcmp (str, + &extra[symb_table[2 * elem + + 1] + + 1], c1) == 0) + { + /* Yep, this is the entry. */ + idx = symb_table[2 * elem + 1]; + idx += 1 + extra[idx]; + break; + } - /* Next entry. */ - elem += second; + /* Next entry. */ + elem += second; + } + while (symb_table[2 * elem] != 0); } if (symb_table[2 * elem] != 0) @@ -592,6 +599,9 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, if (!is_range && c == fn) goto matched; + /* This is needed if we goto normal_bracket; from + outside of is_seqval's scope. */ + is_seqval = false; cold = c; c = *p++; } @@ -703,25 +713,30 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, idx = 0; elem = hash % table_size; - second = hash % (table_size - 2); - while (symb_table[2 * elem] != 0) + if (symb_table[2 * elem] != 0) { - /* First compare the hashing value. */ - if (symb_table[2 * elem] == hash - && (c1 - == extra[symb_table[2 * elem + 1]]) - && memcmp (str, - &extra[symb_table[2 * elem + 1] - + 1], c1) == 0) + second = hash % (table_size - 2) + 1; + + do { - /* Yep, this is the entry. */ - idx = symb_table[2 * elem + 1]; - idx += 1 + extra[idx]; - break; + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && (c1 + == extra[symb_table[2 * elem + 1]]) + && memcmp (str, + &extra[symb_table[2 * elem + 1] + + 1], c1) == 0) + { + /* Yep, this is the entry. */ + idx = symb_table[2 * elem + 1]; + idx += 1 + extra[idx]; + break; + } + + /* Next entry. */ + elem += second; } - - /* Next entry. */ - elem += second; + while (symb_table[2 * elem] != 0); } if (symb_table[2 * elem] != 0)