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