| 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);
|
|
|