autoupdate
[gnulib.git] / lib / unistr / u-strstr.h
index 55b5a31..604b20c 100644 (file)
@@ -1,5 +1,5 @@
 /* Substring test for UTF-8/UTF-16/UTF-32 strings.
-   Copyright (C) 1999, 2002, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2006, 2010 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2002.
 
    This program is free software: you can redistribute it and/or modify it
@@ -24,25 +24,35 @@ FUNC (const UNIT *haystack, const UNIT *needle)
   if (first == 0)
     return (UNIT *) haystack;
 
-  /* Is needle nearly empty?  */
+  /* Is needle nearly empty (only one unit)?  */
   if (needle[1] == 0)
     return U_STRCHR (haystack, first);
 
+#ifdef U_STRMBTOUC
+  /* Is needle nearly empty (only one character)?  */
+  {
+    ucs4_t first_uc;
+    int count = U_STRMBTOUC (&first_uc, needle);
+    if (count > 0 && needle[count] == 0)
+      return U_STRCHR (haystack, first_uc);
+  }
+#endif
+
   /* Search for needle's first unit.  */
   for (; *haystack != 0; haystack++)
     if (*haystack == first)
       {
-       /* Compare with needle's remaining units.  */
-       const UNIT *hptr = haystack + 1;
-       const UNIT *nptr = needle + 1;
-       for (;;)
-         {
-           if (*hptr != *nptr)
-             break;
-           hptr++; nptr++;
-           if (*nptr == 0)
-             return (UNIT *) haystack;
-         }
+        /* Compare with needle's remaining units.  */
+        const UNIT *hptr = haystack + 1;
+        const UNIT *nptr = needle + 1;
+        for (;;)
+          {
+            if (*hptr != *nptr)
+              break;
+            hptr++; nptr++;
+            if (*nptr == 0)
+              return (UNIT *) haystack;
+          }
       }
 
   return NULL;