1*c9945492SAndroid Build Coastguard Worker #include <string.h> 2*c9945492SAndroid Build Coastguard Worker #include <stdint.h> 3*c9945492SAndroid Build Coastguard Worker #include <limits.h> 4*c9945492SAndroid Build Coastguard Worker 5*c9945492SAndroid Build Coastguard Worker #define ALIGN (sizeof(size_t)) 6*c9945492SAndroid Build Coastguard Worker #define ONES ((size_t)-1/UCHAR_MAX) 7*c9945492SAndroid Build Coastguard Worker #define HIGHS (ONES * (UCHAR_MAX/2+1)) 8*c9945492SAndroid Build Coastguard Worker #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS) 9*c9945492SAndroid Build Coastguard Worker __strchrnul(const char * s,int c)10*c9945492SAndroid Build Coastguard Workerchar *__strchrnul(const char *s, int c) 11*c9945492SAndroid Build Coastguard Worker { 12*c9945492SAndroid Build Coastguard Worker c = (unsigned char)c; 13*c9945492SAndroid Build Coastguard Worker if (!c) return (char *)s + strlen(s); 14*c9945492SAndroid Build Coastguard Worker 15*c9945492SAndroid Build Coastguard Worker #ifdef __GNUC__ 16*c9945492SAndroid Build Coastguard Worker typedef size_t __attribute__((__may_alias__)) word; 17*c9945492SAndroid Build Coastguard Worker const word *w; 18*c9945492SAndroid Build Coastguard Worker for (; (uintptr_t)s % ALIGN; s++) 19*c9945492SAndroid Build Coastguard Worker if (!*s || *(unsigned char *)s == c) return (char *)s; 20*c9945492SAndroid Build Coastguard Worker size_t k = ONES * c; 21*c9945492SAndroid Build Coastguard Worker for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++); 22*c9945492SAndroid Build Coastguard Worker s = (void *)w; 23*c9945492SAndroid Build Coastguard Worker #endif 24*c9945492SAndroid Build Coastguard Worker for (; *s && *(unsigned char *)s != c; s++); 25*c9945492SAndroid Build Coastguard Worker return (char *)s; 26*c9945492SAndroid Build Coastguard Worker } 27*c9945492SAndroid Build Coastguard Worker 28*c9945492SAndroid Build Coastguard Worker weak_alias(__strchrnul, strchrnul); 29