diff options
author | Nick Clifton <nickc@redhat.com> | 2007-06-18 15:30:33 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2007-06-18 15:30:33 +0000 |
commit | d856f2ddfa3d037987610ecc0edbf75f31296971 (patch) | |
tree | c7758a45b5d8f12f2bd4ea57e4a1588263c89789 /binutils/rclex.c | |
parent | 5d41b3efe4d718fac501a7ee7afd96dbd62ded6e (diff) | |
download | gdb-d856f2ddfa3d037987610ecc0edbf75f31296971.zip gdb-d856f2ddfa3d037987610ecc0edbf75f31296971.tar.gz gdb-d856f2ddfa3d037987610ecc0edbf75f31296971.tar.bz2 |
* 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.
Diffstat (limited to 'binutils/rclex.c')
-rw-r--r-- | binutils/rclex.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/binutils/rclex.c b/binutils/rclex.c index edcf2ce..ef0961b 100644 --- a/binutils/rclex.c +++ b/binutils/rclex.c @@ -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; |