X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fstring%2Fstrchr.c;h=bfae8f9f846a01c14d288d34e8659f265a9daf2e;hp=e606f4fee48f3155c22e426f69d9495b60979dd9;hb=de80ea9f1c2821cbb4205533b86d5d17f9e8d376;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 diff --git a/src/string/strchr.c b/src/string/strchr.c index e606f4fe..bfae8f9f 100644 --- a/src/string/strchr.c +++ b/src/string/strchr.c @@ -1,23 +1,9 @@ #include -#include -#include -#include -#define ALIGN (sizeof(size_t)-1) -#define ONES ((size_t)-1/UCHAR_MAX) -#define HIGHS (ONES * (UCHAR_MAX/2+1)) -#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS) +char *__strchrnul(const char *, int); char *strchr(const char *s, int c) { - c = (char)c; - if (!c) return (char *)s + strlen(s); - for (; ((uintptr_t)s & ALIGN) && *s && *s != c; s++); - if (*s && *s != c) { - const size_t *w; - size_t k = ONES * c; - for (w = (const void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++); - for (s = (const void *)w; *s && *s != c; s++); - } - return *s ? (char *)s : 0; + char *r = __strchrnul(s, c); + return *(unsigned char *)r == (unsigned char)c ? r : 0; }