mirror of
https://github.com/fluencelabs/musl
synced 2025-06-10 05:21:34 +00:00
when strchr fails, and important piece of information already computed, the string length, is thrown away. have strchrnul (with namespace protection) be the underlying function so this information can be kept, and let strchr be a wrapper for it. this also allows strcspn to be considerably faster in the case where the match set has a single element that's not matched.
20 lines
494 B
C
20 lines
494 B
C
#include <string.h>
|
|
|
|
#define BITOP(a,b,op) \
|
|
((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
|
|
|
|
char *__strchrnul(const char *, int);
|
|
|
|
size_t strcspn(const char *s, const char *c)
|
|
{
|
|
const char *a = s;
|
|
size_t byteset[32/sizeof(size_t)];
|
|
|
|
if (!c[0] || !c[1]) return __strchrnul(s, *c)-a;
|
|
|
|
memset(byteset, 0, sizeof byteset);
|
|
for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++);
|
|
for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++);
|
|
return s-a;
|
|
}
|