mirror of
https://github.com/fluencelabs/musl
synced 2025-05-29 15:41:36 +00:00
this only made the function unnecessarily slow on systems with unaligned access, but would of course crash on systems that can't do unaligned accesses (none of which have ports yet).
33 lines
769 B
C
33 lines
769 B
C
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <limits.h>
|
|
#include "libc.h"
|
|
|
|
#define ALIGN (sizeof(size_t)-1)
|
|
#define ONES ((size_t)-1/UCHAR_MAX)
|
|
#define HIGHS (ONES * (UCHAR_MAX/2+1))
|
|
#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
|
|
|
|
char *__stpncpy(char *d, const char *s, size_t n)
|
|
{
|
|
size_t *wd;
|
|
const size_t *ws;
|
|
|
|
if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
|
|
for (; ((uintptr_t)s & ALIGN) && n && (*d=*s); n--, s++, d++);
|
|
if (!n || !*s) goto tail;
|
|
wd=(void *)d; ws=(const void *)s;
|
|
for (; n>=sizeof(size_t) && !HASZERO(*ws);
|
|
n-=sizeof(size_t), ws++, *wd++) *wd = *ws;
|
|
d=(void *)wd; s=(const void *)ws;
|
|
}
|
|
for (; n && (*d=*s); n--, s++, d++);
|
|
tail:
|
|
memset(d, 0, n);
|
|
return d;
|
|
}
|
|
|
|
weak_alias(__stpncpy, stpncpy);
|
|
|