mirror of
https://github.com/reactos/reactos.git
synced 2024-09-14 06:42:52 +00:00
Add an optimized version of strpbrk to the string library.
svn path=/trunk/; revision=15929
This commit is contained in:
parent
60410fb891
commit
251cbb167f
|
@ -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>
|
||||
|
|
54
reactos/lib/string/strpbrk.c
Normal file
54
reactos/lib/string/strpbrk.c
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in a new issue