blob: 31b1323d7f7010eabcb781a501dfdd0b026586c7 [file] [log] [blame]
#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);