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