Index: fusl/src/string/strlen.c |
diff --git a/fusl/src/string/strlen.c b/fusl/src/string/strlen.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..929ddcbc1c2594762c7b44cdfd5edf0f2955d1f6 |
--- /dev/null |
+++ b/fusl/src/string/strlen.c |
@@ -0,0 +1,18 @@ |
+#include <string.h> |
+#include <stdint.h> |
+#include <limits.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) |
+ |
+size_t strlen(const char *s) |
+{ |
+ const char *a = s; |
+ const size_t *w; |
+ for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a; |
+ for (w = (const void *)s; !HASZERO(*w); w++); |
+ for (s = (const void *)w; *s; s++); |
+ return s-a; |
+} |