changeset 61682:0015a00ccb5a

(boyer_moore): Fix previous change.
author Kenichi Handa <handa@m17n.org>
date Wed, 20 Apr 2005 07:21:47 +0000
parents f571b77284ff
children 589380e2abb7
files src/search.c
diffstat 1 files changed, 18 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/search.c	Wed Apr 20 02:06:48 2005 +0000
+++ b/src/search.c	Wed Apr 20 07:21:47 2005 +0000
@@ -1692,22 +1692,31 @@
 	i = infinity;
       if (! NILP (trt))
 	{
-	  /* If the byte currently looking at is a head of a character
-	     to check case-equivalents, set CH to that character.  An
-	     ASCII character and a non-ASCII character matching with
-	     CHARSET_BASE are to be checked.  */
+	  /* If the byte currently looking at is the last of a
+	     character to check case-equivalents, set CH to that
+	     character.  An ASCII character and a non-ASCII character
+	     matching with CHARSET_BASE are to be checked.  */
 	  int ch = -1;
 
 	  if (ASCII_BYTE_P (*ptr) || ! multibyte)
 	    ch = *ptr;
-	  else if (charset_base && CHAR_HEAD_P (*ptr))
+	  else if (charset_base
+		   && (pat_end - ptr) == 1 || CHAR_HEAD_P (ptr[1]))
 	    {
-	      ch = STRING_CHAR (ptr, pat_end - ptr);
+	      unsigned char *charstart = ptr - 1;
+
+	      while (! (CHAR_HEAD_P (*charstart)))
+		charstart--;
+	      ch = STRING_CHAR (charstart, ptr - charstart + 1);
 	      if (charset_base != (ch & ~CHAR_FIELD3_MASK))
 		ch = -1;
 	    }
 
-	  j = *ptr;
+	  if (ch > 0400)
+	    j = ((unsigned char) ch) | 0200;
+	  else
+	    j = *ptr;
+
 	  if (i == infinity)
 	    stride_for_teases = BM_tab[j];
 
@@ -1717,12 +1726,8 @@
 	  if (ch >= 0)
 	    {
 	      int starting_ch = ch;
-	      int starting_j;
-
-	      if (ch > 0400)
-		starting_j = ((unsigned char) ch) | 0200;
-	      else
-		starting_j = (unsigned char) ch;
+	      int starting_j = j;
+
 	      while (1)
 		{
 		  TRANSLATE (ch, inverse_trt, ch);