aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-04-12 04:06:45 +0000
committerEric Wong <normalperson@yhbt.net>2008-04-12 04:06:45 +0000
commitc011ab810549394e407de215554236dfae9f8a26 (patch)
tree2316332eaa1596fdedd7fb0ca60e2604988fa21f
parent51f5bf932c2cf4d6aafb62fa2859881efd6a86fc (diff)
downloadmpd-c011ab810549394e407de215554236dfae9f8a26.tar.gz
mpd-c011ab810549394e407de215554236dfae9f8a26.tar.xz
mpd-c011ab810549394e407de215554236dfae9f8a26.zip
deconstify input buffer for iconv()
Unfortunately, the function iconv() wants a non-const input buffer. In this context, we only have a const pointer, which emits a correct gcc warning. Work around this ugliness with an union-deconst hack. This is optimized away in the binary. git-svn-id: https://svn.musicpd.org/mpd/trunk@7229 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r--src/charConv.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/charConv.c b/src/charConv.c
index c9a47fe1d..26e4bddeb 100644
--- a/src/charConv.c
+++ b/src/charConv.c
@@ -93,6 +93,22 @@ int setCharSetConversion(const char *to, const char *from)
#endif
}
+#ifdef HAVE_ICONV
+static inline size_t deconst_iconv(iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ union {
+ const char **a;
+ char **b;
+ } deconst;
+
+ deconst.a = inbuf;
+
+ return iconv(cd, deconst.b, inbytesleft, outbuf, outbytesleft);
+}
+#endif
+
char *char_conv_str(char *dest, const char *string)
{
if (!char_conv_to)
@@ -117,8 +133,8 @@ char *char_conv_str(char *dest, const char *string)
bufferPtr = buffer;
outleft = BUFFER_SIZE;
err =
- iconv(char_conv_iconv, &string, &inleft, &bufferPtr,
- &outleft);
+ deconst_iconv(char_conv_iconv, &string, &inleft,
+ &bufferPtr, &outleft);
if (outleft == BUFFER_SIZE
|| (err == (size_t)-1L && errno != E2BIG)) {
return NULL;