Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/string Add memmem(3), compatible with version in Linux



details:   https://anonhg.NetBSD.org/src/rev/0e18bbdd5e9d
branches:  trunk
changeset: 574807:0e18bbdd5e9d
user:      perry <perry%NetBSD.org@localhost>
date:      Sun Mar 13 14:47:02 2005 +0000

description:
Add memmem(3), compatible with version in Linux

diffstat:

 lib/libc/string/memmem.3 |  91 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/libc/string/memmem.c |  87 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 178 insertions(+), 0 deletions(-)

diffs (186 lines):

diff -r 4c23d36d8550 -r 0e18bbdd5e9d lib/libc/string/memmem.3
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/string/memmem.3  Sun Mar 13 14:47:02 2005 +0000
@@ -0,0 +1,91 @@
+.\"    $NetBSD: memmem.3,v 1.1 2005/03/13 14:47:02 perry Exp $
+.\"
+.\" Copyright (c) 2005 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Perry E. Metzger of Metzger, Dowdeswell & Co. LLC.
+.\"
+.\" 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 NetBSD
+.\"        Foundation, Inc. and its contributors.
+.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 March 12, 2005
+.Dt MEMMEM 3
+.Os
+.Sh NAME
+.Nm memmem
+.Nd locate substring in byte string
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In string.h
+.Ft void *
+.Fn memmem "const void *block" "size_t blen" "const void *pat" "size_t plen"
+.Sh DESCRIPTION
+The
+.Fn memmem
+function locates the first occurrence of the binary string
+.Fa pat
+of size
+.Fa plen
+bytes in within the byte string
+.Fa block
+of size
+.Fa blen
+bytes.
+.Sh RETURN VALUES
+The
+.Fn memmem
+function returns a pointer to the substring located, or
+.Dv NULL
+if no such substring exists within
+.Fa block .
+.Pp
+If
+.Fa plen
+is zero,
+.Fa block
+is returned, i.e. a zero length
+.Fa pat
+is deemed to match the start of the string, as with
+.Xr strstr 3 .
+.Sh SEE ALSO
+.Xr bm 3 ,
+.Xr memchr 3 ,
+.Xr strchr 3 ,
+.Xr strstr 3
+.Sh STANDARDS
+The
+.Fn memmem
+function is not currently standardized.
+However, it is meant to be API compatible with functions in
+.Fx
+and Linux.
+.Sh HISTORY
+.Fn memmem
+first appeared in the Free Software Foundation's glibc library.
diff -r 4c23d36d8550 -r 0e18bbdd5e9d lib/libc/string/memmem.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/string/memmem.c  Sun Mar 13 14:47:02 2005 +0000
@@ -0,0 +1,87 @@
+/*     $NetBSD: memmem.c,v 1.1 2005/03/13 14:47:02 perry Exp $ */
+
+/*-
+ * Copyright (c) 2005 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Perry E. Metzger of Metzger, Dowdeswell & Co. LLC.
+ *
+ * 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 NetBSD
+ *     Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: memmem.c,v 1.1 2005/03/13 14:47:02 perry Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+#include <assert.h>
+#include <string.h>
+#else
+#include <lib/libkern/libkern.h>
+#define _DIAGASSERT(x) (void)0
+#define        NULL            ((void *)0)
+#endif
+
+void *
+memmem(const void *block, size_t blen, const void *pat, size_t plen)
+{
+       const unsigned char *bp, *pp, *endp;
+
+       _DIAGASSERT(block != NULL);
+       _DIAGASSERT(pat != NULL);
+
+       /*
+        * Following the precedent in ststr(3) and glibc, a zero
+        * length pattern matches the start of block.
+        */
+       if (plen == 0)
+               return __UNCONST(block);
+
+       if (blen < plen)
+               return NULL;
+
+       bp = block;
+       pp = pat;
+       endp = bp + (blen - plen) + 1;
+
+       /*
+        * As a cheezy optimization, check that the first chars are
+        * the same before calling memcmp. Really we should use bm(3)
+        * to speed this up if blen is large enough.
+        */
+       while (bp < endp) {
+               if ((*bp == *pp) && (memcmp(bp, pp, plen) == 0))
+                       return __UNCONST(bp);
+               bp++;
+       }
+
+       return NULL;
+}



Home | Main Index | Thread Index | Old Index