Add a new libc function, strnstr(3), which allows one to limit the

number of characters that are searched.  This is especially useful
with file operations and non-NUL terminated strings.

Silence from:	-audit, -hackers
MFC after:	5 days
This commit is contained in:
Mike Barcroft 2001-10-09 01:29:56 +00:00
parent cabacc4a0a
commit 41036d782d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=84699
4 changed files with 125 additions and 12 deletions

View File

@ -30,7 +30,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)string.h 8.1 (Berkeley) 6/2/93
* From: @(#)string.h 8.1 (Berkeley) 6/2/93
* $FreeBSD$
*/
#ifndef _STRING_H_
@ -87,6 +88,7 @@ size_t strlcat __P((char *, const char *, size_t));
size_t strlcpy __P((char *, const char *, size_t));
void strmode __P((int, char *));
int strncasecmp __P((const char *, const char *, size_t));
char *strnstr __P((const char *, const char *, size_t));
char *strsep __P((char **, const char *));
char *strsignal __P((int));
char *strtok_r __P((char *, const char *, char **));

View File

@ -10,6 +10,7 @@ MISRCS+=bcmp.c bcopy.c bzero.c ffs.c index.c memccpy.c memchr.c memcmp.c \
memcpy.c memmove.c memset.c rindex.c strcasecmp.c strcat.c strchr.c \
strcmp.c strcoll.c strcpy.c strcspn.c strdup.c strerror.c \
strlcat.c strlcpy.c strlen.c strmode.c strncat.c strncmp.c strncpy.c \
strnstr.c \
strpbrk.c strrchr.c strsep.c strsignal.c strspn.c strstr.c strtok.c \
strxfrm.c swab.c wcscat.c wcschr.c wcscmp.c wcscpy.c wcscspn.c \
wcslcat.c wcslcpy.c wcslen.c wcsncat.c wcsncmp.c wcsncpy.c wcspbrk.c \
@ -36,6 +37,7 @@ MLINKS+=strcpy.3 strncpy.3
MLINKS+=strerror.3 perror.3 strerror.3 sys_errlist.3 strerror.3 sys_nerr.3
MLINKS+=strlcpy.3 strlcat.3
MLINKS+=strtok.3 strtok_r.3
MLINKS+=strstr.3 strnstr.3
MLINKS+=wmemchr.3 wmemcmp.3 wmemchr.3 wmemcpy.3 \
wmemchr.3 wmemmove.3 wmemchr.3 wmemset.3 \
wmemchr.3 wcscat.3 wmemchr.3 wcschr.3 \

70
lib/libc/string/strnstr.c Normal file
View File

@ -0,0 +1,70 @@
/*-
* Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__RCSID("@(#)strstr.c 8.1 (Berkeley) 6/4/93");
__FBSDID("$FreeBSD$");
#include <string.h>
/*
* Find the first occurrence of find in s, where the search is limited to the
* first slen characters of s.
*/
char *
strnstr(s, find, slen)
const char *s;
const char *find;
size_t slen;
{
char c, sc;
size_t len;
if ((c = *find++) != '\0') {
len = strlen(find);
do {
do {
if ((sc = *s++) == '\0' || slen-- < 1)
return (NULL);
} while (sc != c);
if (len > slen)
return (NULL);
} while (strncmp(s, find, len) != 0);
s--;
}
return ((char *)s);
}

View File

@ -1,3 +1,4 @@
.\" Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
.\" Copyright (c) 1990, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@ -40,7 +41,7 @@
.Dt STRSTR 3
.Os
.Sh NAME
.Nm strstr
.Nm strstr , strnstr
.Nd locate a substring in a string
.Sh LIBRARY
.Lb libc
@ -48,6 +49,8 @@
.In string.h
.Ft char *
.Fn strstr "const char *big" "const char *little"
.Ft char *
.Fn strnstr "const char *big" "const char *little" "size_t len"
.Sh DESCRIPTION
The
.Fn strstr
@ -56,22 +59,58 @@ locates the first occurrence of the null-terminated string
.Fa little
in the null-terminated string
.Fa big .
.Pp
The
.Fn strnstr
function
locates the first occurrence of the null-terminated string
.Fa little
in the string
.Fa big ,
where only the first number of characters, identified by
.Fa len ,
are searched.
.Sh RETURN VALUES
If
.Fa little
is the empty string,
.Fn strstr
returns
.Fa big ;
is an empty string,
.Fa big
is returned;
if
.Fa little
occurs nowhere in
.Fa big ,
.Fn strstr
returns NULL;
otherwise
.Fn strstr
returns a pointer to the first character of the first occurrence of
.Fa little .
NULL is returned;
otherwise a pointer to the first character of the first occurrence of
.Fa little
is returned.
.Sh EXAMPLES
The following sets the pointer
.Va ptr
to the
.Dq Li Bar Baz
portion of
.Va largestring :
.Bd -literal -offset indent
const char *largestring = "Foo Bar Baz";
const char *smallstring = "Bar";
char *ptr;
ptr = strstr(largestring, smallstring);
.Ed
.Pp
The following sets the pointer
.Va ptr
to NULL, because only the first 4 characters of
.Va largestring
are searched:
.Bd -literal -offset indent
const char *largestring = "Foo Bar Baz";
const char *smallstring = "Bar";
char *ptr;
ptr = strnstr(largestring, smallstring, 4);
.Ed
.Sh SEE ALSO
.Xr memchr 3 ,
.Xr strchr 3 ,