* lib/regex_internal.c (re_string_reconstruct): Don't assume buffer
[gnulib.git] / lib / ChangeLog
index c3126d3..e75459d 100644 (file)
@@ -1,3 +1,621 @@
+2005-08-31  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex_internal.c (re_string_reconstruct): Don't assume buffer
+       lengths fit in regoff_t; this isn't true if regoff_t is the same
+       width as size_t.
+       * regex.c (re_search_internal): 5th arg is LAST_START
+       (= START + RANGE) instead of RANGE.  This avoids overflow
+       problems when regoff_t is the same width as size_t.
+       All callers changed.
+       (re_search_2_stub): Check for overflow when adding the
+       sizes of the two strings.
+       (re_search_stub): Check for overflow when adding START
+       to RANGE; if it occurs, substitute the extreme value.
+
+2005-08-31  Jim Meyering  <jim@meyering.net>
+
+       * regcomp.c (search_duplicated_node): Make first pointer arg
+       a pointer-to-const.
+       * regex_internal.c (create_ci_newstate, create_cd_newstate):
+       (register_state): Likewise.
+       * regexec.c (search_cur_bkref_entry, check_dst_limits):
+       (check_dst_limits_calc_pos_1, check_dst_limits_calc_pos):
+       (group_nodes_into_DFAstates): Likewise.
+
+2005-08-31  Paul Eggert  <eggert@cs.ucla.edu>
+
+       On 64-bit hosts (where size_t is 64 bits and int is 32 bits), the
+       old glibc regex code mishandles strings longer than 2**31 bytes.
+       This patch fixes this when the regex code is used in gnulib
+       (i.e., outside glibc).
+
+       This patch should not affect the use of the regex code inside
+       glibc.  No doubt this problem also needs to be handled for glibc
+       as well, but the result will be an incompatible change to the
+       glibc ABI, and the old ABI will have to be supported too.  That
+       can be the the subject for another patch.
+
+       * regex.h (_REGEX_LARGE_OFFSETS): New feature-test macro,
+       governing whether the rest of this patch is active.  By default,
+       the macro is disabled and the patch has no effect.
+       (regoff_t) [defined _REGEX_LARGE_OFFSETS]: Define to off_t, not int.
+       (__re_idx_t, __re_size_t, __re_long_size_t): New types.
+       (struct re_pattern_buffer, re_search, re_search_2, re_match):
+       (re_match_2, re_set_registers): Use the new types.
+       * regex_internal.h (Idx, re_hashval_t): New types.
+       (REG_MISSING, REG_ERROR, REG_VALID_INDEX, REG_VALID_NONZERO_INDEX):
+       New macros.
+       (re_node_set, re_charset_t, re_token_t, re_string_realloc_buffers):
+       (re_string_context_at, bin_tree_t, re_dfastate_t):
+       (struct re_state_table_entry, state_array_t, re_sub_match_last_t):
+       (re_sub_match_top_t, re_match_context_t, re_sift_context_t):
+       (struct re_fail_stack_ent_t, struct re_fail_stack_t, struct re_dfa_t):
+       (re_string_char_size_at, re_string_wchar_at):
+       (re_string_elem_size_at):
+       Use the new types and macros to port to 64-bit hosts.
+       Use unsigned types for internal values, so that the code
+       mostly works even for arrays larger than SSIZE_MAX.
+       * regcomp.c (re_compile_internal, init_dfa, duplicate_node):
+       (search_duplicated_node, calc_eclosure_iter, fetch_number):
+       (parse_reg_exp, parse_branch, parse_expression, parse_sub_exp):
+       (build_equiv_class, build_charclass, re_compile_fastmap_iter):
+       (free_dfa_content, create_initial_state, optimize_utf8, analyze):
+       (optimize_subexps, calc_first, link_nfa_nodes, duplicate_node_closure):
+       (calc_inveclosure, parse_dup_op, build_range_exp):
+       (build_collating_symbol, parse_bracket_exp, build_charclass_op):
+       (fetch_number, create_token_tree, mark_opt_subexp):
+       Likewise.
+       * regex_internal.c (re_string_construct_common, create_ci_newstate):
+       (create_cd_newstate, re_string_allocate, re_string_construct):
+       (re_string_realloc_buffers, build_wcs_upper_buffer):
+       (re_string_skip_chars, build_upper_buffer, re_string_translate_buffer):
+       (re_string_reconstruct, re_string_peek_byte_case):
+       (re_string_fetch_byte_case, re_string_context_at):
+       (re_node_set_alloc, re_node_set_init_1, re_node_set_init_2):
+       (re_node_set_init_copy, re_node_set_add_intersect):
+       (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+       (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+       (re_node_set_remove_at, re_dfa_add_node, calc_state_hash):
+       (re_acquire_state, re_acquire_state_context, register_state):
+       Likewise.
+       * regex.c (match_ctx_init, match_ctx_add_entry, search_cur_bkref_entry):
+       (match_ctx_add_subtop, match_ctx_add_sublast, sift_ctx_init):
+       (re_search_internal, re_search_2_stub, re_search_stub)
+       (re_copy_regs, check_matching, check_halt_state_context, update_regs):
+       (push_fail_stack, sift_states_iter_mb, build_sifted_states):
+       (update_cur_sifted_state, check_dst_limits):
+       (check_dst_limits_calc_pos_1, check_dst_limits_calc_pos):
+       (check_subexp_limits, sift_states_bkref, merge_state_array):
+       (check_subexp_matching_top, get_subexp, get_subexp_sub):
+       (find_subexp_node, check_arrival, check_arrival_add_next_nodes):
+       (check_arrival_expand_ecl, check_arrival_expand_ecl_sub):
+       (expand_bkref_cache, check_node_accept_bytes):
+       (group_nodes_into_DFAstates, check_node_accept, regexec, re_match):
+       (re_search, re_match_2, re_search_2, prune_impossible_nodes):
+       (acquire_init_state_context, check_halt_node_context):
+       (proceed_next_node, pop_fail_stack, set_regs, free_fail_stack_return):
+       (sift_states_backward, clean_state_log_if_needed):
+       (sub_epsilon_src_nodes, add_epsilone_src_nodes, merge_state_with_log):
+       (find_recover_state, transit_state_sb, transit_state_mb):
+       (transit_state_bkref, build_trtable, match_ctx_clean):
+       Likewise.
+       * regcomp.c (parse_dup_op): Add an extra test if Idx is unsigned,
+       to work around an assumption that REG_MISSING is negative.
+
+       * regcomp.c (re_comp) [defined _REGEX_RE_COMP || defined _LIBC]:
+       (seek_collating_symbol_entry) [defined _LIBC]:
+       (lookup_collation_sequence_value) [defined _LIBC]:
+       (build_range_exp, build_collating_symbol) [defined _LIBC]:
+       Use prototypes rather than old-style function definitions.
+       * regexec.c (re_exec) [defined _REGEX_RE_COMP || defined _LIBC]:
+       (transit_state_sb) [0]:
+       (find_collation_sequence_value) [defined _LIBC]: Likewise.
+
+       * regexec.c (re_search_internal): Simplify update of rm_so and
+       rm_eo.
+
+       * regcomp.c (re_compile_fastmap_iter, init_dfa, init_word_char):
+       (optimize_subexps, lower_subexp):
+       Don't assume 1<<31 has defined behavior on hosts with 32-bit int,
+       since the signed shift might overflow.  Use 1u<<31 instead.
+       * regex_internal.h (bitset_set, bitset_clear, bitset_contain): Likewise.
+       * regexec.c (check_dst_limits_calc_pos_1, check_subexp_matching_top):
+       Likewise.
+
+       * regcomp.c (optimize_subexps, lower_subexp):
+       Use CHAR_BIT rather than 8, for clarity.
+       * regexec.c (check_dst_limits_calc_pos_1):
+       (check_subexp_matching_top): Likewise.
+       * regcomp.c (init_dfa): Make table_size unsigned, so that we don't
+       have to worry about portability issues when shifting it left.
+       Remove no-longer-needed test for table_size > 0.
+       * regcomp.c (parse_sub_exp): Do not shift more bits than there are
+       in a word, as the resulting behavior is undefined.
+       * regexec.c (check_dst_limits_calc_pos_1): Likewise;
+       in one case, a <= should have been an <, and in another case the
+       whole test was missing.
+       * regex_internal.h (BYTE_BITS): Remove.  All uses changed to
+       the standard name CHAR_BIT.
+       * regexec.c (match_ctx_add_entry): Don't assume that ~0 == -1;
+       this is not true on one's complement and signed-magnitude hosts.
+
+       * regex_internal.h (re_sub_match_top_t): Remove unused member
+       next_last_offset.
+       (struct re_dfa_t): Remove unused member states_alloc.
+       * regcomp.c (init_dfa): Don't initialize unused members.
+
+2005-08-31  Bruno Haible  <bruno@clisp.org>
+
+       * strstr.c: Include <stddef.h>, for NULL.
+       * strcasestr.c: Likewise.
+       Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
+2005-08-30  "Oskar Liljeblad" <oskar@osk.mine.nu>
+
+       * iconvme.h: Add prototype for iconv_alloc.
+
+2005-08-29  Simon Josefsson  <jas@extundo.com>
+
+       * iconvme.c: Fix errno.
+
+2005-08-29  "Oskar Liljeblad" <oskar@osk.mine.nu>
+
+       * iconvme.c: Split iconv_string into iconv_alloc.
+
+2005-08-27  Jim Meyering  <jim@meyering.net>
+
+       * fopen-safer.c: Merge minor changes from coreutils.
+       * dup-safer.c: Likewise.
+       * fd-safer.c: Likewise.
+
+       Merge from coreutils.
+       * stdio--.h: New file.
+       * stdlib--.h: New file.
+       * mkstemp-safer.c: New file.
+
+       GNU tar needs these.
+       * pipe-safer.c: New file.
+       * creat-safer.c: New file.
+       * fcntl--.h (creat): Define to creat_safer.
+       * fcntl-safer.h: Include <sys/types.h> and declare creat_safer.
+       * unistd--.h (pipe): Define to pipe_safer.
+       * unistd-safer.h: Declare pipe_safer.
+
+2005-08-26  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex_internal.h: Remove all references to
+       RE_NO_INTERNAL_PROTOTYPES; no longer neeeded now that we assume C89
+       or better.
+       (bitset_not, bitset_merge, bitset_not_merge):
+       (bitset_mask, re_string_allocate, re_string_construct):
+       (re_string_reconstruct, re_string_destruct, re_string_elem_size_at):
+       (re_string_char_size_at, re_string_wchar_at, re_string_peek_byte_case):
+       (re_string_fetch_byte_case, re_node_set_alloc, re_node_set_init_1):
+       (re_node_set_init_2, re_node_set_init_copy, re_node_set_add_intersect):
+       (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+       (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+       (re_node_set_remove_at, re_dfa_add_node, re_acquire_state):
+       (re_acquire_state_context):
+       Remove unnecessary forward decls.
+       (re_string_char_size_at, re_string_wchar_at, re_string_elem_size_at):
+       Put __attribute at function definition,
+       now that the function decl has been removed.
+       * lib/regex_internal.c (re_string_peek_byte_case):
+       (re_string_fetch_byte_case, re_node_set_compare, re_node_set_contains):
+       Likewise.
+
+2005-08-26  Simon Josefsson  <jas@extundo.com>
+
+       * getpass.c: Use _WIN32 instead of WIN32, suggested by Bruno
+       Haible <bruno@clisp.org>.
+
+2005-08-25  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regexec.c (set_regs): Don't alloca with an unbounded size.
+
+       alloca modernization/simplification for regex.
+       * regex.c: Remove portability cruft for alloca.  This no longer
+       needs to be at the start of the file, and can be moved into
+       regex_internal.h and simplified.
+       * regex_internal.h: Include <alloca.h>.
+       (__libc_use_alloca) [!defined _LIBC]: New macro.
+       * regexec.c (build_trtable): Remove "#ifdef _LIBC", since the code
+       now works outside glibc.
+
+2005-08-24  Simon Josefsson  <jas@extundo.com>
+
+       * getpass.c: Add WIN32 implementation.  Conditionalize use of
+       termios.h, tcgetattr, tcsetattr and __fsetlocking.  Remove some
+       GLIBC specific code.
+
+2005-08-25  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Make regex safe for g++.  This fixes one real bug (an "err"
+       that should have been "*err").  g++ problem reported by
+       Sam Steingold.
+       * regex_internal.h (re_calloc): New macro, consistent with
+       re_malloc etc.  All callers of calloc changed to use re_calloc.
+       * regex_internal.c (build_wcs_upper_buffer): Return reg_errcode_t,
+       not int.  All callers changed.
+       * regcomp.c (re_compile_fastmap_iter): Don't use alloca (mb_cur_max);
+       just use an array of size MB_LEN_MAX.
+       * regexec.c (push_fail_stack): Use re_realloc, not realloc.
+       (find_recover_state): Change "err" to "*err"; this fixes what
+       appears to be a real bug.
+       (check_arrival_expand_ecl_sub): Be consistent about reg_errcode_t
+       versus int.
+
+2005-08-25  Jim Meyering  <jim@meyering.net>
+
+       * open-safer.c: Include <config.h>.
+       Otherwise, we'd lose LARGEFILE support in any file using
+       e.g. "fcntl--.h"
+
+2005-08-24  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regcomp.c (regerror): 2nd arg is 'restrict', as per POSIX.
+       * regex.h (regerror): Likewise.
+
+       * regex.c: Do not include <sys/types.h>, as POSIX no longer
+       requires this.  (The code never needed it.)
+
+       * regcomp.c, regex_internal.c, regex_internal.h, regexec.c:
+       All uses of recently-renamed identifiers changed to use the new,
+       POSIX-compliant names.  The code will build and run just fine
+       without these changes, but it's better to eat our own dog food
+       and use the standard-conforming names.
+
+       * regex.h: Fix a multitude of POSIX name space violations.
+       These changes have an effect only for programs that define
+       _POSIX_C_SOURCE, _POSIX_SOURCE, or _XOPEN_SOURCE; they
+       do not change anything for programs compiled in the normal way.
+       Also, there is no effect on the ABI.
+
+       (_REGEX_SOURCE): New macro.
+       Do not include <stddef.h> if _XOPEN_SOURCE and VMS are both
+       defined and _GNU_SOURCE is not; this fixes a name space violation.
+
+       Rename the following macros to obey POSIX requirements.
+       The old names are still visible as macros if _REGEX_SOURCE is defined.
+       (REG_BACKSLASH_ESCAPE_IN_LISTS): renamed from
+       RE_BACKSLASH_ESCAPE_IN_LISTS.
+       (REG_BK_PLUS_QM): renamed from RE_BK_PLUS_QM.
+       (REG_CHAR_CLASSES): renamed from RE_CHAR_CLASSES.
+       (REG_CONTEXT_INDEP_ANCHORS): renamed from RE_CONTEXT_INDEP_ANCHORS.
+       (REG_CONTEXT_INDEP_OPS): renamed from RE_CONTEXT_INDEP_OPS.
+       (REG_CONTEXT_INVALID_OPS): renamed from RE_CONTEXT_INVALID_OPS.
+       (REG_DOT_NEWLINE): renamed from RE_DOT_NEWLINE.
+       (REG_DOT_NOT_NULL): renamed from RE_DOT_NOT_NULL.
+       (REG_HAT_LISTS_NOT_NEWLINE): renamed from RE_HAT_LISTS_NOT_NEWLINE.
+       (REG_INTERVALS): renamed from RE_INTERVALS.
+       (REG_LIMITED_OPS): renamed from RE_LIMITED_OPS.
+       (REG_NEWLINE_ALT): renamed from RE_NEWLINE_ALT.
+       (REG_NO_BK_BRACES): renamed from RE_NO_BK_BRACES.
+       (REG_NO_BK_PARENS): renamed from RE_NO_BK_PARENS.
+       (REG_NO_BK_REFS): renamed from RE_NO_BK_REFS.
+       (REG_NO_BK_VBAR): renamed from RE_NO_BK_VBAR.
+       (REG_NO_EMPTY_RANGES): renamed from RE_NO_EMPTY_RANGES.
+       (REG_UNMATCHED_RIGHT_PAREN_ORD): renamed from
+       RE_UNMATCHED_RIGHT_PAREN_ORD.
+       (REG_NO_POSIX_BACKTRACKING): renamed from RE_NO_POSIX_BACKTRACKING.
+       (REG_NO_GNU_OPS): renamed from RE_NO_GNU_OPS.
+       (REG_DEBUG): renamed from RE_DEBUG.
+       (REG_INVALID_INTERVAL_ORD): renamed from RE_INVALID_INTERVAL_ORD.
+       (REG_IGNORE_CASE): renamed from RE_ICASE.  This renaming is a bit
+       unusual, since we can't clash with the POSIX REG_ICASE.
+       (REG_CARET_ANCHORS_HERE): renamed from RE_CARET_ANCHORS_HERE.
+       (REG_CONTEXT_INVALID_DUP): renamed from RE_CONTEXT_INVALID_DUP.
+       (REG_NO_SUB): renamed from RE_NO_SUB.
+       (REG_SYNTAX_EMACS): renamed from RE_SYNTAX_EMACS.
+       (REG_SYNTAX_AWK): renamed from RE_SYNTAX_AWK.
+       (REG_SYNTAX_GNU_AWK): renamed from RE_SYNTAX_GNU_AWK.
+       (REG_SYNTAX_POSIX_AWK): renamed from RE_SYNTAX_POSIX_AWK.
+       (REG_SYNTAX_GREP): renamed from RE_SYNTAX_GREP.
+       (REG_SYNTAX_EGREP): renamed from RE_SYNTAX_EGREP.
+       (REG_SYNTAX_POSIX_EGREP): renamed from RE_SYNTAX_POSIX_EGREP.
+       (REG_SYNTAX_ED): renamed from RE_SYNTAX_ED.
+       (REG_SYNTAX_SED): renamed from RE_SYNTAX_SED.
+       (_REG_SYNTAX_POSIX_COMMON): renamed from _RE_SYNTAX_POSIX_COMMON.
+       (REG_SYNTAX_POSIX_BASIC): renamed from RE_SYNTAX_POSIX_BASIC.
+       (REG_SYNTAX_POSIX_MINIMAL_BASIC): renamed from
+       RE_SYNTAX_POSIX_MINIMAL_BASIC.
+       (REG_SYNTAX_POSIX_EXTENDED): renamed from RE_SYNTAX_POSIX_EXTENDED.
+       (REG_SYNTAX_POSIX_MINIMAL_EXTENDED): renamed from
+       RE_SYNTAX_POSIX_MINIMAL_EXTENDED.
+       (REG_DUP_MAX): renamed from RE_DUP_MAX.  No need to undef it.
+       (REG_UNALLOCATED): Renamed from REGS_UNALLOCATED.
+       (REG_REALLOCATE): Renamed from REGS_REALLOCATE.
+       (REG_FIXED): Renamed from REGS_FIXED.
+       (REG_NREGS): Renamed from RE_NREGS.
+
+       (REG_ICASE, REG_NEWLINE, REG_NOSUB): Do not depend on the values
+       of other REG_* macros, since POSIX says the user is allowed to
+       #undef these macros selectively.
+
+       (reg_errcode_t): Update comment stating what other tables need
+       to be consistent.
+
+       Rename the following enum values to obey POSIX requirements.
+       The old names are still visible as macros.
+       (_REG_ENOSYS): Renamed from REG_ENOSYS.  Define even if _XOPEN_SOURCE
+       is not defined, since GNU is supposed to be a superset of POSIX as
+       much as possible, and since we want reg_errcode_t to be a signed
+       type for implementation consistency.
+       (_REG_NOERROR): Renamed from REG_NOERROR.
+       (_REG_NOMATCH): Renamed from REG_NOMATCH.
+       (_REG_BADPAT): Renamed from REG_BADPAT.
+       (_REG_ECOLLATE): Renamed from REG_ECOLLATE.
+       (_REG_ECTYPE): Renamed from REG_ECTYPE.
+       (_REG_EESCAPE): Renamed from REG_EESCAPE.
+       (_REG_ESUBREG): Renamed from REG_ESUBREG.
+       (_REG_EBRACK): Renamed from REG_EBRACK.
+       (_REG_EPAREN): Renamed from REG_EPAREN.
+       (_REG_EBRACE): Renamed from REG_EBRACE.
+       (_REG_BADBR): Renamed from REG_BADBR.
+       (_REG_ERANGE): Renamed from REG_ERANGE.
+       (_REG_ESPACE): Renamed from REG_ESPACE.
+       (_REG_BADRPT): Renamed from REG_BADRPT.
+       (_REG_EEND): Renamed from REG_EEND.
+       (_REG_ESIZE): Renamed from REG_ESIZE.
+       (_REG_ERPAREN): Renamed from REG_ERPAREN.
+       (REG_ENOSYS, REG_NOERROR, REG_NOMATCH, REG_BADPAT, REG_ECOLLATE):
+       (REG_ECTYPE, REG_EESCAPE, REG_ESUBREG, REG_EBRACK, REG_EPAREN):
+       (REG_EBRACE, REG_BADBR, REG_ERANGE, REG_ESPACE, REG_BADRPT, REG_EEND):
+       (REG_ESIZE, REG_ERPAREN): Now macros, not enum constants.
+
+       (_REG_RE_NAME, _REG_RM_NAME): New macros.
+       (REG_TRANSLATE_TYPE): Renamed from RE_TRANSLATE_TYPE.  All uses
+       changed.  But support the old name if the new one is not defined
+       and if _REGEX_SOURCE.
+
+       Change the following member names in struct re_pattern_buffer.
+       The old names are still supported if !_REGEX_SOURCE.
+       The new names are always supported, regardless of _REGEX_SOURCE.
+       (re_buffer): Renamed from buffer.
+       (re_allocated): Renamed from allocated.
+       (re_used): Renamed from used.
+       (re_syntax): Renamed from syntax.
+       (re_fastmap): Renamed from fastmap.
+       (re_translate): Renamed from translate.
+       (re_can_be_null): Renamed from can_be_null.
+       (re_regs_allocated): Renamed from regs_allocated.
+       (re_fastmap_accurate): Renamed from fastmap_accurate.
+       (re_no_sub): Renamed from no_sub.
+       (re_not_bol): Renamed from not_bol.
+       (re_not_eol): Renamed from not_eol.
+       (re_newline_anchor): Renamed from newline_anchor.
+
+       Change the following member names in struct re_registers.
+       The old names are still supported if !_REGEX_SOURCE.
+       The new names are always supported, regardless of _REGEX_SOURCE.
+       (rm_num_regs): Renamed from num_regs.
+       (rm_start): Renamed from start.
+       (rm_end): Renamed from end.
+
+       (re_set_syntax, re_compile_pattern, re_compile_fastmap):
+       (re_search, re_search_2, re_match, re_match_2, re_set_registers):
+       Prepend __ to parameter names.
+
+       Undo yesterday's changes.
+
+2005-08-24  Jim Meyering  <jim@meyering.net>
+
+       Sync from coreutils.
+       * fcntl--.h, fcntl-safer.h, open-safer.c: New files.
+
+2005-08-21  Bruno Haible  <bruno@clisp.org>
+
+       * lock.h: Add multiple inclusion guard.
+       * tls.h: Add multiple inclusion guard.
+
+2005-08-23  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex.h (REG_NOSYS)
+       [!defined _XOPEN_SOURCE && 200112L <= _POSIX_C_SOURCE]:
+       Define, since POSIX requires it as of 2001.
+       (_REG_ENOSYS) [! (defined _XOPEN_SOURCE || 200112L <= _POSIX_C_SOURCE)]:
+       New private symbol, used to keep the enum signed in all cases.
+       * regex.h (RE_NO_EMPTY_RANGES): Fix doc bug reported by James Youngman
+       in <http://lists.gnu.org/archive/html/bug-gnulib/2005-07/msg00132.html>.
+
+       * regex_internal.c (re_string_skip_chars, register_state):
+       (calc_state_hash):
+       Remove forward decls; no longer needed now that we use prototypes.
+       * regexec.c (acquire_init_state_context, check_halt_node_context):
+       (proceed_next_node, pop_fail_stack, sub_epsilon_src_nodes):
+       (clean_state_log_if_needed): Likewise.
+
+2005-08-20  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Fix problems reported by Sam Steingold in
+       <http://lists.gnu.org/archive/html/bug-gnulib/2005-08/msg00007.html>.
+       * regexec.c (sift_states_bkref): Fix portability bug: the code
+       assumed that reg_errcode_t is a signed type, which is not
+       necessarily true if _XOPEN_SOURCE is not defined.
+       * regex_internal.c (calc_state_hash): Put 'inline' before type, since
+       some compilers warn about it otherwise.
+
+2005-08-20  Jim Meyering  <jim@meyering.net>
+
+       * regexec.c (regexec, re_search_stub) [!_LIBC]: Omit declaration
+       of unused local, dfa.
+
+2005-08-20  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regcomp.c (create_initial_state): Remove duplicate decl.
+       (init_word_char, create_initial_state, duplicate_node_closure):
+       (fetch_token, peek_token_bracket, build_range_exp):
+       (build_collating_symbol): Remove forward decls; no longer needed
+       now that we use prototypes.
+
+       * regcomp.c:
+       (re_compile_pattern, re_set_syntax, re_compile_fastmap):
+       (re_compile_fastmap_iter, regcomp, regerror, regfree):
+       (re_compile_internal, init_dfa, init_word_char, free_workarea_compile):
+       (create_initial_state, optimize_utf8, analyze, postorder, preorder):
+       (optimize_subexps, lower_subexps, lower_subexp, calc_first, calc_next):
+       (link_nfa_nodes, duplicate_node_closure, search_duplicated_node):
+       (duplicate_node, calc_inveclosure, calc_eclosure, calc_eclosure_iter):
+       (fetch_token, peek_token, peek_token_bracket, parse, parse_reg_exp):
+       (parse_branch, parse_expression, parse_sub_exp, parse_dup_op):
+       (build_range_exp, build_collating_symbol, parse_bracket_exp):
+       (parse_bracket_element, parse_bracket_symbol, build_equiv_class):
+       (build_charclass, build_charclass_op, fetch_number, create_tree):
+       (create_token_tree, mark_opt_subexp, duplicate_tree):
+       Use prototypes rather than old-style definitions.
+
+       * regex_internal.c:
+       (re_string_allocate, re_string_construct, re_string_realloc_buffers):
+       (re_string_construct_common, build_wcs_buffer, build_wcs_upper_buffer):
+       (re_string_skip_chars, build_upper_buffer, re_string_translate_buffer):
+       (re_string_reconstruct, re_string_peek_byte_case):
+       (re_string_fetch_byte_case, re_string_destruct, re_string_context_at):
+       (re_node_set_alloc, re_node_set_init_1, re_node_set_init_2):
+       (re_node_set_init_copy, re_node_set_add_intersect):
+       (re_node_set_init_union, re_node_set_merge, re_node_set_insert):
+       (re_node_set_insert_last, re_node_set_compare, re_node_set_contains):
+       (re_node_set_remove_at, re_dfa_add_node, calc_state_hash):
+       (re_acquire_state, re_acquire_state_context, register_state):
+       (create_ci_newstate, create_cd_newstate, free_state):
+       Likewise.
+       * regexec.c (regexec, re_match, re_search, re_match_2, re_search_2):
+       (re_search_2_stub, re_search_stub, re_copy_regs, re_set_registers):
+       (re_search_internal, prune_impossible_nodes):
+       (acquire_init_state_context, check_matching, static):
+       (check_halt_node_context, check_halt_state_context, proceed_next_node):
+       (push_fail_stack, pop_fail_stack, set_regs, free_fail_stack_return):
+       (update_regs, sift_states_backward, build_sifted_states):
+       (clean_state_log_if_needed, merge_state_array):
+       (update_cur_sifted_state, add_epsilon_src_nodes):
+       (sub_epsilon_src_nodes, check_dst_limits, check_dst_limits_calc_pos_1):
+       (check_dst_limits_calc_pos, check_subexp_limits, sift_states_bkref):
+       (sift_states_iter_mb, transit_state, merge_state_with_log, static):
+       (find_recover_state, check_subexp_matching_top, transit_state_mb):
+       (transit_state_bkref, get_subexp, get_subexp_sub, find_subexp_node):
+       (check_arrival, check_arrival_add_next_nodes):
+       (check_arrival_expand_ecl, check_arrival_expand_ecl_sub):
+       (expand_bkref_cache, build_trtable, group_nodes_into_DFAstates):
+       (check_node_accept_bytes, check_node_accept, extend_buffers):
+       (match_ctx_init, match_ctx_clean, match_ctx_free, match_ctx_add_entry):
+       (search_cur_bkref_entry, match_ctx_add_subtop, match_ctx_add_sublast):
+       (sift_ctx_init):
+       Likewise.
+
+       * regex_internal.h:
+       (re_string_allocate, re_string_construct, re_string_reconstruct):
+       (re_string_realloc_buffers, build_wcs_buffer, build_wcs_upper_buffer):
+       (build_upper_buffer, re_string_translate_buffer, re_string_destruct):
+       (re_string_elem_size_at, re_string_char_size_at, re_string_wchar_at):
+       (re_string_context_at, re_string_peek_byte_case):
+       (re_string_fetch_byte_case): Declare even if RE_NO_INTERNAL_PROTOTYPES
+       is defined, since we now use prototypes always.
+
+       * regex.h (_RE_ARGS): Remove.  No longer needed, since we assume
+       C89 or better.  All uses removed.
+
+2005-08-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex_internal.c (re_acquire_state, re_acquire_state_context)
+       [defined lint]: Suppress bogus uninitialized-variable warnings.
+
+       * regcomp.c (duplicate_node): Return new index, not an error code,
+       and let the caller return REG_ESPACE if out of space.  This
+       removes an uninitialied-variable warning with GCC 4.0.1, and also
+       avoids taking the address of a local variable.  All callers
+       changed.
+
+2005-08-19  Jim Meyering  <jim@meyering.net>
+
+       * regexec.c (proceed_next_node): Redo local variables to
+       avoid GCC shadowing warnings.
+
+2005-08-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex_internal.c (re_string_realloc_buffers, re_node_set_insert):
+       (re_node_set_insert_last, re_dfa_add_node):
+       Rename local variables to avoid GCC shadowing warnings.
+
+2005-08-18  Bruno Haible  <bruno@clisp.org>
+
+       * strstr.c (strstr): Fix return value in multibyte case.
+       * strcasestr.c (strcasestr): Likewise.
+
+2005-08-17  Jim Meyering  <jim@meyering.net>
+
+       Make the %s format (seconds since the epoch) work for a negative
+       number and when used with a zero-padded field width, e.g. %015s.
+
+       * strftime.c (my_strftime): Move the `do_number_sign_and_padding'
+       label so that it precedes the code to set `digits'.  Otherwise,
+       %0Ns wouldn't work.  Before this change, `date -d @-22 +%05s' would
+       print `00-22'.  Now, it prints `-0022', as it should.
+
+2005-08-17  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regex.h: Remove useless space-before-tab.  From coreutils.
+
+2005-08-17  Bruno Haible  <bruno@clisp.org>
+
+       * strcasestr.h: New file.
+       * strcasestr.c: New file.
+
+2005-08-17  Bruno Haible  <bruno@clisp.org>
+
+       * strstr.h: Ignore HAVE_STRSTR, always declare the gnulib function.
+       * strstr.c: Completely rewritten, with multibyte locale support.
+
+2005-08-17  Bruno Haible  <bruno@clisp.org>
+
+       * strcasecmp.c: Use mbuiter.h.
+
+2005-08-17  Bruno Haible  <bruno@clisp.org>
+
+       * mbuiter.h: New file.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * strcasecmp.c (struct mbiter_multi): Remove at_end field.
+       (mbi_init): Update.
+       (mbi_avail, mbi_advance): Let the iteration end before the terminating
+       NUL byte, not after it.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * mbchar.h (mb_cmp, mb_casecmp): Order the invalid characters after
+       the valid ones. Makes the comparison operations transitive:
+       cmp (a, b) < 0 && cmp (b, c) < 0 ==> cmp (a, c) < 0.
+       * strcasecmp.c (strcasecmp): Use mb_casecmp.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * strcase.h (strcasecmp): Add note in comments.
+       * strncasecmp.c: Use code from strcasecmp.c.
+       * strcasecmp.c: Use mbchar module. Define private mbiter variant.
+       (strcasecmp): Work correctly in multibyte locales.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * strnlen1.h: New file.
+       * strnlen1.c: New file.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * mbfile.h: New file.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * mbiter.h: New file.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * mbchar.h: New file.
+       * mbchar.c: New file.
+
+2005-08-16  Bruno Haible  <bruno@clisp.org>
+
+       * tls.h: New file, from GNU gettext.
+       * tls.c: New file, from GNU gettext.
+
 2005-08-15  Bruno Haible  <bruno@clisp.org>
 
        * regex.h (__restrict_arr): Don't define to __restrict if __cplusplus