]> git.eshelyaron.com Git - emacs.git/commitdiff
(decode_coding_utf_8): Add simple loop for fast processing of ASCII characters.
authorRichard M. Stallman <rms@gnu.org>
Fri, 19 Jul 2013 16:15:51 +0000 (12:15 -0400)
committerRichard M. Stallman <rms@gnu.org>
Fri, 19 Jul 2013 16:15:51 +0000 (12:15 -0400)
src/ChangeLog
src/coding.c

index 3f67e37a1078cc4735a3088f6ee40504dde99924..975bcaaba0e1c698254e5efcbd933d4e6fb8b453 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-19  Richard Stallman  <rms@gnu.org>
+
+       * coding.c (decode_coding_utf_8): Add simple loop for fast
+       processing of ASCII characters.
+
 2013-07-19  Paul Eggert  <eggert@cs.ucla.edu>
 
        * conf_post.h (RE_TRANSLATE_P) [emacs]: Remove obsolete optimization.
index e779197bbdedc0f465fc5c495c9b1cb8e97718e0..385a22a188d8171730259468be95a1c2c37ae5f8 100644 (file)
@@ -1363,6 +1363,45 @@ decode_coding_utf_8 (struct coding_system *coding)
          break;
        }
 
+      /* In the simple case, rapidly handle ordinary characters */
+      if (multibytep && ! eol_dos
+         && charbuf < charbuf_end - 6 && src < src_end - 6)
+       {
+         while (charbuf < charbuf_end - 6 && src < src_end - 6)
+           {
+             c1 = *src;
+             if (c1 & 0x80)
+               break;
+             src++;
+             consumed_chars++;
+             *charbuf++ = c1;
+
+             c1 = *src;
+             if (c1 & 0x80)
+               break;
+             src++;
+             consumed_chars++;
+             *charbuf++ = c1;
+
+             c1 = *src;
+             if (c1 & 0x80)
+               break;
+             src++;
+             consumed_chars++;
+             *charbuf++ = c1;
+
+             c1 = *src;
+             if (c1 & 0x80)
+               break;
+             src++;
+             consumed_chars++;
+             *charbuf++ = c1;
+           }
+         /* If we handled at least one character, restart the main loop.  */
+         if (src != src_base)
+           continue;
+       }
+
       if (byte_after_cr >= 0)
        c1 = byte_after_cr, byte_after_cr = -1;
       else