summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorajacoutot <>2013-05-13 10:37:02 +0000
committerajacoutot <>2013-05-13 10:37:02 +0000
commit98bb27acd3973a0296efccfb907ccac300de8996 (patch)
tree4d8e9c368301d9076531324bf9aded39c3bd5201 /src
parent88297475d30909ea98bfdcf7b87ac8dc0a377cc4 (diff)
downloadopenbsd-98bb27acd3973a0296efccfb907ccac300de8996.tar.gz
openbsd-98bb27acd3973a0296efccfb907ccac300de8996.tar.bz2
openbsd-98bb27acd3973a0296efccfb907ccac300de8996.zip
Add an implementation of memmem() -- from FreeBSD with some tweaks.
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@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/string/Makefile.inc8
-rw-r--r--src/lib/libc/string/memmem.377
-rw-r--r--src/lib/libc/string/memmem.c64
3 files changed, 145 insertions, 4 deletions
diff --git a/src/lib/libc/string/Makefile.inc b/src/lib/libc/string/Makefile.inc
index 6b78a4d007..6454a8dfef 100644
--- a/src/lib/libc/string/Makefile.inc
+++ b/src/lib/libc/string/Makefile.inc
@@ -1,9 +1,9 @@
1# $OpenBSD: Makefile.inc,v 1.29 2012/08/02 13:38:38 okan Exp $ 1# $OpenBSD: Makefile.inc,v 1.30 2013/05/13 10:37:02 ajacoutot Exp $
2 2
3# string sources 3# string sources
4.PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/string ${LIBCSRCDIR}/string 4.PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/string ${LIBCSRCDIR}/string
5 5
6SRCS+= bm.c memccpy.c memrchr.c stpcpy.c stpncpy.c \ 6SRCS+= bm.c memccpy.c memmem.c memrchr.c stpcpy.c stpncpy.c \
7 strcasecmp.c strcasestr.c strcoll.c strdup.c \ 7 strcasecmp.c strcasestr.c strcoll.c strdup.c \
8 strerror.c strerror_r.c strlcat.c strmode.c strndup.c strnlen.c \ 8 strerror.c strerror_r.c strlcat.c strmode.c strndup.c strnlen.c \
9 strsignal.c strtok.c strxfrm.c \ 9 strsignal.c strtok.c strxfrm.c \
@@ -121,8 +121,8 @@ strrchr.so: rindex.c
121.endif 121.endif
122 122
123MAN+= bm.3 bcmp.3 bcopy.3 bstring.3 bzero.3 ffs.3 memccpy.3 memchr.3 \ 123MAN+= bm.3 bcmp.3 bcopy.3 bstring.3 bzero.3 ffs.3 memccpy.3 memchr.3 \
124 memcmp.3 memcpy.3 memmove.3 memset.3 stpcpy.3 strcasecmp.3 strcat.3 \ 124 memcmp.3 memcpy.3 memmem.3 memmove.3 memset.3 stpcpy.3 strcasecmp.3 \
125 strchr.3 strcmp.3 strcoll.3 strcpy.3 strcspn.3 strerror.3 \ 125 strcat.3 strchr.3 strcmp.3 strcoll.3 strcpy.3 strcspn.3 strerror.3 \
126 string.3 strlen.3 strmode.3 strdup.3 strpbrk.3 strrchr.3 strsep.3 \ 126 string.3 strlen.3 strmode.3 strdup.3 strpbrk.3 strrchr.3 strsep.3 \
127 strsignal.3 strspn.3 strstr.3 strtok.3 strxfrm.3 swab.3 strlcpy.3 \ 127 strsignal.3 strspn.3 strstr.3 strtok.3 strxfrm.3 swab.3 strlcpy.3 \
128 wcscasecmp.3 wcscat.3 wcschr.3 wcscmp.3 wcscpy.3 wcscspn.3 wcsdup.3 \ 128 wcscasecmp.3 wcscat.3 wcschr.3 wcscmp.3 wcscpy.3 wcscspn.3 wcsdup.3 \
diff --git a/src/lib/libc/string/memmem.3 b/src/lib/libc/string/memmem.3
new file mode 100644
index 0000000000..944bfe02fb
--- /dev/null
+++ b/src/lib/libc/string/memmem.3
@@ -0,0 +1,77 @@
1.\" $OpenBSD: memmem.3,v 1.1 2013/05/13 10:37:02 ajacoutot Exp $
2.\"
3.\" Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
4.\"
5.\" Redistribution and use in source and binary forms, with or without
6.\" modification, are permitted provided that the following conditions
7.\" are met:
8.\" 1. Redistributions of source code must retain the above copyright
9.\" notice, this list of conditions and the following disclaimer.
10.\" 2. Redistributions in binary form must reproduce the above copyright
11.\" notice, this list of conditions and the following disclaimer in the
12.\" documentation and/or other materials provided with the distribution.
13.\" 3. The name of the author may not be used to endorse or promote
14.\" products derived from this software without specific prior written
15.\" permission.
16.\"
17.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27.\" SUCH DAMAGE.
28.\"
29.Dd $Mdocdate: May 13 2013 $
30.Dt MEMMEM 3
31.Os
32.Sh NAME
33.Nm memmem
34.Nd locate a byte substring in a byte string
35.Sh SYNOPSIS
36.In string.h
37.Ft "void *"
38.Fo memmem
39.Fa "const void *big" "size_t big_len"
40.Fa "const void *little" "size_t little_len"
41.Fc
42.Sh DESCRIPTION
43The
44.Fn memmem
45function
46locates the first occurrence of the byte string
47.Fa little
48in the byte string
49.Fa big .
50.Sh RETURN VALUES
51If
52.Fa little
53is zero length,
54.Fa big
55is returned; if
56.Fa little
57occurs nowhere in
58.Fa big ,
59.Dv NULL
60is returned;
61otherwise a pointer to the first character of the first occurrence of
62.Fa little
63is returned.
64.Sh SEE ALSO
65.Xr memchr 3 ,
66.Xr strchr 3 ,
67.Xr strstr 3
68.Sh STANDARDS
69.Fn memmem
70is a GNU extension.
71.Sh HISTORY
72The
73.Fn memmem
74function first appeared in
75.Ox 5.4 .
76.Sh AUTHORS
77.An Pascal Gloor Aq pascal.gloor@spale.com
diff --git a/src/lib/libc/string/memmem.c b/src/lib/libc/string/memmem.c
new file mode 100644
index 0000000000..b54931a9cf
--- /dev/null
+++ b/src/lib/libc/string/memmem.c
@@ -0,0 +1,64 @@
1/* $OpenBSD: memmem.c,v 1.1 2013/05/13 10:37:02 ajacoutot Exp $ */
2/*-
3 * Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31#include <string.h>
32
33/*
34 * Find the first occurrence of the byte string s in byte string l.
35 */
36
37void *
38memmem(const void *l, size_t l_len, const void *s, size_t s_len)
39{
40 const char *cur, *last;
41 const char *cl = l;
42 const char *cs = s;
43
44 /* a zero length needle should just return the haystack */
45 if (l_len == 0)
46 return (void *)cl;
47
48 /* "s" must be smaller or equal to "l" */
49 if (l_len < s_len)
50 return NULL;
51
52 /* special case where s_len == 1 */
53 if (s_len == 1)
54 return memchr(l, *cs, l_len);
55
56 /* the last position where its possible to find "s" in "l" */
57 last = cl + l_len - s_len;
58
59 for (cur = cl; cur <= last; cur++)
60 if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
61 return (void *)cur;
62
63 return NULL;
64}