#include #include #define aliases __attribute__((__may_alias__)) #define byte_repeat(x) ((size_t)~0 / 0xff * (x)) #define word_has_zero(x) (((x) - byte_repeat(0x01)) & ~(x) & byte_repeat(0x80)) int strncmp(const char *_l, const char *_r, size_t n) { const unsigned char *l = (const void *)_l, *r = (const void *)_r; const size_t aliases *wl, aliases *wr; if (!n--) return 0; if (n < sizeof(size_t) * 3 || ((uintptr_t)l | (uintptr_t)r) & sizeof(size_t) - 1) goto bytewise; for (; (uintptr_t)l & sizeof(size_t) - 1 && *l && *l == *r ; l++, r++, n--); if ((uintptr_t)l & sizeof(size_t) - 1) return *l - *r; wl = (const void *)l; wr = (const void *)r; for (; n >= sizeof(size_t) && !word_has_zero(*wl) && *wl == *wr ; wl++, wr++, n -= sizeof(size_t)); l = (const void *)wl; r = (const void *)wr; bytewise: for (; n && *l && *l == *r; l++, r++, n--); return *l - *r; }