From 1416b1dd8e09b6da8528b349802cda6dbb64bc70 Mon Sep 17 00:00:00 2001
From: Alberto Massari <amassari@apache.org>
Date: Wed, 5 Aug 2009 17:49:53 +0000
Subject: [PATCH] On Linux, iconv requires char*; on Solaris, const char*. Use
 autoconf to pick the correct code

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@801335 13f79535-47bb-0310-9956-ffa450edef68
---
 configure.ac                                  | 19 +++++++++++++++++++
 .../IconvGNU/IconvGNUTransService.cpp         | 16 ++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/configure.ac b/configure.ac
index bca57e693..c4289c9dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -180,6 +180,25 @@ AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>]],
                     ]
                  )
 
+AC_MSG_CHECKING([if iconv uses const pointers])
+AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <iconv.h>]],
+                                     [[
+                                       const char *fromPtr=0;
+                                       size_t     fromLen=0;
+                                       const char *toPtr=0;
+                                       size_t     toLen=0;
+                                       iconv_t    cv=0;
+                                       iconv(cv, &tmpPtr, &fromLen, &toPtr, &toLen);
+                                      ]])],
+                    [
+                      AC_MSG_RESULT([yes])
+                      AC_DEFINE_UNQUOTED([ICONV_USES_CONST_POINTER], 1, [Define to 1 if you have to use const char* with iconv, to 0 if you must use char*.])
+                    ],
+                    [
+                      AC_MSG_RESULT([no])
+                      AC_DEFINE_UNQUOTED([ICONV_USES_CONST_POINTER], 0, [Define to 1 if you have to use const char* with iconv, to 0 if you must use char*.])
+                    ]
+                 )
 
 AC_SUBST([SHREXT], [$shrext_cmds])
 
diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
index 9ab5f0e48..544953d4e 100644
--- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
@@ -242,7 +242,11 @@ XMLCh IconvGNUWrapper::toUpper (const XMLCh ch)
     xmlChToMbc (ch, wcbuf);
 
     char    tmpArr[4];
+#if ICONV_USES_CONST_POINTER
     const char* ptr = wcbuf;
+#else
+    char* ptr = wcbuf;
+#endif
     size_t    len = fUChSize;
     char    *pTmpArr = tmpArr;
     size_t    bLen = 2;
@@ -271,7 +275,11 @@ XMLCh IconvGNUWrapper::toLower (const XMLCh ch)
     xmlChToMbc (ch, wcbuf);
 
     char    tmpArr[4];
+#if ICONV_USES_CONST_POINTER
     const char* ptr = wcbuf;
+#else
+    char* ptr = wcbuf;
+#endif
     size_t    len = fUChSize;
     char    *pTmpArr = tmpArr;
     size_t    bLen = 2;
@@ -372,7 +380,11 @@ size_t    IconvGNUWrapper::iconvFrom ( const char    *fromPtr,
                  char        **toPtr,
                  size_t        toLen )
 {
+#if ICONV_USES_CONST_POINTER
     const char ** tmpPtr = &fromPtr;
+#else
+    char ** tmpPtr = (char**)&fromPtr;
+#endif
     return ::iconv (fCDFrom, tmpPtr, fromLen, toPtr, &toLen);
 }
 
@@ -381,7 +393,11 @@ size_t    IconvGNUWrapper::iconvTo ( const char    *fromPtr,
                    char        **toPtr,
                    size_t        toLen )
 {
+#if ICONV_USES_CONST_POINTER
     const char ** tmpPtr = &fromPtr;
+#else
+    char ** tmpPtr = (char**)&fromPtr;
+#endif
     return ::iconv (fCDTo, tmpPtr, fromLen, toPtr, &toLen);
 }
 
-- 
GitLab