changeset 106193:234022ddfcd1

(simple_search): Avoid CHAR_TO_BYTE in inner loop when searching backwards through multibyte buffer.
author Andreas Schwab <schwab@linux-m68k.org>
date Sun, 22 Nov 2009 12:11:00 +0000
parents a2ee981efbec
children 95389cbb5f73
files src/ChangeLog src/search.c
diffstat 2 files changed, 18 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Nov 22 03:14:14 2009 +0000
+++ b/src/ChangeLog	Sun Nov 22 12:11:00 2009 +0000
@@ -1,3 +1,8 @@
+2009-11-22  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* search.c (simple_search): Avoid CHAR_TO_BYTE in inner loop when
+	searching backwards through multibyte buffer.
+
 2009-11-21  Jan Djärv  <jan.h.d@swipnet.se>
 
 	* xterm.c: #include xgselect.h.
--- a/src/search.c	Sun Nov 22 03:14:14 2009 +0000
+++ b/src/search.c	Sun Nov 22 12:11:00 2009 +0000
@@ -1609,39 +1609,36 @@
 	while (1)
 	  {
 	    /* Try matching at position POS.  */
-	    EMACS_INT this_pos = pos - len;
-	    EMACS_INT this_pos_byte;
+	    EMACS_INT this_pos = pos;
+	    EMACS_INT this_pos_byte = pos_byte;
 	    int this_len = len;
-	    unsigned char *p = pat;
-
-	    if (this_pos < lim || (pos_byte - len_byte) < lim_byte)
+	    unsigned char *p = pat + len_byte;
+
+	    if (this_pos - len < lim || (pos_byte - len_byte) < lim_byte)
 	      goto stop;
-	    this_pos_byte = CHAR_TO_BYTE (this_pos);
-	    match_byte = pos_byte - this_pos_byte;
 
 	    while (this_len > 0)
 	      {
-		int charlen, buf_charlen;
+		int charlen;
 		int pat_ch, buf_ch;
 
-		pat_ch = STRING_CHAR_AND_LENGTH (p, charlen);
-		buf_ch = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (this_pos_byte),
-						 buf_charlen);
+		DEC_BOTH (this_pos, this_pos_byte);
+		PREV_CHAR_BOUNDARY (p, pat);
+		pat_ch = STRING_CHAR (p);
+		buf_ch = STRING_CHAR (BYTE_POS_ADDR (this_pos_byte));
 		TRANSLATE (buf_ch, trt, buf_ch);
 
 		if (buf_ch != pat_ch)
 		  break;
 
 		this_len--;
-		p += charlen;
-		this_pos_byte += buf_charlen;
-		this_pos++;
 	      }
 
 	    if (this_len == 0)
 	      {
-		pos -= len;
-		pos_byte -= match_byte;
+		match_byte = pos_byte - this_pos_byte;
+		pos = this_pos;
+		pos_byte = this_pos_byte;
 		break;
 	      }