X-Git-Url: https://oss.titaniummirror.com/gitweb?p=msp430-binutils.git;a=blobdiff_plain;f=binutils%2Fwinduni.c;fp=binutils%2Fwinduni.c;h=572145effefb3ee03845b26d9e7cba8402b7c973;hp=bf5dbd43a127e952a54b0e2cfd681738eab70268;hb=88750007d7869f178f0ba528f41efd3b74c424cf;hpb=6df9443a374e2b81278c61b8afc0a1eef7db280b diff --git a/binutils/winduni.c b/binutils/winduni.c index bf5dbd4..572145e 100644 --- a/binutils/winduni.c +++ b/binutils/winduni.c @@ -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 #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;