aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--posix/regex_internal.c2
-rw-r--r--posix/regexec.c9
3 files changed, 15 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index e0c9e8c785..4e6ad1180b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;