Branch data Line data Source code
1 : : /*- 2 : : * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org> 3 : : * Copyright (c) 1990, 1993 4 : : * The Regents of the University of California. All rights reserved. 5 : : * 6 : : * This code is derived from software contributed to Berkeley by 7 : : * Chris Torek. 8 : : * 9 : : * Redistribution and use in source and binary forms, with or without 10 : : * modification, are permitted provided that the following conditions 11 : : * are met: 12 : : * 1. Redistributions of source code must retain the above copyright 13 : : * notice, this list of conditions and the following disclaimer. 14 : : * 2. Redistributions in binary form must reproduce the above copyright 15 : : * notice, this list of conditions and the following disclaimer in the 16 : : * documentation and/or other materials provided with the distribution. 17 : : * 3. Neither the name of the University nor the names of its contributors 18 : : * may be used to endorse or promote products derived from this software 19 : : * without specific prior written permission. 20 : : * 21 : : * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 : : * SUCH DAMAGE. 32 : : */ 33 : : 34 : : #include <sys/cdefs.h> 35 : : #include <string.h> 36 : : 37 : : #if !HAVE_STRNSTR 38 : : /* 39 : : * Find the first occurrence of find in s, where the search is limited to the 40 : : * first slen characters of s. 41 : : */ 42 : : char * 43 : 0 : strnstr(const char *s, const char *find, size_t slen) 44 : : { 45 : : char c, sc; 46 : : size_t len; 47 : : 48 [ # # ]: 0 : if ((c = *find++) != '\0') { 49 : 0 : len = strlen(find); 50 : 0 : do { 51 : 0 : do { 52 [ # # # # ]: 0 : if (slen-- < 1 || (sc = *s++) == '\0') 53 : 0 : return (NULL); 54 [ # # ]: 0 : } while (sc != c); 55 [ # # ]: 0 : if (len > slen) 56 : 0 : return (NULL); 57 [ # # ]: 0 : } while (strncmp(s, find, len) != 0); 58 : 0 : s--; 59 : 0 : } 60 : 0 : return ((char *)s); 61 : 0 : } 62 : : #endif