1*92cf602eSVladimir Kondratyev /*- 2*92cf602eSVladimir Kondratyev * SPDX-License-Identifier: BSD-3-Clause 3*92cf602eSVladimir Kondratyev * 4*92cf602eSVladimir Kondratyev * Copyright (c) 1990, 1993 5*92cf602eSVladimir Kondratyev * The Regents of the University of California. All rights reserved. 6*92cf602eSVladimir Kondratyev * 7*92cf602eSVladimir Kondratyev * This code is derived from software contributed to Berkeley by 8*92cf602eSVladimir Kondratyev * Chris Torek. 9*92cf602eSVladimir Kondratyev * 10*92cf602eSVladimir Kondratyev * Copyright (c) 2011 The FreeBSD Foundation 11*92cf602eSVladimir Kondratyev * All rights reserved. 12*92cf602eSVladimir Kondratyev * Portions of this software were developed by David Chisnall 13*92cf602eSVladimir Kondratyev * under sponsorship from the FreeBSD Foundation. 14*92cf602eSVladimir Kondratyev * 15*92cf602eSVladimir Kondratyev * Redistribution and use in source and binary forms, with or without 16*92cf602eSVladimir Kondratyev * modification, are permitted provided that the following conditions 17*92cf602eSVladimir Kondratyev * are met: 18*92cf602eSVladimir Kondratyev * 1. Redistributions of source code must retain the above copyright 19*92cf602eSVladimir Kondratyev * notice, this list of conditions and the following disclaimer. 20*92cf602eSVladimir Kondratyev * 2. Redistributions in binary form must reproduce the above copyright 21*92cf602eSVladimir Kondratyev * notice, this list of conditions and the following disclaimer in the 22*92cf602eSVladimir Kondratyev * documentation and/or other materials provided with the distribution. 23*92cf602eSVladimir Kondratyev * 3. Neither the name of the University nor the names of its contributors 24*92cf602eSVladimir Kondratyev * may be used to endorse or promote products derived from this software 25*92cf602eSVladimir Kondratyev * without specific prior written permission. 26*92cf602eSVladimir Kondratyev * 27*92cf602eSVladimir Kondratyev * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28*92cf602eSVladimir Kondratyev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29*92cf602eSVladimir Kondratyev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30*92cf602eSVladimir Kondratyev * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31*92cf602eSVladimir Kondratyev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32*92cf602eSVladimir Kondratyev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33*92cf602eSVladimir Kondratyev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34*92cf602eSVladimir Kondratyev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35*92cf602eSVladimir Kondratyev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36*92cf602eSVladimir Kondratyev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37*92cf602eSVladimir Kondratyev * SUCH DAMAGE. 38*92cf602eSVladimir Kondratyev */ 39*92cf602eSVladimir Kondratyev 40*92cf602eSVladimir Kondratyev #include <sys/cdefs.h> 41*92cf602eSVladimir Kondratyev __FBSDID("$FreeBSD$"); 42*92cf602eSVladimir Kondratyev 43*92cf602eSVladimir Kondratyev #include <ctype.h> 44*92cf602eSVladimir Kondratyev #include <string.h> 45*92cf602eSVladimir Kondratyev #include "xlocale_private.h" 46*92cf602eSVladimir Kondratyev 47*92cf602eSVladimir Kondratyev /* 48*92cf602eSVladimir Kondratyev * Find the first occurrence of find in s, ignore case. 49*92cf602eSVladimir Kondratyev */ 50*92cf602eSVladimir Kondratyev char * 51*92cf602eSVladimir Kondratyev strcasestr_l(const char *s, const char *find, locale_t locale) 52*92cf602eSVladimir Kondratyev { 53*92cf602eSVladimir Kondratyev char c, sc; 54*92cf602eSVladimir Kondratyev size_t len; 55*92cf602eSVladimir Kondratyev FIX_LOCALE(locale); 56*92cf602eSVladimir Kondratyev 57*92cf602eSVladimir Kondratyev if ((c = *find++) != 0) { 58*92cf602eSVladimir Kondratyev c = tolower_l((unsigned char)c, locale); 59*92cf602eSVladimir Kondratyev len = strlen(find); 60*92cf602eSVladimir Kondratyev do { 61*92cf602eSVladimir Kondratyev do { 62*92cf602eSVladimir Kondratyev if ((sc = *s++) == 0) 63*92cf602eSVladimir Kondratyev return (NULL); 64*92cf602eSVladimir Kondratyev } while ((char)tolower_l((unsigned char)sc, locale) != c); 65*92cf602eSVladimir Kondratyev } while (strncasecmp_l(s, find, len, locale) != 0); 66*92cf602eSVladimir Kondratyev s--; 67*92cf602eSVladimir Kondratyev } 68*92cf602eSVladimir Kondratyev return ((char *)s); 69*92cf602eSVladimir Kondratyev } 70*92cf602eSVladimir Kondratyev char * 71*92cf602eSVladimir Kondratyev strcasestr(const char *s, const char *find) 72*92cf602eSVladimir Kondratyev { 73*92cf602eSVladimir Kondratyev return strcasestr_l(s, find, __get_locale()); 74*92cf602eSVladimir Kondratyev } 75