Index: fusl/src/string/stpcpy.c |
diff --git a/fusl/src/string/stpcpy.c b/fusl/src/string/stpcpy.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..06623c4491c4f6ebb26d7a7c664c06a4a3f54f9f |
--- /dev/null |
+++ b/fusl/src/string/stpcpy.c |
@@ -0,0 +1,28 @@ |
+#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 *__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 (; (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; |
+ } |
+ for (; (*d=*s); s++, d++); |
+ |
+ return d; |
+} |
+ |
+weak_alias(__stpcpy, stpcpy); |