#include "config.h"
+#include "glib.h"
+
+#ifndef G_OS_WIN32
#include <iconv.h>
+#endif
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include "glib.h"
#include "gprintfint.h"
#include "gthreadprivate.h"
#include "gunicode.h"
#include "galias.h"
+#ifdef G_OS_WIN32
+#include "win_iconv.c"
+#endif
+
GQuark
g_convert_error_quark (void)
{
return FALSE;
}
-extern const char ** G_GNUC_INTERNAL _g_charset_get_aliases (const char *canonical_name);
+G_GNUC_INTERNAL extern const char **
+_g_charset_get_aliases (const char *canonical_name);
/**
* g_iconv_open:
*
* Return value: count of non-reversible conversions, or -1 on error
**/
-size_t
+gsize
g_iconv (GIConv converter,
gchar **inbuf,
gsize *inbytes_left,
}
-/**
+/*
* iconv_cache_bucket_new:
* @key: cache key
* @cd: iconv descriptor
}
-/**
+/*
* iconv_cache_bucket_expire:
* @node: cache bucket's node
* @bucket: cache bucket
}
-/**
+/*
* iconv_cache_expire_unused:
*
* Expires as many unused cache buckets as it needs to in order to get
gchar *dest;
gchar *outp;
const gchar *p;
- const gchar *shift_p = NULL;
gsize inbytes_remaining;
gsize outbytes_remaining;
gsize err;
gsize outbuf_size;
gboolean have_error = FALSE;
gboolean done = FALSE;
+ gboolean reset = FALSE;
g_return_val_if_fail (converter != (GIConv) -1, NULL);
while (!done && !have_error)
{
- err = g_iconv (converter, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining);
+ if (reset)
+ err = g_iconv (converter, NULL, &inbytes_remaining, &outp, &outbytes_remaining);
+ else
+ err = g_iconv (converter, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining);
- if (err == (size_t) -1)
+ if (err == (gsize) -1)
{
switch (errno)
{
break;
case E2BIG:
{
- size_t used = outp - dest;
+ gsize used = outp - dest;
outbuf_size *= 2;
dest = g_realloc (dest, outbuf_size);
}
else
{
- if (!shift_p)
+ if (!reset)
{
/* call g_iconv with NULL inbuf to cleanup shift state */
- shift_p = p;
- p = NULL;
+ reset = TRUE;
inbytes_remaining = 0;
}
else
}
}
- if (shift_p)
- p = shift_p;
-
*outp = '\0';
if (bytes_read)
while (!done && !have_error)
{
- size_t inbytes_tmp = inbytes_remaining;
+ gsize inbytes_tmp = inbytes_remaining;
err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining);
inbytes_remaining = inbytes_tmp;
- if (err == (size_t) -1)
+ if (err == (gsize) -1)
{
switch (errno)
{
break;
case E2BIG:
{
- size_t used = outp - dest;
+ gsize used = outp - dest;
outbuf_size *= 2;
dest = g_realloc (dest, outbuf_size);
*
* Converts a string which is in the encoding used for strings by
* the C runtime (usually the same as that used by the operating
- * system) in the current locale into a UTF-8 string.
+ * system) in the <link linkend="setlocale">current locale</link> into a
+ * UTF-8 string.
*
* Return value: The converted string, or %NULL on an error.
**/
*
* Converts a string from UTF-8 to the encoding used for strings by
* the C runtime (usually the same as that used by the operating
- * system) in the current locale.
+ * system) in the <link linkend="setlocale">current locale</link>.
*
* Return value: The converted string, or %NULL on an error.
**/
* used in the GLib API is always UTF-8 and said environment variables
* have no effect.
*
- * <envar>G_FILENAME_ENCODING</envar> may be set to a comma-separated list of
- * character set names. The special token "@locale" is taken to mean the
- * character set for the current locale. If <envar>G_FILENAME_ENCODING</envar>
- * is not set, but <envar>G_BROKEN_FILENAMES</envar> is, the character set of
- * the current locale is taken as the filename encoding. If neither environment
- * variable is set, UTF-8 is taken as the filename encoding, but the character
+ * <envar>G_FILENAME_ENCODING</envar> may be set to a comma-separated list
+ * of character set names. The special token "@locale" is taken to
+ * mean the character set for the <link linkend="setlocale">current
+ * locale</link>. If <envar>G_FILENAME_ENCODING</envar> is not set, but
+ * <envar>G_BROKEN_FILENAMES</envar> is, the character set of the current
+ * locale is taken as the filename encoding. If neither environment variable
+ * is set, UTF-8 is taken as the filename encoding, but the character
* set of the current locale is also put in the list of encodings.
*
* The returned @charsets belong to GLib and must not be freed.
*
* Note that on Unix, regardless of the locale character set or
- * <envar>G_FILENAME_ENCODING</envar> value, the actual file names present on a
- * system might be in any random encoding or just gibberish.
+ * <envar>G_FILENAME_ENCODING</envar> value, the actual file names present
+ * on a system might be in any random encoding or just gibberish.
*
* Return value: %TRUE if the filename encoding is UTF-8.
*
*
* Converts a string which is in the encoding used by GLib for
* filenames into a UTF-8 string. Note that on Windows GLib uses UTF-8
- * for filenames.
+ * for filenames; on other platforms, this function indirectly depends on
+ * the <link linkend="setlocale">current locale</link>.
*
* Return value: The converted string, or %NULL on an error.
**/
* errors. Any of the errors in #GConvertError may occur.
*
* Converts a string from UTF-8 to the encoding GLib uses for
- * filenames. Note that on Windows GLib uses UTF-8 for filenames.
+ * filenames. Note that on Windows GLib uses UTF-8 for filenames;
+ * on other platforms, this function indirectly depends on the
+ * <link linkend="setlocale">current locale</link>.
*
* Return value: The converted string, or %NULL on an error.
**/