Date: Wednesday, December 20, 2006 @ 18:23:23
Author: marc
Path: /cvsroot/carob/carob/src
Modified: StringCodecs.cpp (1.11 -> 1.12)
Added iconv_const_adapter() to fix the const/non-const char ** iconv
portability issue
------------------+
StringCodecs.cpp | 36 +++++++++++++++++++++++++++++++-----
1 files changed, 31 insertions(+), 5 deletions(-)
Index: carob/src/StringCodecs.cpp
diff -u carob/src/StringCodecs.cpp:1.11 carob/src/StringCodecs.cpp:1.12
--- carob/src/StringCodecs.cpp:1.11 Tue Nov 21 18:38:44 2006
+++ carob/src/StringCodecs.cpp Wed Dec 20 18:23:23 2006
@@ -30,6 +30,30 @@
namespace {
+#ifdef CAROB_USE_ICONV
+/**
+ * MAYBECONST is either "const char**" or "char**" (iconv prototype
+ * has unfortunately changed overtime)
+ *
+ * This brilliant solution is borrowed from gcj/convert/natIconv.cc
+ *
+ * This seems to be the only fully portable solution avoiding any
+ * "configure"-like step (AM_ICONV, etc.)
+ *
+ * http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17
+ */
+template<typename MAYBECONST>
+static inline size_t
+iconv_const_adapter (size_t (*iconv_function) (iconv_t, MAYBECONST, size_t *,
char **, size_t *),
+ iconv_t handle, const char **inbuf, size_t *inavail,
+ char **outbuf, size_t *outavail)
+{
+ // in the CONST instantiation this is casting nothing away
+ return (*iconv_function) (handle, const_cast<MAYBECONST>(inbuf),
+ inavail, outbuf, outavail);
+}
+#endif
+
// Warning: this function needs the codec of fromString() to have been
// properly initialized.
std::wstring
@@ -40,7 +64,9 @@
return msg;
}
-}
+
+} // anonymous namespace
+
/**
* Catching std::runtime_error from std::codecvt_byname() segfaults
@@ -190,7 +216,7 @@
std::wstring result;
- char *inbuf = (char *)s.data();
+ const char *inbuf = s.data();
size_t inbytesleft = s.length();
wchar_t convertbuf[CONVERTER_BUFFER_SIZE];
@@ -202,7 +228,7 @@
outbuf = (char *)convertbuf;
outbytesleft = sizeof(convertbuf) - sizeof(convertbuf[0]);
- size_t ret = iconv(cd_to, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ size_t ret = iconv_const_adapter(iconv, cd_to, &inbuf, &inbytesleft,
&outbuf, &outbytesleft);
if (ret == size_t(-1))
{
switch(errno)
@@ -232,7 +258,7 @@
std::string result;
- char *inbuf = (char *)w.data();
+ const char *inbuf = reinterpret_cast<const char *>(w.data());
size_t inbytesleft = w.length() * sizeof(wchar_t);
char convertbuf[CONVERTER_BUFFER_SIZE];
@@ -244,7 +270,7 @@
outbuf = convertbuf;
outbytesleft = sizeof(convertbuf) - sizeof(convertbuf[0]);
- size_t ret = iconv(cd_from, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ size_t ret = iconv_const_adapter(iconv, cd_from, &inbuf, &inbytesleft,
&outbuf, &outbytesleft);
if (ret == size_t(-1))
{
switch(errno)
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits