7 #define ALIGN (sizeof(size_t)-1)
8 #define ONES ((size_t)-1/UCHAR_MAX)
9 #define HIGHS (ONES * (UCHAR_MAX/2+1))
10 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
12 size_t strlcpy(char *d
, const char *s
, size_t n
)
18 if (!n
--) goto finish
;
19 if (((uintptr_t)s
& ALIGN
) == ((uintptr_t)d
& ALIGN
)) {
20 for (; ((uintptr_t)s
& ALIGN
) && n
&& (*d
=*s
); n
--, s
++, d
++);
22 wd
=(void *)d
; ws
=(const void *)s
;
23 for (; n
>=sizeof(size_t) && !HASZERO(*ws
);
24 n
-=sizeof(size_t), ws
++, wd
++) *wd
= *ws
;
25 d
=(void *)wd
; s
=(const void *)ws
;
28 for (; n
&& (*d
=*s
); n
--, s
++, d
++);
31 return d
-d0
+ strlen(s
);