diff options
author | Max Kellermann <max@duempel.org> | 2014-11-28 19:44:32 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-11-28 19:44:32 +0100 |
commit | 849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a (patch) | |
tree | a59188d5b91a1adae8b528bc8e3024551b81dd99 /src/util | |
parent | 16a99ad515915f5bc9a4810c412488e966310774 (diff) | |
download | mpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.tar.gz mpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.tar.xz mpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.zip |
util/Alloc: add fallback for gcc 4.6
Diffstat (limited to '')
-rw-r--r-- | src/util/Alloc.cxx | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/util/Alloc.cxx b/src/util/Alloc.cxx index 48c450849..0533a58f8 100644 --- a/src/util/Alloc.cxx +++ b/src/util/Alloc.cxx @@ -75,6 +75,8 @@ xstrndup(const char *s, size_t n) return p; } +#if CLANG_OR_GCC_VERSION(4,7) + template<typename... Args> static inline size_t FillLengths(size_t *lengths, const char *a, Args&&... args) @@ -104,11 +106,14 @@ StringCat(char *p, const size_t *lengths, const char *a) memcpy(p, a, *lengths); } +#endif + template<typename... Args> gcc_malloc gcc_nonnull_all static inline char * t_xstrcatdup(Args&&... args) { +#if CLANG_OR_GCC_VERSION(4,7) constexpr size_t n = sizeof...(args); size_t lengths[n]; @@ -118,6 +123,22 @@ t_xstrcatdup(Args&&... args) StringCat(p, lengths, args...); p[total] = 0; return p; +#else + /* fallback implementation for gcc 4.6, because that old + compiler is too buggy to compile the above template + functions */ + const char *const argv[] = { args... }; + + size_t total = 0; + for (auto i : argv) + total += strlen(i); + + char *p = (char *)xalloc(total + 1), *q = p; + for (auto i : argv) + q = stpcpy(q, i); + + return p; +#endif } char * |