/*-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 ALIGN (sizeof(size_t))29#define ONES ((size_t)-1 / UCHAR_MAX)30#define HIGHS (ONES * (UCHAR_MAX / 2 + 1))31#define HASZERO(x) (((x)-ONES) & ~(x)&HIGHS)3233char *__strchrnul(const char *, int);3435char *36__strchrnul(const char *s, int c)37{38c = (unsigned char)c;39if (!c)40return (char *)s + strlen(s);4142#ifdef __GNUC__43typedef size_t __attribute__((__may_alias__)) word;44const word *w;45for (; (uintptr_t)s % ALIGN; s++)46if (!*s || *(unsigned char *)s == c)47return (char *)s;48size_t k = ONES * c;49for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w ^ k); w++)50;51s = (void *)w;52#endif53for (; *s && *(unsigned char *)s != c; s++)54;55return (char *)s;56}5758__weak_reference(__strchrnul, strchrnul);596061