OLD | NEW |
1 #include <string.h> | 1 #include <string.h> |
2 #include <stdint.h> | 2 #include <stdint.h> |
3 #include <limits.h> | 3 #include <limits.h> |
4 #include "libc.h" | 4 #include "libc.h" |
5 | 5 |
6 #define ALIGN (sizeof(size_t)) | 6 #define ALIGN (sizeof(size_t)) |
7 #define ONES ((size_t)-1/UCHAR_MAX) | 7 #define ONES ((size_t)-1 / UCHAR_MAX) |
8 #define HIGHS (ONES * (UCHAR_MAX/2+1)) | 8 #define HIGHS (ONES * (UCHAR_MAX / 2 + 1)) |
9 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS) | 9 #define HASZERO(x) ((x)-ONES & ~(x)&HIGHS) |
10 | 10 |
11 char *__stpcpy(char *restrict d, const char *restrict s) | 11 char* __stpcpy(char* restrict d, const char* restrict s) { |
12 { | 12 size_t* wd; |
13 » size_t *wd; | 13 const size_t* ws; |
14 » const size_t *ws; | |
15 | 14 |
16 » if ((uintptr_t)s % ALIGN == (uintptr_t)d % ALIGN) { | 15 if ((uintptr_t)s % ALIGN == (uintptr_t)d % ALIGN) { |
17 » » for (; (uintptr_t)s % ALIGN; s++, d++) | 16 for (; (uintptr_t)s % ALIGN; s++, d++) |
18 » » » if (!(*d=*s)) return d; | 17 if (!(*d = *s)) |
19 » » wd=(void *)d; ws=(const void *)s; | 18 return d; |
20 » » for (; !HASZERO(*ws); *wd++ = *ws++); | 19 wd = (void*)d; |
21 » » d=(void *)wd; s=(const void *)ws; | 20 ws = (const void*)s; |
22 » } | 21 for (; !HASZERO(*ws); *wd++ = *ws++) |
23 » for (; (*d=*s); s++, d++); | 22 ; |
| 23 d = (void*)wd; |
| 24 s = (const void*)ws; |
| 25 } |
| 26 for (; (*d = *s); s++, d++) |
| 27 ; |
24 | 28 |
25 » return d; | 29 return d; |
26 } | 30 } |
27 | 31 |
28 weak_alias(__stpcpy, stpcpy); | 32 weak_alias(__stpcpy, stpcpy); |
OLD | NEW |