Requires a libc minor bump, committing now so that we have up-to-date snapshots for the upcoming hackathon. joint work with millert@ man page bits ok jmc@ input and ok millert@, guenther@, deraadt@OPENBSD_5_4
@ -0,0 +1,77 @@ | |||||
.\" $OpenBSD: memmem.3,v 1.1 2013/05/13 10:37:02 ajacoutot Exp $ | |||||
.\" | |||||
.\" Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com> | |||||
.\" | |||||
.\" 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. The name of the author may not be used to endorse or promote | |||||
.\" products derived from this software without specific prior written | |||||
.\" permission. | |||||
.\" | |||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. | |||||
.\" | |||||
.Dd $Mdocdate: May 13 2013 $ | |||||
.Dt MEMMEM 3 | |||||
.Os | |||||
.Sh NAME | |||||
.Nm memmem | |||||
.Nd locate a byte substring in a byte string | |||||
.Sh SYNOPSIS | |||||
.In string.h | |||||
.Ft "void *" | |||||
.Fo memmem | |||||
.Fa "const void *big" "size_t big_len" | |||||
.Fa "const void *little" "size_t little_len" | |||||
.Fc | |||||
.Sh DESCRIPTION | |||||
The | |||||
.Fn memmem | |||||
function | |||||
locates the first occurrence of the byte string | |||||
.Fa little | |||||
in the byte string | |||||
.Fa big . | |||||
.Sh RETURN VALUES | |||||
If | |||||
.Fa little | |||||
is zero length, | |||||
.Fa big | |||||
is returned; if | |||||
.Fa little | |||||
occurs nowhere in | |||||
.Fa big , | |||||
.Dv NULL | |||||
is returned; | |||||
otherwise a pointer to the first character of the first occurrence of | |||||
.Fa little | |||||
is returned. | |||||
.Sh SEE ALSO | |||||
.Xr memchr 3 , | |||||
.Xr strchr 3 , | |||||
.Xr strstr 3 | |||||
.Sh STANDARDS | |||||
.Fn memmem | |||||
is a GNU extension. | |||||
.Sh HISTORY | |||||
The | |||||
.Fn memmem | |||||
function first appeared in | |||||
.Ox 5.4 . | |||||
.Sh AUTHORS | |||||
.An Pascal Gloor Aq pascal.gloor@spale.com |
@ -0,0 +1,64 @@ | |||||
/* $OpenBSD: memmem.c,v 1.1 2013/05/13 10:37:02 ajacoutot Exp $ */ | |||||
/*- | |||||
* Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com> | |||||
* | |||||
* 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. The name of the author may not be used to endorse or promote | |||||
* products derived from this software without specific prior written | |||||
* permission. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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> | |||||
#include <string.h> | |||||
/* | |||||
* Find the first occurrence of the byte string s in byte string l. | |||||
*/ | |||||
void * | |||||
memmem(const void *l, size_t l_len, const void *s, size_t s_len) | |||||
{ | |||||
const char *cur, *last; | |||||
const char *cl = l; | |||||
const char *cs = s; | |||||
/* a zero length needle should just return the haystack */ | |||||
if (l_len == 0) | |||||
return (void *)cl; | |||||
/* "s" must be smaller or equal to "l" */ | |||||
if (l_len < s_len) | |||||
return NULL; | |||||
/* special case where s_len == 1 */ | |||||
if (s_len == 1) | |||||
return memchr(l, *cs, l_len); | |||||
/* the last position where its possible to find "s" in "l" */ | |||||
last = cl + l_len - s_len; | |||||
for (cur = cl; cur <= last; cur++) | |||||
if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0) | |||||
return (void *)cur; | |||||
return NULL; | |||||
} |