Subject: Re: RFC: memmem(3)
To: None <wulf@ping.net.au>
From: Luke Mewburn <lukem@netbsd.org>
List: tech-userlevel
Date: 03/02/2003 22:13:36
On Sun, Mar 02, 2003 at 08:26:03PM +1030, wulf@ping.net.au wrote:
| G'day,
|
| after many uses I like to propose memmem(3) for inclusion into libc.
| memmem(3) is similar to strstr(3) with the difference that it allows
| searching for arbitary binary data patterns in an memory block,
| see man-page and source code included below fore more information.
|
| I believe that this is very versatile function that may become handy for
| many applications.
|
| As always, I entertain your constructive comments.
|
| Many thanks in advance
|
| cheerio Berndt
Looks good.
One comment; any reason the signature isn't
void *memmem(const void *b1, size_t len1, const void *b2, size_t len2);
?
(keep the lengths with the pointers they're for).
|
|
| ----------------------- memmem.3 (txt) ------------------------
| MEMMEM(3) NetBSD Programmer's Manual MEMMEM(3)
|
| NAME
| memmem - locate a binary data pattern in a block of memory
|
| LIBRARY
| Standard C Library (libc, -lc)
|
| SYOPSIS
| #include <string.h>
|
| void *
| memmem(const void *b1, const void *b2, size_t len1, size_t len2);
| void *
| memmem(const void *b1, const void *b2, size_t len1, size_t len2);
|
| DESCRIPTION
| The memmem() function locates the first occurence of a data pattern
| stored in b2 of size len2 in memory block b1 of size len1.
|
| RETURN VALUES
| The memmem() function returns a pointer to the first occurence of data
| pattern b2 in memory block b1 or NULL if none is found.
|
| SEE ALSO
| strstr(3),
|
| STANDARDS
| The memmem() function is an extension to ANSI X3.159-1989 (``ANSI C'').
|
| NetBSD 1.6 Febrary 9, 2003 1
| ----------------------- memmem.3 (txt) ------------------------
|
|
| -------------------------- memmem.c ---------------------------
| /* $NetBSD$ */
|
| /*-
| * Copyright (c) 2003 The NetBSD Foundation, Inc.
| * All rights reserved.
| *
| * This code is derived from software contributed to The NetBSD Foundation
| * by
| *
| * 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$");
| #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 ((char *)0)
| #endif
|
| /*
| * memmem() returns the location of the first occurence of data
| * pattern b2 of size len2 in memory block b1 of size len1 or
| * NULL if none is found.
| */
| void *
| memmem(const void *b1, const void *b2, size_t len1, size_t len2)
| {
| /* Initialize search pointer */
| char *sp = (char *) b1;
|
| /* Initialize pattern pointer */
| char *pp = (char *) b2;
|
| /* Intialize end of search address space pointer */
| char *eos = sp + len1 - len2;
|
| /* Sanity check */
| if(!(b1 && b2 && len1 && len2))
| return NULL;
|
| while (sp <= eos) {
| if (*sp == *pp)
| if (memcmp(sp, pp, len2) == 0)
| return sp;
|
| sp++;
| }
|
| return NULL;
| }
| -------------------------- memmem.c ---------------------------