Browse Source

Add memmem().

Manuel Novoa III 22 years ago
parent
commit
b34bab2409
3 changed files with 35 additions and 3 deletions
  1. 0 2
      include/string.h
  2. 1 1
      libc/string/Makefile
  3. 34 0
      libc/string/wstring.c

+ 0 - 2
include/string.h

@@ -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.  */

+ 1 - 1
libc/string/Makefile

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

+ 34 - 0
libc/string/wstring.c

@@ -1460,6 +1460,40 @@ char *_glibc_strerror_r(int errnum, char *strerrbuf, size_t buflen)
     return strerrbuf;
 }
 
+#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