Create wrapper functions for iconv() so that we can transparently use the
authorOwen Taylor <otaylor@redhat.com>
Sun, 12 Nov 2000 23:44:28 +0000 (23:44 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 12 Nov 2000 23:44:28 +0000 (23:44 +0000)
Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>

* gconvert.[ch]: Create wrapper functions for iconv()
so that we can transparently use the native iconv,
libiconv, or (in the future) a mini-iconv included
with glib.

* glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@

* INSTALL: Added note about libiconv.

* configure.in: Add checks for libiconv from pango. If
EILSEQ is not defined in errno.h add define for it into
glibconfig.h so g_iconv can use it. (Note, recompiling
from a system without EILSEQ to a system with EILSEQ
will break binary compatibility)

19 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
INSTALL
Makefile.am
acconfig.h
configure.in
gconvert.c
gconvert.h
glib-2.0.pc.in
glib-config-2.0.in
glib/Makefile.am
glib/gconvert.c
glib/gconvert.h

index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
index f663bd325e00e166404bf22ec4f92467bb2829ee..446be0f2b5ce13cb33cb73bd5f56c13288c56122 100644 (file)
@@ -1,3 +1,20 @@
+Sun Nov 12 18:34:32 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gconvert.[ch]: Create wrapper functions for iconv()
+       so that we can transparently use the native iconv, 
+       libiconv, or (in the future) a mini-iconv included
+       with glib.
+
+       * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@
+
+       * INSTALL: Added note about libiconv.
+
+       * configure.in: Add checks for libiconv from pango. If
+       EILSEQ is not defined in errno.h add define for it into
+       glibconfig.h so g_iconv can use it. (Note, recompiling
+       from a system without EILSEQ to a system with EILSEQ
+       will break binary compatibility)
+
 2000-11-12  Robert Brady  <robert@suse.co.uk>
 
        * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8
diff --git a/INSTALL b/INSTALL
index 8f032dc4007462042f98c2b393c181a75c56d5e0..4740a6c68330693557d91b37ae55ed78e50ae50d 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -8,6 +8,26 @@ Simple install procedure
   [ Become root if necessary ]
   % make install                            # install GLIB
 
+Requirements
+============
+
+In order to implement conversions between character sets,
+GLib requires an implementation of the standard iconv() routine.
+Most modern systems will have a suitable implementation, however
+many older systems lack an iconv() implementation. On such systems, 
+you must install the libiconv library. This can be found at:
+
+ http://clisp.cons.org/~haible/packages-libiconv.html
+
+If your system has an iconv implementation but you want to use
+libiconv instead, you can pass the --with-libiconv option to
+configure. This forces libiconv to be used. 
+
+Note that if you have libiconv installed in your default include
+search path (for instance, in /usr/local/), but don't enable
+it, you will get an error while compiling GTK+ because the
+iconv.h that libiconv installs hides the system iconv.
+
 The Nitty-Gritty
 ================
 
index 5c33024ffe0d332242bc4b2be4c952000205ffa6..9c436a630583fac811d311351ea5c0e2631dc01d 100644 (file)
@@ -153,6 +153,8 @@ stamp-gc-h: config.status
        CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status
        echo timestamp > stamp-gc-h
 
+libglib_1_3_la_LIBADD = @ICONV_LIBS@
+
 libglib_1_3_la_LDFLAGS = \
        -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
        -export-dynamic
index df4af9c61c0185ef38898d5e6e6c62564c8b7349..c923979ac0ca4a98715aa8e2c60f1356d71c6be0 100644 (file)
@@ -42,3 +42,5 @@
    If you're adding to this file, keep in mind:
    The entries are in sort -df order: alphabetical, case insensitive,
    ignoring punctuation (such as underscores).  */
+
+#undef USE_LIBICONV
index 4cfafaa03147a1197406047ce8d4f7d9b32acfa8..d268ca2999986f8fbaa4845209707f192abb586c 100644 (file)
@@ -1099,6 +1099,50 @@ GLIB_SYSDEFS(
        glibconfig-sysdefs.h,
        =)
 
+dnl ***********************
+dnl *** Tests for iconv ***
+dnl ***********************
+
+AC_ARG_WITH(libiconv, [ --with-libiconv     Use the libiconv library ],,with_libiconv=maybe)
+
+found_iconv=no
+
+if test "x$with_libiconv" != "xyes" ; then
+   # 
+   # Check in the C library 
+   #
+   AC_CHECK_FUNC(iconv_open, with_libiconv=no; found_iconv=yes)
+fi
+
+if test "x$with_libiconv" != "xno" ; then
+   #
+   # Check for libiconv
+   #
+   AC_CHECK_LIB(iconv, libiconv_open, with_libiconv=yes; found_iconv=yes)
+fi
+
+if test "x$found_iconv" = "xno" ; then
+   AC_MSG_ERROR([*** No iconv() implementation found in C library or libiconv])
+fi
+
+if test "x$with_libiconv" = "xyes" ; then
+  ICONV_LIBS="-liconv"
+  AC_DEFINE(USE_LIBICONV)
+fi
+AC_SUBST(ICONV_LIBS)
+
+dnl If the system doesn't define EILSEQ, we should define EILSEQ ourselves
+dnl since we need it for g_iconv()
+
+AC_MSG_CHECKING([for EILSEQ])
+AC_TRY_COMPILE([
+#include <errno.h>
+],
+[
+int error = EILSEQ;
+], have_eilseq=yes, have_eilseq=no);
+AC_MSG_RESULT($have_eilseq)
+
 dnl **************************
 dnl *** Checks for gtk-doc ***
 dnl **************************
@@ -1298,6 +1342,20 @@ $glib_inline
 #endif /* !__cplusplus */
 _______EOF
 
+       echo >>$outfile
+       if test x$g_have_eilseq = xno; then
+               cat >>$outfile <<_______EOF
+#ifndef EILSEQ
+/* On some systems, like SunOS and NetBSD, EILSEQ is not defined.
+ * The correspondence between this and the corresponding definition
+ * in libiconv is essential.
+ */
+#  define EILSEQ ENOENT
+#endif
+_______EOF
+
+       fi
+
        echo >>$outfile
        if test x$g_mutex_has_default = xyes; then
                cat >>$outfile <<_______EOF
@@ -1576,6 +1634,8 @@ x$ac_cv_c_bigendian)
   ;;
 esac
 
