Add an optimized version of strpbrk to the string library.

svn path=/trunk/; revision=15929
This commit is contained in:
Hartmut Birr 2005-06-15 22:47:12 +00:00
parent 60410fb891
commit 251cbb167f
2 changed files with 55 additions and 0 deletions

View file

@ -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>

View file

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