/*-1* SPDX-License-Identifier: MIT2*3* Copyright (c) 2005-2014 Rich Felker, et al.4*5* Permission is hereby granted, free of charge, to any person obtaining6* a copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sublicense, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice shall be14* included in all copies or substantial portions of the Software.15*16* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,17* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF18* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.19* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY20* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,21* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE22* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.23*/24#include <limits.h>25#include <stdint.h>26#include <string.h>2728#define SS (sizeof(size_t))29#define ALIGN (sizeof(size_t) - 1)30#define ONES ((size_t)-1 / UCHAR_MAX)31#define HIGHS (ONES * (UCHAR_MAX / 2 + 1))32#define HASZERO(x) (((x)-ONES) & ~(x)&HIGHS)3334void *35memchr(const void *src, int c, size_t n)36{37const unsigned char *s = src;38c = (unsigned char)c;39#ifdef __GNUC__40for (; ((uintptr_t)s & ALIGN) && n && *s != c; s++, n--)41;42if (n && *s != c) {43typedef size_t __attribute__((__may_alias__)) word;44const word *w;45size_t k = ONES * c;46for (w = (const void *)s; n >= SS && !HASZERO(*w ^ k);47w++, n -= SS)48;49s = (const void *)w;50}51#endif52for (; n && *s != c; s++, n--)53;54return n ? (void *)s : 0;55}565758