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;
+}
+
Show replies by date