* rclex.c: (cpp_line): Add code_page pragma support.

* windres.c: (usage, long_options, main): Add new option --codepage or -c.
* winduni.c: (wind_default_codepage, wind_current_codepage): New.
  (unicode_from_ascii, ascii_from_unicode): Use wind_current_codepage as codepage parameter.
  (unicode_print): Print 4 characters for hexadecimal values in unicode strings.
* winduni.h:  (wind_default_codepage, wind_current_codepage): Export.
* doc/binutils.texi: Document new option.
* NEWS: Mention new feature.
This commit is contained in:
Nick Clifton
2007-06-18 15:30:33 +00:00
parent 5d41b3efe4
commit d856f2ddfa
6 changed files with 109 additions and 6 deletions
+15
View File
@@ -1,3 +1,18 @@
2007-06-18 Kai Tietz <Kai.Tietz@onevision.com>
* rclex.c: (cpp_line): Add code_page pragma support.
* windres.c: (usage, long_options, main): Add new option
--codepage or -c.
* winduni.c: (wind_default_codepage, wind_current_codepage): New.
(unicode_from_ascii, ascii_from_unicode): Use
wind_current_codepage as codepage parameter.
(unicode_print): Print 4 characters for hexadecimal values in
unicode strings.
* winduni.h: (wind_default_codepage, wind_current_codepage):
Export.
* doc/binutils.texi: Document new option.
* NEWS: Mention new feature.
2007-06-18 Brian D. Watt <bwatt@us.ibm.com>
* embedspu.sh: Parse _SPUEAR_ symbol values as hex.
+2
View File
@@ -1,5 +1,7 @@
-*- text -*-
* Add codepage support to the windres tool.
* Add --extract-symbol command line option to objcopy, which will
strip everything out of an ordinary object file or executable except
for its symbol table. Files containing just symbols can be useful
+53
View File
@@ -142,11 +142,64 @@ cpp_line (void)
const char *s = rclex_tok;
int line;
char *send, *fn;
size_t len, mlen;
++s;
while (ISSPACE (*s))
++s;
/* Check for #pragma code_page ( DEFAULT | <nr>). */
len = strlen (s);
mlen = strlen ("pragma");
if (len > mlen && memcmp (s, "pragma", mlen) == 0 && ISSPACE (s[mlen]))
{
const char *end;
s += mlen + 1;
while (ISSPACE (*s))
++s;
len = strlen (s);
mlen = strlen ("code_page");
if (len <= mlen || memcmp (s, "code_page", mlen) != 0)
/* FIXME: We ought to issue a warning message about an unrecognised pragma. */
return;
s += mlen;
while (ISSPACE (*s))
++s;
if (*s != '(')
/* FIXME: We ought to issue an error message about a malformed pragma. */
return;
++s;
while (ISSPACE (*s))
++s;
if (*s == 0 || (end = strchr (s, ')')) == NULL)
/* FIXME: We ought to issue an error message about a malformed pragma. */
return;
len = (size_t) (end - s);
fn = xmalloc (len + 1);
if (len)
memcpy (fn, s, len);
fn[len] = 0;
while (len > 0 && (fn[len - 1] > 0 && fn[len - 1] <= 0x20))
fn[--len] = 0;
if (! len || (len == strlen ("DEFAULT") && strcasecmp (fn, "DEFAULT") == 0))
wind_current_codepage = wind_default_codepage;
else if (len > 0)
{
rc_uint_type ncp;
if (fn[0] == '0' && (fn[1] == 'x' || fn[1] == 'X'))
ncp = (rc_uint_type) strtol (fn + 2, NULL, 16);
else
ncp = (rc_uint_type) strtol (fn, NULL, 10);
if (ncp == CP_UTF16 || ! unicode_is_valid_codepage (ncp))
fatal (_("invalid value specified for pragma code_page.\n"));
wind_current_codepage = ncp;
}
free (fn);
return;
}
line = strtol (s, &send, 0);
if (*send != '\0' && ! ISSPACE (*send))
return;
+17 -1
View File
@@ -673,6 +673,7 @@ usage (FILE *stream, int status)
-D --define <sym>[=<val>] Define SYM when preprocessing rc file\n\
-U --undefine <sym> Undefine SYM when preprocessing rc file\n\
-v --verbose Verbose - tells you what it's doing\n\
-c --codepage=<codepage> Specify default codepage\n\
-l --language=<val> Set language when reading rc file\n\
--use-temp-file Use a temporary file instead of popen to read\n\
the preprocessor output\n\
@@ -749,6 +750,7 @@ static const struct option long_options[] =
{"define", required_argument, 0, 'D'},
{"undefine", required_argument, 0, 'U'},
{"verbose", no_argument, 0, 'v'},
{"codepage", required_argument, 0, 'c'},
{"language", required_argument, 0, 'l'},
{"use-temp-file", no_argument, 0, OPTION_USE_TEMP_FILE},
{"no-use-temp-file", no_argument, 0, OPTION_NO_USE_TEMP_FILE},
@@ -809,11 +811,25 @@ main (int argc, char **argv)
language = 0x409; /* LANG_ENGLISH, SUBLANG_ENGLISH_US. */
use_temp_file = 0;
while ((c = getopt_long (argc, argv, "f:i:l:o:I:J:O:F:D:U:rhHvV", long_options,
while ((c = getopt_long (argc, argv, "c:f:i:l:o:I:J:O:F:D:U:rhHvV", long_options,
(int *) 0)) != EOF)
{
switch (c)
{
case 'c':
{
rc_uint_type ncp;
if (optarg[0] == '0' && (optarg[1] == 'x' || optarg[1] == 'X'))
ncp = (rc_uint_type) strtol (optarg + 2, NULL, 16);
else
ncp = (rc_uint_type) strtol (optarg, NULL, 10);
if (ncp == CP_UTF16 || ! unicode_is_valid_codepage (ncp))
fatal (_("invalid codepage specified.\n"));
wind_default_codepage = wind_current_codepage = ncp;
}
break;
case 'i':
input_filename = optarg;
break;
+14 -5
View File
@@ -47,10 +47,11 @@
static rc_uint_type wind_WideCharToMultiByte (rc_uint_type, const unichar *, char *, rc_uint_type);
static rc_uint_type wind_MultiByteToWideChar (rc_uint_type, const char *, unichar *, rc_uint_type);
/* Prototypes. */
static int unichar_isascii (const unichar *, rc_uint_type);
/* Convert an ASCII string to a unicode string. We just copy it,
expanding chars to shorts, rather than doing something intelligent. */
#if !defined (_WIN32) && !defined (__CYGWIN__)
/* Codepages mapped. */
@@ -175,13 +176,21 @@ static const wind_language_t languages[] =
#endif
/* Specifies the default codepage to be used for unicode
transformations. By default this is CP_ACP. */
rc_uint_type wind_default_codepage = CP_ACP;
/* Specifies the currently used codepage for unicode
transformations. By default this is CP_ACP. */
rc_uint_type wind_current_codepage = CP_ACP;
/* Convert an ASCII string to a unicode string. We just copy it,
expanding chars to shorts, rather than doing something intelligent. */
void
unicode_from_ascii (rc_uint_type *length, unichar **unicode, const char *ascii)
{
unicode_from_codepage (length, unicode, ascii, 0 /*CP_ACP*/);
unicode_from_codepage (length, unicode, ascii, wind_current_codepage);
}
/* Convert an unicode string to an ASCII string. We just copy it,
@@ -191,7 +200,7 @@ unicode_from_ascii (rc_uint_type *length, unichar **unicode, const char *ascii)
void
ascii_from_unicode (rc_uint_type *length, const unichar *unicode, char **ascii)
{
codepage_from_unicode (length, unicode, ascii, 0/*CP_ACP*/);
codepage_from_unicode (length, unicode, ascii, wind_current_codepage);
}
/* Print the unicode string UNICODE to the file E. LENGTH is the
@@ -267,7 +276,7 @@ unicode_print (FILE *e, const unichar *unicode, rc_uint_type length)
else if ((ch & 0xff) == ch)
fprintf (e, "\\%03o", (unsigned int) ch);
else
fprintf (e, "\\x%x", (unsigned int) ch);
fprintf (e, "\\x%04x", (unsigned int) ch);
}
}
+8
View File
@@ -96,6 +96,14 @@ extern void unicode_print_quoted (FILE *, const unichar *, rc_uint_type);
#define CP_OEM 1 /* Default OEM code page. */
#endif
/* Specifies the default codepage to be used for unicode
transformations. By default this is CP_ACP. */
extern rc_uint_type wind_default_codepage;
/* Specifies the currently used codepage for unicode
transformations. By default this is CP_ACP. */
extern rc_uint_type wind_current_codepage;
typedef struct wind_language_t
{
unsigned id;