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