aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2011-01-29 18:24:44 +0100
committerBruno Haible <bruno@clisp.org>2011-01-29 18:24:44 +0100
commitc38bdb4f3b9fea339bafd44a3723522c90b42fcb (patch)
tree3c3b9b3443b61c527c66ceb5fd2c7e6ea0772142
parentfd7d5707b506de291acbbefd170281b8226eb379 (diff)
downloadandroid-libiconv-c38bdb4f3b9fea339bafd44a3723522c90b42fcb.tar.gz
android-libiconv-c38bdb4f3b9fea339bafd44a3723522c90b42fcb.tar.bz2
android-libiconv-c38bdb4f3b9fea339bafd44a3723522c90b42fcb.zip
Adjust the meaning of "wchar_t" on native Windows systems.
-rw-r--r--ChangeLog9
-rw-r--r--lib/iconv.c20
-rw-r--r--lib/iconv_open1.h38
3 files changed, 59 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ba4431..df81fd3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-01-29 Bruno Haible <bruno@clisp.org>
+
+ Adjust the meaning of "wchar_t" on native Windows systems.
+ * lib/iconv.c (iconv_canonicalize): On native Windows, map
+ ei_local_wchar_t to ei_utf16le or ei_utf16be, not ei_ucs2internal.
+ * lib/iconv_open1.h: Likewise.
+ Reported by Corinna Vinschen <corinna-cygwin@cygwin.com>
+ in <http://cygwin.com/ml/cygwin/2011-01/msg00410.html>.
+
2010-11-23 Bruno Haible <bruno@clisp.org>
Implement newer release of BIG5-HKSCS.
diff --git a/lib/iconv.c b/lib/iconv.c
index 5ea9499..977e771 100644
--- a/lib/iconv.c
+++ b/lib/iconv.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1999-2008 Free Software Foundation, Inc.
+ * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc.
* This file is part of the GNU LIBICONV Library.
*
* The GNU LIBICONV Library is free software; you can redistribute it
@@ -549,8 +549,22 @@ const char * iconv_canonicalize (const char * name)
}
if (ap->encoding_index == ei_local_wchar_t) {
/* On systems which define __STDC_ISO_10646__, wchar_t is Unicode.
- This is also the case on native Woe32 systems. */
-#if __STDC_ISO_10646__ || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ This is also the case on native Woe32 systems, where we know that it
+ is UTF-16. */
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+ if (sizeof(wchar_t) == 4) {
+ index = ei_ucs4internal;
+ break;
+ }
+ if (sizeof(wchar_t) == 2) {
+# if WORDS_LITTLEENDIAN
+ index = ei_utf16le;
+# else
+ index = ei_utf16be;
+# endif
+ break;
+ }
+#elif __STDC_ISO_10646__
if (sizeof(wchar_t) == 4) {
index = ei_ucs4internal;
break;
diff --git a/lib/iconv_open1.h b/lib/iconv_open1.h
index 8a77014..ce1a576 100644
--- a/lib/iconv_open1.h
+++ b/lib/iconv_open1.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1999-2008 Free Software Foundation, Inc.
+ * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc.
* This file is part of the GNU LIBICONV Library.
*
* The GNU LIBICONV Library is free software; you can redistribute it
@@ -97,8 +97,22 @@
}
if (ap->encoding_index == ei_local_wchar_t) {
/* On systems which define __STDC_ISO_10646__, wchar_t is Unicode.
- This is also the case on native Woe32 systems. */
-#if __STDC_ISO_10646__ || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ This is also the case on native Woe32 systems, where we know that it
+ is UTF-16. */
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+ if (sizeof(wchar_t) == 4) {
+ to_index = ei_ucs4internal;
+ break;
+ }
+ if (sizeof(wchar_t) == 2) {
+# if WORDS_LITTLEENDIAN
+ to_index = ei_utf16le;
+# else
+ to_index = ei_utf16be;
+# endif
+ break;
+ }
+#elif __STDC_ISO_10646__
if (sizeof(wchar_t) == 4) {
to_index = ei_ucs4internal;
break;
@@ -173,8 +187,22 @@
}
if (ap->encoding_index == ei_local_wchar_t) {
/* On systems which define __STDC_ISO_10646__, wchar_t is Unicode.
- This is also the case on native Woe32 systems. */
-#if __STDC_ISO_10646__ || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ This is also the case on native Woe32 systems, where we know that it
+ is UTF-16. */
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+ if (sizeof(wchar_t) == 4) {
+ from_index = ei_ucs4internal;
+ break;
+ }
+ if (sizeof(wchar_t) == 2) {
+# if WORDS_LITTLEENDIAN
+ from_index = ei_utf16le;
+# else
+ from_index = ei_utf16be;
+# endif
+ break;
+ }
+#elif __STDC_ISO_10646__
if (sizeof(wchar_t) == 4) {
from_index = ei_ucs4internal;
break;