char *my_strchrnul(const char *s, int c) { size_t *w, k; c = (unsigned char)c; if (!c) return (char *)s + my_strlen(s); for (; (uintptr_t)s % ALIGN; s++) if (!*s || *(unsigned char *)s == c) return (char *)s; k = ONES * c; for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++); for (s = (void *)w; *s && *(unsigned char *)s != c; s++); return (char *)s; }
size_t strlen(const char *s) { const char *a = s; const size_t *w; for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a; for (w = (const void *)s; !HASZERO(*w); w++); for (s = (const void *)w; *s; s++); return s-a; }
size_t strlen(const char *s) { const char *a = s; const size_t *w; for (; ((uintptr_t)s & ALIGN) && *s; s++); if (*s) { for (w = (const void *)s; !HASZERO(*w); w++); for (s = (const void *)w; *s; s++); } return s-a; }
size_t strlen(const char *s) { const char *a = s; #ifdef __GNUC__ typedef size_t __attribute__((__may_alias__)) word; const word *w; for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a; for (w = (const void *)s; !HASZERO(*w); w++); s = (const void *)w; #endif for (; *s; s++); return s-a; }
void *memchr(const void *src, int c, size_t n) { const unsigned char *s = src; c = (unsigned char)c; for (; ((uintptr_t)s & ALIGN) && n && *s != c; s++, n--); if (n && *s != c) { const size_t *w; size_t k = ONES * c; for (w = (const void *)s; n>=SS && !HASZERO(*w^k); w++, n-=SS); for (s = (const void *)w; n && *s != c; s++, n--); } return n ? (void *)s : 0; }
char *__stpcpy(char *d, const char *s) { size_t *wd; const size_t *ws; if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) { for (; (*d=*s) && ((uintptr_t)s & ALIGN); s++, d++); if (!*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; }
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; }
size_t strlcpy(char *d, const char *s, size_t n) { char *d0 = d; size_t *wd; const size_t *ws; if (!n--) goto finish; if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) { for (; ((uintptr_t)s & ALIGN) && n && (*d=*s); n--, s++, d++); if (n && *s) { 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++); *d = 0; finish: return d-d0 + strlen(s); }