1 #include <string.h>
2 
3 #define BITOP(a, b, op) \
4     ((a)[(size_t)(b) / (8 * sizeof *(a))] op(size_t) 1 << ((size_t)(b) % (8 * sizeof *(a))))
5 
strspn(const char * s,const char * c)6 size_t strspn(const char* s, const char* c) {
7     const char* a = s;
8     size_t byteset[32 / sizeof(size_t)] = {};
9 
10     if (!c[0])
11         return 0;
12     if (!c[1]) {
13         for (; *s == *c; s++)
14             ;
15         return s - a;
16     }
17 
18     for (; *c && BITOP(byteset, *(unsigned char*)c, |=); c++)
19         ;
20     for (; *s && BITOP(byteset, *(unsigned char*)s, &); s++)
21         ;
22     return s - a;
23 }
24