musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012年09月27日 16:56:33 -0400
committerRich Felker <dalias@aerifal.cx>2012年09月27日 16:56:33 -0400
commit3f9ff1514e49b06c20a61af9ae9e52bd53b48d9a (patch)
tree697589451e3d75da05df6e2dd38fcdabf5b4a138
parent507faa63cb12571c14d66eb37dedbe6adbbf40a8 (diff)
downloadmusl-3f9ff1514e49b06c20a61af9ae9e52bd53b48d9a.tar.gz
slightly cleaner strlen, also seems to compile to better code
testing with gcc 4.6.3 on x86, -Os, the old version does a duplicate null byte check after the first loop. this is purely the compiler being stupid, but the old code was also stupid and unintuitive in how it expressed the check.
Diffstat
-rw-r--r--src/string/strlen.c 10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/string/strlen.c b/src/string/strlen.c
index 936fb5cf..d6f8631d 100644
--- a/src/string/strlen.c
+++ b/src/string/strlen.c
@@ -3,7 +3,7 @@
#include <stdint.h>
#include <limits.h>
-#define ALIGN (sizeof(size_t)-1)
+#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)
@@ -12,10 +12,8 @@ size_t strlen(const char *s)
{
const char *a = s;
const size_t *w;
- for (; ((uintptr_t)s & ALIGN) && *s; s++);
- if (*s) {
- for (w = (const void *)s; !HASZERO(*w); w++);
- for (s = (const void *)w; *s; s++);
- }
+ 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;
}
generated by cgit v1.2.1 (git 2.18.0) at 2025年09月07日 12:04:44 +0000

AltStyle によって変換されたページ (->オリジナル) /