| 1 | /* winduni.c -- unicode support for the windres program. |
| 2 | Copyright 1997, 1998, 2000, 2001, 2003, 2007 |
| 3 | Free Software Foundation, Inc. |
| 4 | Written by Ian Lance Taylor, Cygnus Support. |
| 5 | Rewritten by Kai Tietz, Onevision. |
| 6 | |
| 7 | This file is part of GNU Binutils. |
| 8 | |
| 9 | This program is free software; you can redistribute it and/or modify |
| 10 | it under the terms of the GNU General Public License as published by |
| 11 | the Free Software Foundation; either version 3 of the License, or |
| 12 | (at your option) any later version. |
| 13 | |
| 14 | This program is distributed in the hope that it will be useful, |
| 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | GNU General Public License for more details. |
| 18 | |
| 19 | You should have received a copy of the GNU General Public License |
| 20 | along with this program; if not, write to the Free Software |
| 21 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
| 22 | 02110-1301, USA. */ |
| 23 | |
| 24 | |
| 25 | /* This file contains unicode support routines for the windres |
| 26 | program. Ideally, we would have generic unicode support which |
| 27 | would work on all systems. However, we don't. Instead, on a |
| 28 | Windows host, we are prepared to call some Windows routines. This |
| 29 | means that we will generate different output on Windows and Unix |
| 30 | hosts, but that seems better than not really supporting unicode at |
| 31 | all. */ |
| 32 | |
| 33 | #include "sysdep.h" |
| 34 | #include "bfd.h" |
| 35 | #include "libiberty.h" /* for xstrdup */ |
| 36 | #include "bucomm.h" |
| 37 | /* Must be include before windows.h and winnls.h. */ |
| 38 | #if defined (_WIN32) || defined (__CYGWIN__) |
| 39 | #include <windows.h> |
| 40 | #include <winnls.h> |
| 41 | #endif |
| 42 | #include "winduni.h" |
| 43 | #include "safe-ctype.h" |
| 44 | |
| 45 | #if HAVE_ICONV_H |
| 46 | #include <iconv.h> |
| 47 | #endif |
| 48 | |
| 49 | static rc_uint_type wind_WideCharToMultiByte (rc_uint_type, const unichar *, char *, rc_uint_type); |
| 50 | static rc_uint_type wind_MultiByteToWideChar (rc_uint_type, const char *, unichar *, rc_uint_type); |
| 51 | static int unichar_isascii (const unichar *, rc_uint_type); |
| 52 | |
| 53 | /* Convert an ASCII string to a unicode string. We just copy it, |
| 54 | expanding chars to shorts, rather than doing something intelligent. */ |
| 55 | |
| 56 | #if !defined (_WIN32) && !defined (__CYGWIN__) |
| 57 | |
| 58 | /* Codepages mapped. */ |
| 59 | static local_iconv_map codepages[] = |
| 60 | { |
| 61 | { 0, "MS-ANSI" }, |
| 62 | { 1, "WINDOWS-1252" }, |
| 63 | { 437, "MS-ANSI" }, |
| 64 | { 737, "MS-GREEK" }, |
| 65 | { 775, "WINBALTRIM" }, |
| 66 | { 850, "MS-ANSI" }, |
| 67 | { 852, "MS-EE" }, |
| 68 | { 857, "MS-TURK" }, |
| 69 | { 862, "CP862" }, |
| 70 | { 864, "CP864" }, |
| 71 | { 866, "MS-CYRL" }, |
| 72 | { 874, "WINDOWS-874" }, |
| 73 | { 932, "CP932" }, |
| 74 | { 936, "CP936" }, |
| 75 | { 949, "CP949" }, |
| 76 | { 950, "CP950" }, |
| 77 | { 1250, "WINDOWS-1250" }, |
| 78 | { 1251, "WINDOWS-1251" }, |
| 79 | { 1252, "WINDOWS-1252" }, |
| 80 | { 1253, "WINDOWS-1253" }, |
| 81 | { 1254, "WINDOWS-1254" }, |
| 82 | { 1255, "WINDOWS-1255" }, |
| 83 | { 1256, "WINDOWS-1256" }, |
| 84 | { 1257, "WINDOWS-1257" }, |
| 85 | { 1258, "WINDOWS-1258" }, |
| 86 | { CP_UTF7, "UTF-7" }, |
| 87 | { CP_UTF8, "UTF-8" }, |
| 88 | { CP_UTF16, "UTF-16" }, |
| 89 | { (rc_uint_type) -1, NULL } |
| 90 | }; |
| 91 | |
| 92 | /* Languages supported. */ |
| 93 | static const wind_language_t languages[] = |
| 94 | { |
| 95 | { 0x0000, 437, 1252, "Neutral", "Neutral" }, |
| 96 | { 0x0401, 864, 1256, "Arabic", "Saudi Arabia" }, { 0x0402, 866, 1251, "Bulgarian", "Bulgaria" }, |
| 97 | { 0x0403, 850, 1252, "Catalan", "Spain" }, { 0x0404, 950, 950, "Chinese", "Taiwan" }, |
| 98 | { 0x0405, 852, 1250, "Czech", "Czech Republic" }, { 0x0406, 850, 1252, "Danish", "Denmark" }, |
| 99 | { 0x0407, 850, 1252, "German", "Germany" }, { 0x0408, 737, 1253, "Greek", "Greece" }, |
| 100 | { 0x0409, 437, 1252, "English", "United States" }, { 0x040A, 850, 1252, "Spanish - Traditional Sort", "Spain" }, |
| 101 | { 0x040B, 850, 1252, "Finnish", "Finland" }, { 0x040C, 850, 1252, "French", "France" }, |
| 102 | { 0x040D, 862, 1255, "Hebrew", "Israel" }, { 0x040E, 852, 1250, "Hungarian", "Hungary" }, |
| 103 | { 0x040F, 850, 1252, "Icelandic", "Iceland" }, { 0x0410, 850, 1252, "Italian", "Italy" }, |
| 104 | { 0x0411, 932, 932, "Japanese", "Japan" }, { 0x0412, 949, 949, "Korean", "Korea (south)" }, |