فهرست منبع

simplify logic in stpcpy; avoid copying first aligned byte twice

gcc seems to be generating identical or near-identical code for both
versions, but the newer code is more expressive of what it's doing.
Rich Felker 12 سال پیش
والد
کامیت
838951c97e
1فایلهای تغییر یافته به همراه4 افزوده شده و 4 حذف شده
  1. 4 4
      src/string/stpcpy.c

+ 4 - 4
src/string/stpcpy.c

@@ -4,7 +4,7 @@
 #include <limits.h>
 #include "libc.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)
@@ -14,9 +14,9 @@ char *__stpcpy(char *restrict d, const char *restrict s)
 	size_t *wd;
 	const size_t *ws;
 
-	if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
-		for (; (*d=*s) && ((uintptr_t)s & ALIGN); s++, d++);
-		if (!*s) return d;
+	if ((uintptr_t)s % ALIGN == (uintptr_t)d % ALIGN) {
+		for (; (uintptr_t)s % ALIGN; s++, d++)
+			if (!(*d=*s)) return d;
 		wd=(void *)d; ws=(const void *)s;
 		for (; !HASZERO(*ws); *wd++ = *ws++);
 		d=(void *)wd; s=(const void *)ws;