+g_have_eilseq=$have_eilseq
+
 case x$have_threads in
 xnone) g_enable_threads_def="#undef";;
 *)     g_enable_threads_def="#define";;
index 97a0fe1b7c1184d7b2c282a3b451fd7785be92c9..da67e6ec25bf3d30ff2349cc046e845474b04fe6 100644 (file)
@@ -30,6 +30,7 @@
 #endif
 
 #include "glib.h"
+#include "config.h"
 
 #define _(s) (s)
 
@@ -39,27 +40,64 @@ g_convert_error_quark()
   static GQuark quark;
   if (!quark)
     quark = g_quark_from_static_string ("g_convert_error");
+
   return quark;
 }
 
-static iconv_t
+#if defined(USE_LIBICONV) && !defined (_LIBICONV_H)
+#error libiconv in use but included iconv.h not from libiconv
+#endif
+#if !defined(USE_LIBICONV) && defined (_LIBICONV_H)
+#error libiconv not in use but included iconv.h is from libiconv
+#endif
+
+GIConv
+g_iconv_open (const gchar  *to_codeset,
+             const gchar  *from_codeset)
+{
+  iconv_t cd = iconv_open (to_codeset, from_codeset);
+  
+  return (GIConv)cd;
+}
+
+size_t 
+g_iconv (GIConv   converter,
+        gchar  **inbuf,
+        size_t  *inbytes_left,
+        gchar  **outbuf,
+        size_t  *outbytes_left)
+{
+  iconv_t cd = (iconv_t)converter;
+
+  return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left);
+}
+
+gint
+g_iconv_close (GIConv converter)
+{
+  iconv_t cd = (iconv_t)converter;
+
+  return iconv_close (cd);
+}
+
+GIConv
 open_converter (const gchar *to_codeset,
-               const gchar *from_codeset,
+                const gchar *from_codeset,
                GError     **error)
 {
-  iconv_t cd = iconv_open (to_codeset, from_codeset);
+  GIConv cd = g_iconv_open (to_codeset, from_codeset);
 
   if (cd == (iconv_t) -1)
     {
       /* Something went wrong.  */
       if (errno == EINVAL)
-       g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
-                    _("Conversion from character set `%s' to `%s' is not supported"),
-                    from_codeset, to_codeset);
+        g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
+                     _("Conversion from character set `%s' to `%s' is not suppo\rted"),
+                     from_codeset, to_codeset);
       else
         g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
