]> 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.
 /* 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.
    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"
 
 #include "winduni.h"
 #include "safe-ctype.h"
 
-#if HAVE_ICONV_H
+#if HAVE_ICONV
 #include <iconv.h>
 #endif
 
 #include <iconv.h>
 #endif
 
@@ -616,16 +616,16 @@ codepage_from_unicode (rc_uint_type *length, const unichar *unicode, char **asci
     *length = len;
 }
 
     *length = len;
 }
 
-#ifdef HAVE_ICONV_H
+#if defined (HAVE_ICONV) && !defined (_WIN32) && !defined (__CYGWIN__)
 static int
 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;
 {
   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;
       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;
 }
     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,
 
 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__)
   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);
 
                                            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;
   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;
   while (1)
     {
       int iret;
-      const char *n_mb;
-      char *n_tmp;
+      const char *n_mb = "";
+      char *n_tmp = "";
 
       p_tmp = 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;
       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);
 
   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;
   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;
   while (1)
     {
       int iret;
-      const char *n_u;
-      char *n_tmp;
+      const char *n_u = "";
+      char *n_tmp = "";
 
       p_tmp = 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;
       if (first)
        {
          first = 0;