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; +} +