xref: /reactos/sdk/lib/crt/string/strpbrk.c (revision 40462c92)
1 
2 #include <limits.h>
3 #include <string.h>
4 
5 #define BIT_SIZE (CHAR_BIT * sizeof(unsigned long) / sizeof(char))
6 
7 char* __cdecl strpbrk(const char *s1, const char *s2)
8 {
9     if (*s2 == 0)
10     {
11        return 0;
12     }
13     if (*(s2+1) == 0)
14     {
15        return strchr(s1, *s2);
16     }
17     else if (*(s2+2) == 0)
18     {
19        char *s3, *s4;
20        s3 = strchr(s1, *s2);
21        s4 = strchr(s1, *(s2+1));
22        if (s3 == 0)
23        {
24           return s4;
25        }
26        else if (s4 == 0)
27        {
28           return s3;
29        }
30        return s3 < s4 ? s3 : s4;
31     }
32     else
33     {
34        unsigned long char_map[(1 << CHAR_BIT) / BIT_SIZE] = {0, };
35        const unsigned char* str = (const unsigned char*)s1;
36        while (*s2)
37        {
38           char_map[*(const unsigned char*)s2 / BIT_SIZE] |= (1 << (*(const unsigned char*)s2 % BIT_SIZE));
39           s2++;
40        }
41        while (*str)
42        {
43           if (char_map[*str / BIT_SIZE] & (1 << (*str % BIT_SIZE)))
44           {
45              return (char*)((size_t)str);
46           }
47           str++;
48        }
49     }
50     return 0;
51 }
52 
53