diff options
Diffstat (limited to 'lib/fnmatch_loop.c')
-rw-r--r-- | lib/fnmatch_loop.c | 86 |
1 files changed, 52 insertions, 34 deletions
diff --git a/lib/fnmatch_loop.c b/lib/fnmatch_loop.c index 308d311..d1008c2 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,12 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, if (!is_range && c == fn) goto matched; +#if _LIBC + /* This is needed if we goto normal_bracket; from + outside of is_seqval's scope. */ + is_seqval = false; +#endif + cold = c; c = *p++; } @@ -703,25 +716,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) |