diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2017-06-09 08:52:45 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2017-06-09 08:53:58 +0100 |
commit | 143ccd27b4857a34ae0294eac6d05f45d27e50ef (patch) | |
tree | ba245c9633f9d23160e5e4e47ba02b6cf53d2daf | |
parent | a4d2fa1b6dbc1bd2e3b081ff506800638ca9001b (diff) | |
download | rtmux-143ccd27b4857a34ae0294eac6d05f45d27e50ef.tar.gz rtmux-143ccd27b4857a34ae0294eac6d05f45d27e50ef.tar.bz2 rtmux-143ccd27b4857a34ae0294eac6d05f45d27e50ef.zip |
Add memmem to compat.
-rw-r--r-- | compat.h | 5 | ||||
-rw-r--r-- | compat/memmem.c | 65 | ||||
-rw-r--r-- | configure.ac | 1 |
3 files changed, 71 insertions, 0 deletions
@@ -261,6 +261,11 @@ size_t strnlen(const char *, size_t); char *strndup(const char *, size_t); #endif +#ifndef HAVE_MEMMEM +/* memmem.c */ +void *memmem(const void *, size_t, const void *, size_t); +#endif + #ifndef HAVE_DAEMON /* daemon.c */ int daemon(int, int); diff --git a/compat/memmem.c b/compat/memmem.c new file mode 100644 index 00000000..99e3f55d --- /dev/null +++ b/compat/memmem.c @@ -0,0 +1,65 @@ +/* $OpenBSD: memmem.c,v 1.4 2015/08/31 02:53:57 guenther Exp $ */ +/*- + * 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 <string.h> + +#include "compat.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) +{ + const char *cur, *last; + const char *cl = l; + const char *cs = s; + + /* a zero length needle should just return the haystack */ + if (s_len == 0) + return (void *)cl; + + /* "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, *cs, l_len); + + /* the last position where its possible to find "s" in "l" */ + last = cl + l_len - s_len; + + for (cur = cl; cur <= last; cur++) + if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0) + return (void *)cur; + + return NULL; +} diff --git a/configure.ac b/configure.ac index ffc022a5..77f20d85 100644 --- a/configure.ac +++ b/configure.ac @@ -107,6 +107,7 @@ AC_REPLACE_FUNCS([ \ freezero \ getdtablecount \ getprogname \ + memmem \ recallocarray \ reallocarray \ setenv \ |