From e1b1fecaf26990c1a77d2a5d1e047fe469cd2212 Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev Date: Sat, 27 Aug 2022 02:40:55 +0300 Subject: [PATCH] util/stringops: add memmem() polyfill --- meson.build | 2 +- src/util/stringops.c | 21 +++++++++++++++++++++ src/util/stringops.h | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 71faf224..363098df 100644 --- a/meson.build +++ b/meson.build @@ -272,7 +272,7 @@ config.set('TAISEI_BUILDCONF_HAVE_POSIX', have_posix) config.set('TAISEI_BUILDCONF_HAVE_SINCOS', cc.has_function('sincos', dependencies : dep_m)) use_gnu_funcs = false -gnu_funcs = ['sincos', 'strtok_r', 'memrchr'] +gnu_funcs = ['sincos', 'strtok_r', 'memrchr', 'memmem'] foreach f : gnu_funcs have = cc.has_function(f, dependencies : dep_m) diff --git a/src/util/stringops.c b/src/util/stringops.c index 6709d01c..03e28cb0 100644 --- a/src/util/stringops.c +++ b/src/util/stringops.c @@ -431,3 +431,24 @@ void *memrchr(const void *s, int c, size_t n) { return NULL; } #endif + +#ifndef TAISEI_BUILDCONF_HAVE_MEMMEM +#undef memmem +#define memmem _ts_memmem +void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { + const char *p_haystack = haystack; + const char *e_haystack = p_haystack + haystacklen; + + for(;;) { + if(needlelen > e_haystack - p_haystack) { + return NULL; + } + + if(!memcmp(p_haystack, needle, needlelen)) { + return (void*)p_haystack; + } + + ++p_haystack; + } +} +#endif diff --git a/src/util/stringops.h b/src/util/stringops.h index 54bcdeba..a253a9ee 100644 --- a/src/util/stringops.h +++ b/src/util/stringops.h @@ -44,6 +44,13 @@ char *strtok_r(char *str, const char *delim, char **nextp); void *memrchr(const void *s, int c, size_t n); #endif +#ifndef TAISEI_BUILDCONF_HAVE_MEMMEM +#undef memmem +#define memmem _ts_memmem +void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) + attr_nonnull_all; +#endif + #undef strcasecmp #define strcasecmp SDL_strcasecmp