1 /* Copyright (C) 1996-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <https://www.gnu.org/licenses/>. */ 17 18 #include <wchar.h> 19 20 #ifdef WMEMCHR 21 # define __wmemchr WMEMCHR 22 #endif 23 24 wchar_t * __wmemchr(const wchar_t * s,wchar_t c,size_t n)25__wmemchr (const wchar_t *s, wchar_t c, size_t n) 26 { 27 /* For performance reasons unfold the loop four times. */ 28 while (n >= 4) 29 { 30 if (s[0] == c) 31 return (wchar_t *) s; 32 if (s[1] == c) 33 return (wchar_t *) &s[1]; 34 if (s[2] == c) 35 return (wchar_t *) &s[2]; 36 if (s[3] == c) 37 return (wchar_t *) &s[3]; 38 s += 4; 39 n -= 4; 40 } 41 42 if (n > 0) 43 { 44 if (*s == c) 45 return (wchar_t *) s; 46 ++s; 47 --n; 48 } 49 if (n > 0) 50 { 51 if (*s == c) 52 return (wchar_t *) s; 53 ++s; 54 --n; 55 } 56 if (n > 0) 57 if (*s == c) 58 return (wchar_t *) s; 59 60 return NULL; 61 } 62 libc_hidden_def (__wmemchr) 63 weak_alias (__wmemchr, wmemchr) 64 libc_hidden_weak (wmemchr) 65