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

Reply via email to