Przeglądaj źródła

Add memmem(3) from FreeBSD r188080 for use where needed

Bryan Drewery 11 lat temu
rodzic
commit
300e58d8b7

+ 1 - 1
build/autotools/configure.ac

@@ -196,7 +196,7 @@ AC_FUNC_STRFTIME
 #checkpoint
 AC_CACHE_SAVE
 AC_CHECK_FUNCS([clock fsync getrusage isascii getpassphrase madvise])
-AC_CHECK_FUNCS([memcpy memset random rename snprintf srandom gettime])
+AC_CHECK_FUNCS([memcpy memmem memset random rename snprintf srandom gettime])
 #checkpoint
 AC_CACHE_SAVE
 AC_CHECK_FUNCS([strcasecmp strncasecmp vsnprintf inet_ntop])

+ 1 - 1
configure

@@ -8429,7 +8429,7 @@ _ACEOF
 fi
 done
 
-for ac_func in memcpy memset random rename snprintf srandom gettime
+for ac_func in memcpy memmem memset random rename snprintf srandom gettime
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"

+ 2 - 1
src/compat/Makefile.in

@@ -17,8 +17,9 @@ OBJS = dirname.o \
 	dn_expand.o \
 	inet_ntop.o \
 	snprintf.o \
-	memset.o \
 	memcpy.o \
+	memmem.o \
+	memset.o \
 	memutil.o \
 	strcasecmp.o \
 	strftime.o \

+ 4 - 0
src/compat/compat.h

@@ -24,6 +24,10 @@
 #include "strsep.h"
 #include "timespec.h"
 
+#ifndef HAVE_MEMMEM
+void *memmem(const void *l, size_t l_len, const void *s, size_t s_len);
+#endif
+
 /* These apparently are unsafe without recasting. */
 #define egg_isdigit(x)  isdigit((int)  (unsigned char) (x))
 #define egg_isxdigit(x) isxdigit((int) (unsigned char) (x))

+ 64 - 0
src/compat/memmem.c

@@ -0,0 +1,64 @@
+/*-
+ * Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
+ *
+ * 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. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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>
+/* $FreeBSD: head/lib/libc/string/memmem.c 188080 2009-02-03 17:58:20Z danger $ */
+#include <string.h>
+
+/*
+ * Find the first occurrence of the byte string s in byte string l.
+ */
+
+void *
+memmem(const void *l, size_t l_len, const void *s, size_t s_len)
+{
+	register char *cur, *last;
+	const char *cl = (const char *)l;
+	const char *cs = (const char *)s;
+
+	/* we need something to compare */
+	if (l_len == 0 || s_len == 0)
+		return NULL;
+
+	/* "s" must be smaller or equal to "l" */
+	if (l_len < s_len)
+		return NULL;
+
+	/* special case where s_len == 1 */
+	if (s_len == 1)
+		return memchr(l, (int)*cs, l_len);
+
+	/* the last position where its possible to find "s" in "l" */
+	last = (char *)cl + l_len - s_len;
+
+	for (cur = (char *)cl; cur <= last; cur++)
+		if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
+			return cur;
+
+	return NULL;
+}

+ 3 - 0
src/config.h.in

@@ -113,6 +113,9 @@
 /* Define to 1 if you have the `memcpy' function. */
 #undef HAVE_MEMCPY
 
+/* Define to 1 if you have the `memmem' function. */
+#undef HAVE_MEMMEM
+
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H