From 057f3f5571e5687c3a903394f9b0baa5f52ddb51 Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev Date: Tue, 22 Feb 2022 20:55:50 +0200 Subject: [PATCH] util/stringops: prefer strtok_r from libc --- meson.build | 13 ++++++++++--- src/util/stringops.c | 4 +++- src/util/stringops.h | 4 +++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index 975cf2e7..60586806 100644 --- a/meson.build +++ b/meson.build @@ -256,9 +256,16 @@ config.set('TAISEI_BUILDCONF_HAVE_LONG_DOUBLE', cc.sizeof('long double') > 8) config.set('TAISEI_BUILDCONF_HAVE_POSIX', have_posix) config.set('TAISEI_BUILDCONF_HAVE_SINCOS', cc.has_function('sincos', dependencies : dep_m)) -if config.get('TAISEI_BUILDCONF_HAVE_SINCOS') - config.set('_GNU_SOURCE', true) -endif +use_gnu_funcs = false +gnu_funcs = ['sincos', 'strtok_r'] + +foreach f : gnu_funcs + have = cc.has_function(f, dependencies : dep_m) + config.set('TAISEI_BUILDCONF_HAVE_@0@'.format(f.to_upper()), have) + use_gnu_funcs = have or use_gnu_funcs +endforeach + +config.set('_GNU_SOURCE', use_gnu_funcs) if host_machine.system() == 'emscripten' # Emscripten bug: https://github.com/emscripten-core/emscripten/issues/10072 diff --git a/src/util/stringops.c b/src/util/stringops.c index 9ec3d4d3..d96fdcb7 100644 --- a/src/util/stringops.c +++ b/src/util/stringops.c @@ -208,6 +208,7 @@ char* ucs4_to_utf8_alloc(const uint32_t *ucs4) { return utf8; } +#ifndef TAISEI_BUILDCONF_HAVE_STRTOK_R /* * public domain strtok_r() by Charlie Gordon * @@ -218,7 +219,7 @@ char* ucs4_to_utf8_alloc(const uint32_t *ucs4) { * (Declaration that it's public domain): * http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c */ -char* strtok_r(char *str, const char *delim, char **nextp) { +char *strtok_r(char *str, const char *delim, char **nextp) { char *ret; if(str == NULL) { @@ -241,6 +242,7 @@ char* strtok_r(char *str, const char *delim, char **nextp) { *nextp = str; return ret; } +#endif size_t filename_timestamp(char *buf, size_t buf_size, SystemTime systime) { assert(buf_size >= FILENAME_TIMESTAMP_MIN_BUF_SIZE); diff --git a/src/util/stringops.h b/src/util/stringops.h index 5218201f..292ebffa 100644 --- a/src/util/stringops.h +++ b/src/util/stringops.h @@ -32,8 +32,11 @@ INLINE attr_returns_allocated attr_nonnull(1) char *strdup(const char *str) { return memcpy(malloc(sz), str, sz); } +#ifndef TAISEI_BUILDCONF_HAVE_STRTOK_R #undef strtok_r #define strtok_r _ts_strtok_r +char *strtok_r(char *str, const char *delim, char **nextp); +#endif #undef strcasecmp #define strcasecmp SDL_strcasecmp @@ -46,7 +49,6 @@ void stralloc(char **dest, const char *src); char* strjoin(const char *first, ...) attr_sentinel attr_returns_allocated; char* vstrfmt(const char *fmt, va_list args) attr_returns_allocated; char* strfmt(const char *fmt, ...) attr_printf(1, 2) attr_returns_allocated; -char* strtok_r(char *str, const char *delim, char **nextp); char* strappend(char **dst, char *src); char* strftimealloc(const char *fmt, const struct tm *timeinfo) attr_returns_allocated; void expand_escape_sequences(char *str);