Add an optimized version of strpbrk to the string library.
Modified: trunk/reactos/lib/string/string.xml
Added: trunk/reactos/lib/string/strpbrk.c

Modified: trunk/reactos/lib/string/string.xml
--- trunk/reactos/lib/string/string.xml	2005-06-15 22:39:03 UTC (rev 15928)
+++ trunk/reactos/lib/string/string.xml	2005-06-15 22:47:12 UTC (rev 15929)
@@ -63,5 +63,6 @@
         <file>memccpy.c</file>
         <file>memcmp.c</file>
         <file>strcspn.c</file>
+        <file>strpbrk.c</file>
         <file>strspn.c</file>
 </module>

Added: trunk/reactos/lib/string/strpbrk.c
--- trunk/reactos/lib/string/strpbrk.c	2005-06-15 22:39:03 UTC (rev 15928)
+++ trunk/reactos/lib/string/strpbrk.c	2005-06-15 22:47:12 UTC (rev 15929)
@@ -0,0 +1,54 @@
+/*
+ * $Id$
+ */
+#include <limits.h>
+#include <string.h>
+
+#define BIT_SIZE (CHAR_BIT * sizeof(unsigned long) / sizeof(char))
+
+char* strpbrk(const char *s1, const char *s2)
+{
+    if (*s2 == 0)
+    {
+       return 0;
+    }
+    if (*(s2+1) == 0)
+    {
+       return strchr(s1, *s2);
+    }
+    else if (*(s2+2) == 0)
+    {
+       char *s3, *s4;
+       s3 = strchr(s1, *s2);
+       s4 = strchr(s1, *(s2+1));
+       if (s3 == 0)
+       {
+          return s4;
+       }
+       else if (s4 == 0)
+       {
+          return s3;
+       }
+       return s3 < s4 ? s3 : s4;
+    }
+    else
+    {
+       unsigned long char_map[(1 << CHAR_BIT) / BIT_SIZE] = {0, };
+       register unsigned char* str = (unsigned char*)s1;
+       while (*s2)
+       {
+          char_map[*(unsigned char*)s2 / BIT_SIZE] |= (1 << (*(unsigned char*)s2 % BIT_SIZE));
+          s2++;
+       }
+       while (*str)
+       {
+          if (char_map[*str / BIT_SIZE] & (1 << (*str % BIT_SIZE)))
+          {
+             return str;
+          }
+          str++;
+       }
+    }
+    return 0;
+}
+