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