unistr/u8-strchr: Optimize ASCII argument case.
authorPádraig Brady <P@draigBrady.com>
Sun, 11 Jul 2010 13:28:55 +0000 (15:28 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 11 Jul 2010 13:28:55 +0000 (15:28 +0200)
ChangeLog
lib/unistr/u8-strchr.c

index 1207bef..28b0b0f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-11  Pádraig Brady  <P@draigBrady.com>
+            Bruno Haible  <bruno@clisp.org>
+
+       unistr/u8-strchr: Optimize ASCII argument case.
+       * lib/unistr/u8-strchr.c (u8_strchr): For ASCII arguments, use strchr.
+
 2010-07-08  Paul Eggert  <eggert@cs.ucla.edu>
 
        (x)memcoll: minor tweaks
index 3be14c7..0b5e993 100644 (file)
@@ -21,6 +21,8 @@
 /* Specification.  */
 #include "unistr.h"
 
+#include <string.h>
+
 uint8_t *
 u8_strchr (const uint8_t *s, ucs4_t uc)
 {
@@ -30,18 +32,31 @@ u8_strchr (const uint8_t *s, ucs4_t uc)
     {
       uint8_t c0 = uc;
 
-      for (;; s++)
+      if (false)
+        {
+          /* Unoptimized code.  */
+          for (;; s++)
+            {
+              if (*s == c0)
+                break;
+              if (*s == 0)
+                goto notfound;
+            }
+          return (uint8_t *) s;
+        }
+      else
         {
-          if (*s == c0)
-            break;
-          if (*s == 0)
-            goto notfound;
+          /* Optimized code.
+             strchr() is often so well optimized, that it's worth the
+             added function call.  */
+          return (uint8_t *) strchr ((const char *) s, c0);
         }
-      return (uint8_t *) s;
     }
   else
     switch (u8_uctomb_aux (c, uc, 6))
       {
+      /* Loops equivalent to strstr, optimized for a specific length (2, 3, 4)
+         of the needle.  */
       case 2:
         if (*s == 0)
           goto notfound;