diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | posix/regex_internal.c | 2 | ||||
-rw-r--r-- | posix/regexec.c | 9 |
3 files changed, 15 insertions, 3 deletions
@@ -1,4 +1,9 @@ -2003-11-14 David Mosberger <davidm@hpl.hp.com> +2003-11-18 Ulrich Drepper <drepper@redhat.com> + + * posix/regexec.c (get_subexp): Adter calling get_subexp_seb + reload buf and bkref_str. Little optimization by avoiding memcmp. + +2003-11-14 David Mosberger <davidm@hpl.hp.com> * sysdeps/unix/sysv/linux/ia64/sysdep.h (GAS_ALIGN_BREAKS_UNWIND_INFO): Define this macro to indicate diff --git a/posix/regex_internal.c b/posix/regex_internal.c index c1605a0393..1da5f7040a 100644 --- a/posix/regex_internal.c +++ b/posix/regex_internal.c @@ -519,6 +519,8 @@ re_string_reconstruct (pstr, idx, eflags, newline) mbstate_t cur_state; wchar_t wc2; + /* XXX Don't use mbrtowc, we know which conversion + to use (UTF-8 -> UCS4). */ memset (&cur_state, 0, sizeof (cur_state)); if (mbrtowc (&wc2, p, raw + offset - p, &cur_state) == raw + offset - p) diff --git a/posix/regexec.c b/posix/regexec.c index 6f4448a078..03b97e883c 100644 --- a/posix/regexec.c +++ b/posix/regexec.c @@ -2550,6 +2550,12 @@ get_subexp (preg, mctx, bkref_node, bkref_str_idx) sl_str += sl_str_diff; err = get_subexp_sub (preg, mctx, sub_top, sub_last, bkref_node, bkref_str_idx); + + /* Reload buf and bkref_str, since the preceding call might + have reallocated the buffer. */ + buf = (char *) re_string_get_buffer (mctx->input); + bkref_str = buf + bkref_str_idx; + if (err == REG_NOMATCH) continue; if (BE (err != REG_NOERROR, 0)) @@ -2567,8 +2573,7 @@ get_subexp (preg, mctx, bkref_node, bkref_str_idx) sl_str_off = sl_str - sub_top->str_idx; /* The matched string by the sub expression match with the substring at the back reference? */ - if (sl_str_off > 0 - && memcmp (bkref_str++, buf + sl_str - 1, 1) != 0) + if (sl_str_off > 0 && *bkref_str++ != buf[sl_str - 1]) break; /* We don't need to search this sub expression any more. */ if (mctx->state_log[sl_str] == NULL) continue; |