diff options
author | Pierre Muller <muller@sourceware.org> | 2011-04-21 14:26:38 +0000 |
---|---|---|
committer | Pierre Muller <muller@sourceware.org> | 2011-04-21 14:26:38 +0000 |
commit | bcb28afc532c6defc36fd52db211f3a785a8a6ef (patch) | |
tree | 21e6e1cf639d937d7b8810b1724d67ed4d33fa80 /gdb/charset.c | |
parent | 9165b2bff2916b808c29501af6a7f0b48ab794b8 (diff) | |
download | gdb-bcb28afc532c6defc36fd52db211f3a785a8a6ef.zip gdb-bcb28afc532c6defc36fd52db211f3a785a8a6ef.tar.gz gdb-bcb28afc532c6defc36fd52db211f3a785a8a6ef.tar.bz2 |
* gdb_wchar.h (USE_INTERMEDIATE_ENCODING_FUNCTION): New macro.
(INTERMEDIATE_ENCODING): Change value to intermediate_encoding
function call if __STDC_ISO_10646__ macro is defined.
(intermediate_encoding): New prototype.
* charset.c (your_gdb_wchar_t_is_bogus): New extern test variable
to generate compile time error for unsupported gdb_wchar_t size.
(ENDIAN_SUFFIX): New macro.
(intermediate_encoding): New function.
Diffstat (limited to 'gdb/charset.c')
-rw-r--r-- | gdb/charset.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/gdb/charset.c b/gdb/charset.c index 41cbc43..a84085a 100644 --- a/gdb/charset.c +++ b/gdb/charset.c @@ -922,6 +922,72 @@ default_auto_wide_charset (void) return GDB_DEFAULT_TARGET_WIDE_CHARSET; } + +#ifdef USE_INTERMEDIATE_ENCODING_FUNCTION +/* Macro used for UTF or UCS endianness suffix. */ +#if WORDS_BIGENDIAN +#define ENDIAN_SUFFIX "BE" +#else +#define ENDIAN_SUFFIX "LE" +#endif + +/* The code below serves to generate a compile time error if + gdb_wchar_t type is not of size 2 nor 4, despite the fact that + macro __STDC_ISO_10646__ is defined. + This is better than a gdb_assert call, because GDB cannot handle + strings correctly if this size is different. */ + +extern char your_gdb_wchar_t_is_bogus[(sizeof (gdb_wchar_t) == 2 + || sizeof (gdb_wchar_t) == 4) + ? 1 : -1]; + +/* intermediate_encoding returns the charset unsed internally by + GDB to convert between target and host encodings. As the test above + compiled, sizeof (gdb_wchar_t) is either 2 or 4 bytes. + UTF-16/32 is tested first, UCS-2/4 is tested as a second option, + otherwise an error is generated. */ + +const char * +intermediate_encoding (void) +{ + iconv_t desc; + static const char *stored_result = NULL; + char *result; + int i; + + if (stored_result) + return stored_result; + result = xstrprintf ("UTF-%d%s", (int) (sizeof (gdb_wchar_t) * 8), + ENDIAN_SUFFIX); + /* Check that the name is supported by iconv_open. */ + desc = iconv_open (result, host_charset ()); + if (desc != (iconv_t) -1) + { + iconv_close (desc); + stored_result = result; + return result; + } + /* Not valid, free the allocated memory. */ + xfree (result); + /* Second try, with UCS-2 type. */ + result = xstrprintf ("UCS-%d%s", (int) sizeof (gdb_wchar_t), + ENDIAN_SUFFIX); + /* Check that the name is supported by iconv_open. */ + desc = iconv_open (result, host_charset ()); + if (desc != (iconv_t) -1) + { + iconv_close (desc); + stored_result = result; + return result; + } + /* Not valid, free the allocated memory. */ + xfree (result); + /* No valid charset found, generate error here. */ + error (_("Unable to find a vaild charset for string conversions")); +} + +#endif /* USE_INTERMEDIATE_ENCODING_FUNCTION */ + void _initialize_charset (void) { |