#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:
}
-/**
+/*
* 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 == (gsize) -1)
{
}
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)