emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/src ChangeLog search.c


From: Andreas Schwab
Subject: [Emacs-diffs] emacs/src ChangeLog search.c
Date: Sun, 22 Nov 2009 12:11:03 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Andreas Schwab <schwab> 09/11/22 12:11:02

Modified files:
        src            : ChangeLog search.c 

Log message:
        (simple_search): Avoid CHAR_TO_BYTE in inner loop when
        searching backwards through multibyte buffer.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/ChangeLog?cvsroot=emacs&r1=1.7889&r2=1.7890
http://cvs.savannah.gnu.org/viewcvs/emacs/src/search.c?cvsroot=emacs&r1=1.247&r2=1.248

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.7889
retrieving revision 1.7890
diff -u -b -r1.7889 -r1.7890
--- ChangeLog   21 Nov 2009 15:28:59 -0000      1.7889
+++ ChangeLog   22 Nov 2009 12:11:00 -0000      1.7890
@@ -1,3 +1,8 @@
+2009-11-22  Andreas Schwab  <address@hidden>
+
+       * search.c (simple_search): Avoid CHAR_TO_BYTE in inner loop when
+       searching backwards through multibyte buffer.
+
 2009-11-21  Jan Djärv  <address@hidden>
 
        * xterm.c: #include xgselect.h.

Index: search.c
===================================================================
RCS file: /sources/emacs/emacs/src/search.c,v
retrieving revision 1.247
retrieving revision 1.248
diff -u -b -r1.247 -r1.248
--- search.c    21 Nov 2009 11:52:29 -0000      1.247
+++ search.c    22 Nov 2009 12:11:02 -0000      1.248
@@ -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;
+           unsigned char *p = pat + len_byte;
 
-           if (this_pos < lim || (pos_byte - len_byte) < lim_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;
              }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]