OSDN Git Service

Add memmem().
authorManuel Novoa III <mjn3@codepoet.org>
Mon, 16 Jun 2003 04:50:09 +0000 (04:50 -0000)
committerManuel Novoa III <mjn3@codepoet.org>
Mon, 16 Jun 2003 04:50:09 +0000 (04:50 -0000)
include/string.h
libc/string/Makefile
libc/string/wstring.c

index 872ccca..8aa40f2 100644 (file)
@@ -199,14 +199,12 @@ extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
 #endif
 
 #ifdef __USE_GNU
-#if 0
 /* Find the first occurrence of NEEDLE in HAYSTACK.
    NEEDLE is NEEDLELEN bytes long;
    HAYSTACK is HAYSTACKLEN bytes long.  */
 extern void *memmem (__const void *__haystack, size_t __haystacklen,
                     __const void *__needle, size_t __needlelen)
      __THROW __attribute_pure__;
-#endif
 
 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
    last written byte.  */
index fe9b643..5ec0924 100644 (file)
@@ -33,7 +33,7 @@ MOBJW=  basename.o bcopy.o bzero.o dirname.o ffs.o memccpy.o memchr.o memcmp.o \
        strspn.o strstr.o strtok.o strtok_r.o strerror.o _susv3_strerror_r.o \
        _string_syserrmsgs.o _glibc_strerror_r.o \
        _string_syssigmsgs.o sys_siglist.o strsignal.o psignal.o \
-        __xpg_basename.o strlcat.o strlcpy.o sys_errlist.o
+        __xpg_basename.o strlcat.o strlcpy.o sys_errlist.o memmem.o
 
 MOBJW2= wcscasecmp.o wcscat.o wcschrnul.o wcschr.o wcscmp.o wcscpy.o wcscspn.o \
        wcsdup.o wcslen.o wcsncasecmp.o wcsncat.o wcsncmp.o wcsncpy.o \
index 9661893..343e82b 100644 (file)
@@ -1462,6 +1462,40 @@ char *_glibc_strerror_r(int errnum, char *strerrbuf, size_t buflen)
 
 #endif
 /**********************************************************************/
+#ifdef L_memmem
+
+void *memmem(const void *haystack, size_t haystacklen,
+                    const void *needle, size_t needlelen)
+{
+       register const char *ph;
+       register const char *pn;
+       const char *plast;
+       size_t n;
+
+       if (needlelen == 0) {
+               return (void *) haystack;
+       }
+
+       if (haystacklen >= needlelen) {
+               ph = (const char *) haystack;
+               pn = (const char *) needle;
+               plast = ph + (haystacklen - needlelen);
+
+               do {
+                       n = 0;
+                       while (ph[n] == pn[n]) {
+                               if (++n == needlelen) {
+                                       return (void *) ph;
+                               }
+                       }
+               } while (++ph <= plast);
+       }
+
+       return NULL;
+}
+
+#endif
+/**********************************************************************/
 #ifdef L_wmempcpy
 #define L_mempcpy
 #define Wmempcpy wmempcpy