aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-11-28 19:44:32 +0100
committerMax Kellermann <max@duempel.org>2014-11-28 19:44:32 +0100
commit849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a (patch)
treea59188d5b91a1adae8b528bc8e3024551b81dd99
parent16a99ad515915f5bc9a4810c412488e966310774 (diff)
downloadmpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.tar.gz
mpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.tar.xz
mpd-849b0563ce7bc07d4fc21bd4b1d20e0f5ba52c1a.zip
util/Alloc: add fallback for gcc 4.6
-rw-r--r--src/util/Alloc.cxx21
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 *