diff options
author | Max Kellermann <max@duempel.org> | 2008-04-12 04:06:45 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2008-04-12 04:06:45 +0000 |
commit | c011ab810549394e407de215554236dfae9f8a26 (patch) | |
tree | 2316332eaa1596fdedd7fb0ca60e2604988fa21f | |
parent | 51f5bf932c2cf4d6aafb62fa2859881efd6a86fc (diff) | |
download | mpd-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.c | 20 |
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; |