Index: fusl/src/string/strchrnul.c |
diff --git a/fusl/src/string/strchrnul.c b/fusl/src/string/strchrnul.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..05700ad64eea55cb8f6dffad0fe6dd97feb3d31c |
--- /dev/null |
+++ b/fusl/src/string/strchrnul.c |
@@ -0,0 +1,26 @@ |
+#include <string.h> |
+#include <stdint.h> |
+#include <limits.h> |
+#include "libc.h" |
+ |
+#define ALIGN (sizeof(size_t)) |
+#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 *s, int c) |
+{ |
+ size_t *w, k; |
+ |
+ c = (unsigned char)c; |
+ if (!c) return (char *)s + strlen(s); |
+ |
+ for (; (uintptr_t)s % ALIGN; s++) |
+ if (!*s || *(unsigned char *)s == c) return (char *)s; |
+ k = ONES * c; |
+ for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++); |
+ for (s = (void *)w; *s && *(unsigned char *)s != c; s++); |
+ return (char *)s; |
+} |
+ |
+weak_alias(__strchrnul, strchrnul); |