Date: Tuesday, April 3, 2007 @ 18:50:30
  Author: marc
    Path: /cvsroot/carob/libmysequoia/src

Modified: Converter.cpp (1.7 -> 1.8)

Re-use iconv_const_adapter() template trick already used in Carob to
solve the [const] char * prototype issue without any ugly
#ifdefs. LMS-43.


---------------+
 Converter.cpp |   39 ++++++++++++++++++++++++++++-----------
 1 files changed, 28 insertions(+), 11 deletions(-)


Index: libmysequoia/src/Converter.cpp
diff -u libmysequoia/src/Converter.cpp:1.7 libmysequoia/src/Converter.cpp:1.8
--- libmysequoia/src/Converter.cpp:1.7  Thu Mar  8 18:59:36 2007
+++ libmysequoia/src/Converter.cpp      Tue Apr  3 18:50:30 2007
@@ -16,9 +16,14 @@
  * limitations under the License.
  *
  * Initial developer(s): Zsolt Simon, Csaba Simon
- * Contributor(s): 
+ * Contributor(s): Marc Herbert
  */
 
+// This class is now duplicated by CarobNS::IconvCodec (which came
+// from here). It should be dropped. .setcode() can probably be
+// replaced by delete/create (side-effects are evil).
+
+
 #include <Converter.hpp>
 
 #include <errno.h>
@@ -29,6 +34,24 @@
 
 using namespace std;
 
+
+// See explanation in Carob::StringCodecs.cpp
+namespace {
+
+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);
+}
+
+}
+
+
 Converter::Converter() : cd_from(iconv_t(-1)), cd_to(iconv_t(-1))
 {
 }
@@ -89,11 +112,8 @@
 
   std::wstring result;
 
-#ifdef __FreeBSD__
   const char *inbuf = (char *)s.data();
-#else
-  char *inbuf = (char *)s.data();
-#endif
+
   size_t inbytesleft = s.length();
   
   wchar_t convertbuf[CONVERTER_BUFFER_SIZE];
@@ -105,7 +125,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)
@@ -135,11 +155,8 @@
   
   std::string result;
 
-#ifdef __FreeBSD__
   const char *inbuf = (char *)w.data();
-#else
-  char *inbuf = (char *)w.data();
-#endif
+
   size_t inbytesleft = w.length() * sizeof(wchar_t);
   
   char convertbuf[CONVERTER_BUFFER_SIZE];
@@ -151,7 +168,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