util/stringops: add memmem() polyfill

This commit is contained in:
Andrei Alexeyev 2022-08-27 02:40:55 +03:00
parent b0beea92dd
commit e1b1fecaf2
No known key found for this signature in database
GPG key ID: 72D26128040B9690
3 changed files with 29 additions and 1 deletions

View file

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

View file

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

View file

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