diff --git a/meson.build b/meson.build index 60586806..257603d2 100644 --- a/meson.build +++ b/meson.build @@ -257,7 +257,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'] +gnu_funcs = ['sincos', 'strtok_r', 'memrchr'] 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 d96fdcb7..6709d01c 100644 --- a/src/util/stringops.c +++ b/src/util/stringops.c @@ -417,3 +417,17 @@ void expand_escape_sequences(char *str) { p[-1] = 0; } } + +#ifndef TAISEI_BUILDCONF_HAVE_MEMRCHR +void *memrchr(const void *s, int c, size_t n) { + const char *mem = s; + + for(const char *p = mem + n - 1; p >= mem; --p) { + if(*p == c) { + return (void*)p; + } + } + + return NULL; +} +#endif diff --git a/src/util/stringops.h b/src/util/stringops.h index 292ebffa..54bcdeba 100644 --- a/src/util/stringops.h +++ b/src/util/stringops.h @@ -38,6 +38,12 @@ INLINE attr_returns_allocated attr_nonnull(1) char *strdup(const char *str) { char *strtok_r(char *str, const char *delim, char **nextp); #endif +#ifndef TAISEI_BUILDCONF_HAVE_MEMRCHR +#undef memrchr +#define memrchr _ts_memrchr +void *memrchr(const void *s, int c, size_t n); +#endif + #undef strcasecmp #define strcasecmp SDL_strcasecmp