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; | |||
} |