| #include <string.h> |
| #include <stdint.h> |
| #include <limits.h> |
| |
| #define SS (sizeof(size_t)) |
| #define ALIGN (sizeof(size_t) - 1) |
| #define ONES ((size_t)-1 / UCHAR_MAX) |
| #define HIGHS (ONES * (UCHAR_MAX / 2 + 1)) |
| #define HASZERO(x) ((x)-ONES & ~(x)&HIGHS) |
| |
| 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; |
| } |