-                    _("Could not open converter from `%s' to `%s': %s"),
-                    from_codeset, to_codeset, strerror (errno));
+                     _("Could not open converter from `%s' to `%s': %s"),
+                     from_codeset, to_codeset, strerror (errno));
     }
 
   return cd;
@@ -106,7 +144,7 @@ g_convert (const gchar *str,
   size_t inbytes_remaining;
   size_t outbytes_remaining;
   size_t err;
-  iconv_t cd;
+  GIConv cd;
   size_t outbuf_size;
   gboolean have_error = FALSE;
   
@@ -116,7 +154,7 @@ g_convert (const gchar *str,
      
   cd = open_converter (to_codeset, from_codeset, error);
 
-  if (cd == (iconv_t) -1)
+  if (cd == (GIConv) -1)
     {
       if (bytes_read)
         *bytes_read = 0;
@@ -138,7 +176,7 @@ g_convert (const gchar *str,
 
  again:
   
-  err = iconv (cd, &p, &inbytes_remaining, &outp, &outbytes_remaining);
+  err = g_iconv (cd, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining);
 
   if (err == (size_t) -1)
     {
@@ -174,7 +212,7 @@ g_convert (const gchar *str,
 
   *outp = '\0';
   
-  iconv_close (cd);
+  g_iconv_close (cd);
 
   if (bytes_read)
     *bytes_read = p - str;
@@ -256,7 +294,7 @@ g_convert_with_fallback (const gchar *str,
   size_t save_inbytes = 0;
   size_t outbytes_remaining;
   size_t err;
-  iconv_t cd;
+  GIConv cd;
   size_t outbuf_size;
   gboolean have_error = FALSE;
   gboolean done = FALSE;
@@ -290,7 +328,7 @@ g_convert_with_fallback (const gchar *str,
    * to_codeset, and the string as UTF-8.
    */
   cd = open_converter (to_codeset, "UTF-8", error);
-  if (cd == (iconv_t) -1)
+  if (cd == (GIConv) -1)
     {
       if (bytes_read)
         *bytes_read = 0;
@@ -322,7 +360,7 @@ g_convert_with_fallback (const gchar *str,
   while (!done && !have_error)
     {
       size_t inbytes_tmp = inbytes_remaining;
-      err = iconv (cd, &p, &inbytes_tmp, &outp, &outbytes_remaining);
+      err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining);
       inbytes_remaining = inbytes_tmp;
 
       if (err == (size_t) -1)
@@ -399,7 +437,7 @@ g_convert_with_fallback (const gchar *str,
    */
   *outp = '\0';
   
-  iconv_close (cd);
+  g_iconv_close (cd);
 
   if (bytes_written)
     *bytes_written = outp - str;       /* Doesn't include '\0' */
@@ -678,3 +716,4 @@ g_filename_from_utf8 (const gchar *string, GError **error)
 #endif
 }
 
+
index 1eaed3ece760bfabed742a377e42fb5edb801993..b2e959226cd16672083161f850b28e5ff75873c8 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef __G_CONVERT_H__
 #define __G_CONVERT_H__
 
+#include <stddef.h>      /* For size_t */
 #include <gerror.h>
 
 G_BEGIN_DECLS
@@ -42,6 +43,20 @@ typedef enum
 #define G_CONVERT_ERROR g_convert_error_quark()
 GQuark g_convert_error_quark();
 
+/* Thin wrappers around iconv
+ */
+typedef struct _GIConv *GIConv;
+
+GIConv g_iconv_open   (const gchar  *to_codeset,
+                      const gchar  *from_codeset);
+size_t g_iconv        (GIConv        converter,
+                      gchar       **inbuf,
+                      size_t       *inbytes_left,
+                      gchar       **outbuf,
+                      size_t       *outbytes_left);
+gint   g_iconv_close  (GIConv        converter);
+
+
 gchar* g_convert               (const gchar  *str,
                                gint          len,
                                const gchar  *to_codeset,
index a77335beca16671189b33e544523ce94c0d81b18..4be437e9e717e2f50d1f478823fd9ecacba160b5 100644 (file)
@@ -6,5 +6,5 @@ includedir=@includedir@
 Name: GLib
 Description: C Utility Library
 Version: @VERSION@
-Libs: -L${libdir} -lglib-1.3
+Libs: -L${libdir} -lglib-1.3 @ICONV_LIBS@
 Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include 
index 106c6eacb19b94e1f432132b2aac5b0c24a92140..29e3fad4bd2f846c579609da5d58873470f90e41 100644 (file)
@@ -100,6 +100,7 @@ if test "$echo_libs" = "yes"; then
        libsa=""
        if test "$lib_glib" = "yes"; then
                libsp="$libsp -lglib-1.3"
+               libsa="$libsa @ICONV_LIBS@"
        fi
        if test "$lib_gobject" = "yes"; then
                libsp="-lgobject-1.3 $libsp"
index 5c33024ffe0d332242bc4b2be4c952000205ffa6..9c436a630583fac811d311351ea5c0e2631dc01d 100644 (file)
@@ -153,6 +153,8 @@ stamp-gc-h: config.status
        CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status
        echo timestamp > stamp-gc-h
 
+libglib_1_3_la_LIBADD = @ICONV_LIBS@
+
 libglib_1_3_la_LDFLAGS = \
        -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
        -export-dynamic
index 97a0fe1b7c1184d7b2c282a3b451fd7785be92c9..da67e6ec25bf3d30ff2349cc046e845474b04fe6 100644 (file)
@@ -30,6 +30,7 @@
 #endif
 
 #include "glib.h"
+#include "config.h"
 
 #define _(s) (s)
 
@@ -39,27 +40,64 @@ g_convert_error_quark()
   static GQuark quark;
   if (!quark)
     quark = g_quark_from_static_string ("g_convert_error");
+
   return quark;
 }
 
-static iconv_t
+#if defined(USE_LIBICONV) && !defined (_LIBICONV_H)
+#error libiconv in use but included iconv.h not from libiconv
+#endif
+#if !defined(USE_LIBICONV) && defined (_LIBICONV_H)
+#error libiconv not in use but included iconv.h is from libiconv
+#endif
+
+GIConv
+g_iconv_open (const gchar  *to_codeset,
+             const gchar  *from_codeset)
+{
+  iconv_t cd = iconv_open (to_codeset, from_codeset);
+  
+  return (GIConv)cd;
+}
+
+size_t 
+g_iconv (GIConv   converter,
+        gchar  **inbuf,
+        size_t  *inbytes_left,
+        gchar  **outbuf,
+        size_t  *outbytes_left)
+{
+  iconv_t cd = (iconv_t)converter;
+
+  return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left);
+}
+
+gint
+g_iconv_close (GIConv converter)
+{
+  iconv_t cd = (iconv_t)converter;
+
+  return iconv_close (cd);
+}
+
+GIConv
 open_converter (const gchar *to_codeset,
-               const gchar *from_codeset,
+                const gchar *from_codeset,
                GError     **error)
 {
-  iconv_t cd = iconv_open (to_codeset, from_codeset);
+  GIConv cd = g_iconv_open (to_codeset, from_codeset);
 
   if (cd == (iconv_t) -1)
     {
       /* Something went wrong.  */
       if (errno == EINVAL)
-       g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
-                    _("Conversion from character set `%s' to `%s' is not supported"),
-                    from_codeset, to_codeset);
+        g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
+                     _("Conversion from character set `%s' to `%s' is not suppo\rted"),
+                     from_codeset, to_codeset);
       else
         g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
-                    _("Could not open converter from `%s' to `%s': %s"),
-                    from_codeset, to_codeset, strerror (errno));
+                     _("Could not open converter from `%s' to `%s': %s"),
+                     from_codeset, to_codeset, strerror (errno));
     }
 
   return cd;
@@ -106,7 +144,7 @@ g_convert (const gchar *str,
   size_t inbytes_remaining;
   size_t outbytes_remaining;
   size_t err;
-  iconv_t cd;
+  GIConv cd;
   size_t outbuf_size;
   gboolean have_error = FALSE;
   
@@ -116,7 +154,7 @@ g_convert (const gchar *str,
      
   cd = open_converter (to_codeset, from_codeset, error);
 
-  if (cd == (iconv_t) -1)
+  if (cd == (GIConv) -1)
     {
       if (bytes_read)
         *bytes_read = 0;
@@ -138,7 +176,7 @@ g_convert (const gchar *str,
 
  again:
   
-  err = iconv (cd, &p, &inbytes_remaining, &outp, &outbytes_remaining);
+  err = g_iconv (cd, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining);
 
   if (err == (size_t) -1)
     {
@@ -174,7 +212,7 @@ g_convert (const gchar *str,
 
   *outp = '\0';
   
-  iconv_close (cd);
+  g_iconv_close (cd);
 
   if (bytes_read)
     *bytes_read = p - str;
@@ -256,7 +294,7 @@ g_convert_with_fallback (const gchar *str,
   size_t save_inbytes = 0;
   size_t outbytes_remaining;
   size_t err;
-  iconv_t cd;
+  GIConv cd;
   size_t outbuf_size;
   gboolean have_error = FALSE;
   gboolean done = FALSE;
@@ -290,7 +328,7 @@ g_convert_with_fallback (const gchar *str,
    * to_codeset, and the string as UTF-8.
    */
   cd = open_converter (to_codeset, "UTF-8", error);
-  if (cd == (iconv_t) -1)
+  if (cd == (GIConv) -1)
     {
       if (bytes_read)
         *bytes_read = 0;
@@ -322,7 +360,7 @@ g_convert_with_fallback (const gchar *str,
   while (!done && !have_error)
     {
       size_t inbytes_tmp = inbytes_remaining;
-      err = iconv (cd, &p, &inbytes_tmp, &outp, &outbytes_remaining);
+      err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining);
       inbytes_remaining = inbytes_tmp;
 
       if (err == (size_t) -1)
@@ -399,7 +437,7 @@ g_convert_with_fallback (const gchar *str,
    */
   *outp = '\0';
   
-  iconv_close (cd);
+  g_iconv_close (cd);
 
   if (bytes_written)
     *bytes_written = outp - str;       /* Doesn't include '\0' */
@@ -678,3 +716,4 @@ g_filename_from_utf8 (const gchar *string, GError **error)
 #endif
 }
 
+
index 1eaed3ece760bfabed742a377e42fb5edb801993..b2e959226cd16672083161f850b28e5ff75873c8 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef __G_CONVERT_H__
 #define __G_CONVERT_H__
 
+#include <stddef.h>      /* For size_t */
 #include <gerror.h>
 
 G_BEGIN_DECLS
@@ -42,6 +43,20 @@ typedef enum
 #define G_CONVERT_ERROR g_convert_error_quark()
 GQuark g_convert_error_quark();
 
+/* Thin wrappers around iconv
+ */
+typedef struct _GIConv *GIConv;
+
+GIConv g_iconv_open   (const gchar  *to_codeset,
+                      const gchar  *from_codeset);
+size_t g_iconv        (GIConv        converter,
+                      gchar       **inbuf,
+                      size_t       *inbytes_left,
+                      gchar       **outbuf,
+                      size_t       *outbytes_left);
+gint   g_iconv_close  (GIConv        converter);
+
+
 gchar* g_convert               (const gchar  *str,
                                gint          len,
                                const gchar  *to_codeset,