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
6size_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