]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - binutils/winduni.c
Imported binutils-2.20
[msp430-binutils.git] / binutils / winduni.c
index bf5dbd43a127e952a54b0e2cfd681738eab70268..572145effefb3ee03845b26d9e7cba8402b7c973 100644 (file)
@@ -1,5 +1,5 @@
 /* winduni.c -- unicode support for the windres program.
-   Copyright 1997, 1998, 2000, 2001, 2003, 2007
+   Copyright 1997, 1998, 2000, 2001, 2003, 2005, 2007, 2009
    Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Rewritten by Kai Tietz, Onevision.
@@ -42,7 +42,7 @@
 #include "winduni.h"
 #include "safe-ctype.h"
 
-#if HAVE_ICONV_H
+#if HAVE_ICONV
 #include <iconv.h>
 #endif
 
@@ -616,16 +616,16 @@ codepage_from_unicode (rc_uint_type *length, const unichar *unicode, char **asci
     *length = len;
 }
 
-#ifdef HAVE_ICONV_H
+#if defined (HAVE_ICONV) && !defined (_WIN32) && !defined (__CYGWIN__)
 static int
-iconv_onechar (iconv_t cd, const char *s, char *d, int d_len, const char **n_s, char **n_d)
+iconv_onechar (iconv_t cd, ICONV_CONST char *s, char *d, int d_len, const char **n_s, char **n_d)
 {
   int i;
 
   for (i = 1; i <= 32; i++)
     {
       char *tmp_d = d;
-      const char *tmp_s = s;
+      ICONV_CONST char *tmp_s = s;
       size_t ret;
       size_t s_left = (size_t) i;
       size_t d_left = (size_t) d_len;
@@ -652,7 +652,7 @@ wind_iconv_cp (rc_uint_type cp)
     return NULL;
   return lim->iconv_name;
 }
-#endif /* HAVE_ICONV_H */
+#endif /* HAVE_ICONV */
 
 static rc_uint_type
 wind_MultiByteToWideChar (rc_uint_type cp, const char *mb,
@@ -661,12 +661,20 @@ wind_MultiByteToWideChar (rc_uint_type cp, const char *mb,
   rc_uint_type ret = 0;
 
 #if defined (_WIN32) || defined (__CYGWIN__)
-  ret = (rc_uint_type) MultiByteToWideChar (cp, MB_PRECOMPOSED,
+  rc_uint_type conv_flags = MB_PRECOMPOSED;
+
+  /* MB_PRECOMPOSED is not allowed for UTF-7 or UTF-8.  
+     MultiByteToWideChar will set the last error to
+     ERROR_INVALID_FLAGS if we do. */
+  if (cp == CP_UTF8 || cp == CP_UTF7)
+    conv_flags = 0;
+
+  ret = (rc_uint_type) MultiByteToWideChar (cp, conv_flags,
                                            mb, -1, u, u_len);
   /* Convert to bytes. */
   ret *= sizeof (unichar);
 
-#elif defined (HAVE_ICONV_H)
+#elif defined (HAVE_ICONV)
   int first = 1;
   char tmp[32];
   char *p_tmp;
@@ -679,11 +687,11 @@ wind_MultiByteToWideChar (rc_uint_type cp, const char *mb,
   while (1)
     {
       int iret;
-      const char *n_mb;
-      char *n_tmp;
+      const char *n_mb = "";
+      char *n_tmp = "";
 
       p_tmp = tmp;
-      iret = iconv_onechar (cd, (const char *) mb, p_tmp, 32, & n_mb, & n_tmp);
+      iret = iconv_onechar (cd, (ICONV_CONST char *) mb, p_tmp, 32, & n_mb, & n_tmp);
       if (first)
        {
          first = 0;
@@ -739,7 +747,7 @@ wind_WideCharToMultiByte (rc_uint_type cp, const unichar *u, char *mb, rc_uint_t
 
   ret = (rc_uint_type) WideCharToMultiByte (cp, 0, u, -1, mb, mb_len,
                                            NULL, & used_def);
-#elif defined (HAVE_ICONV_H)
+#elif defined (HAVE_ICONV)
   int first = 1;
   char tmp[32];
   char *p_tmp;
@@ -752,11 +760,11 @@ wind_WideCharToMultiByte (rc_uint_type cp, const unichar *u, char *mb, rc_uint_t
   while (1)
     {
       int iret;
-      const char *n_u;
-      char *n_tmp;
+      const char *n_u = "";
+      char *n_tmp = "";
 
       p_tmp = tmp;
-      iret = iconv_onechar (cd, (const char *) u, p_tmp, 32, &n_u, & n_tmp);
+      iret = iconv_onechar (cd, (ICONV_CONST char *) u, p_tmp, 32, &n_u, & n_tmp);
       if (first)
        {
          first = 0;