* winduni.c (unicode_from_ascii): Don't declare variables
authorDanny Smith <dannysmith@users.sourceforge.net>
Thu, 24 Mar 2005 21:26:21 +0000 (21:26 +0000)
committerDanny Smith <dannysmith@users.sourceforge.net>
Thu, 24 Mar 2005 21:26:21 +0000 (21:26 +0000)
's' and 'w' if _WIN32.  Use MultiByteToWideChar to set the unicode
string len.

binutils/ChangeLog
binutils/winduni.c

index ac48705..0e55534 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-24  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       * winduni.c (unicode_from_ascii): Don't declare variables
+       's' and 'w' if _WIN32.  Use MultiByteToWideChar to set the unicode
+       string len.
+
 2005-03-24  Dmitry Diky   <diwil@spec.ru>
 
        * MAINTAINERS: Add myself as MSP430 maintainer. 
index 65bc608..41cfcfc 100644 (file)
@@ -43,25 +43,32 @@ void
 unicode_from_ascii (int *length, unichar **unicode, const char *ascii)
 {
   int len;
+#ifndef _WIN32
   const char *s;
   unsigned short *w;
 
   len = strlen (ascii);
-
-  if (length != NULL)
-    *length = len;
-
   *unicode = ((unichar *) res_alloc ((len + 1) * sizeof (unichar)));
-
-#ifdef _WIN32
-  /* FIXME: On Windows, we should be using MultiByteToWideChar to set
-     the length.  */
-  MultiByteToWideChar (CP_ACP, 0, ascii, len + 1, *unicode, len + 1);
-#else
   for (s = ascii, w = *unicode; *s != '\0'; s++, w++)
     *w = *s & 0xff;
   *w = 0;
+#else
+  /* We use  MultiByteToWideChar rather than strlen to get the unicode
+     string length to allow multibyte "ascii" chars. The value returned
+     by this function includes the trailing '\0'.  */
+  len = MultiByteToWideChar (CP_ACP, 0, ascii, -1, NULL, 0);
+  if (len)
+    {
+      *unicode = ((unichar *) res_alloc (len * sizeof (unichar)));
+      MultiByteToWideChar (CP_ACP, 0, ascii, -1, *unicode, len);
+    }
+  /* Discount the trailing '/0'.  If MultiByteToWideChar failed,
+     this will set *length to -1.  */
+  len--;
 #endif
+
+  if (length != NULL)
+    *length = len;
 }
 
 /* Print the unicode string UNICODE to the file E.  LENGTH is the