| /* Wide characters for gdb |
| Copyright (C) 2009-2012 Free Software Foundation, Inc. |
| |
| This file is part of GDB. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef GDB_WCHAR_H |
| #define GDB_WCHAR_H |
| |
| /* We handle three different modes here. |
| |
| Capable systems have the full suite: wchar_t support and iconv |
| (perhaps via GNU libiconv). On these machines, full functionality |
| is available. Note that full functionality is dependent on us |
| being able to convert from an arbitrary encoding to wchar_t. In |
| practice this means we look for __STDC_ISO_10646__ (where we know |
| the name of the wchar_t encoding) or GNU libiconv, where we can use |
| "wchar_t". |
| |
| DJGPP is known to have libiconv but not wchar_t support. On |
| systems like this, we use the narrow character functions. The full |
| functionality is available to the user, but many characters (those |
| outside the narrow range) will be displayed as escapes. |
| |
| Finally, some systems do not have iconv, or are really broken |
| (e.g., Solaris, which almost has all of this working, but where |
| just enough is broken to make it too hard to use). Here we provide |
| a phony iconv which only handles a single character set, and we |
| provide wrappers for the wchar_t functionality we use. */ |
| |
| |
| #if defined (HAVE_ICONV) |
| #include <iconv.h> |
| #else |
| /* This define is used elsewhere so we don't need to duplicate the |
| same checking logic in multiple places. */ |
| #define PHONY_ICONV |
| #endif |
| |
| /* We use "btowc" as a sentinel to detect functioning wchar_t support. |
| We check for either __STDC_ISO_10646__ or a new-enough libiconv in |
| order to ensure we can convert to and from wchar_t. We choose |
| libiconv version 0x108 because it is the first version with |
| iconvlist. */ |
| #if defined (HAVE_ICONV) && defined (HAVE_WCHAR_H) && defined (HAVE_BTOWC) \ |
| && (defined (__STDC_ISO_10646__) \ |
| || (defined (_LIBICONV_VERSION) && _LIBICONV_VERSION >= 0x108)) |
| |
| #include <wchar.h> |
| #include <wctype.h> |
| |
| typedef wchar_t gdb_wchar_t; |
| typedef wint_t gdb_wint_t; |
| |
| #define gdb_wcslen wcslen |
| #define gdb_iswprint iswprint |
| #define gdb_iswdigit iswdigit |
| #define gdb_btowc btowc |
| #define gdb_WEOF WEOF |
| |
| #define LCST(X) L ## X |
| |
| /* If __STDC_ISO_10646__ is defined, then the host wchar_t is UCS-4. |
| We exploit this fact in the hope that there are hosts that define |
| this but which do not support "wchar_t" as an encoding argument to |
| iconv_open. We put the endianness into the encoding name to avoid |
| hosts that emit a BOM when the unadorned name is used. */ |
| #if defined (__STDC_ISO_10646__) |
| #define USE_INTERMEDIATE_ENCODING_FUNCTION |
| #define INTERMEDIATE_ENCODING intermediate_encoding () |
| const char *intermediate_encoding (void); |
| |
| #elif defined (_LIBICONV_VERSION) && _LIBICONV_VERSION >= 0x108 |
| #define INTERMEDIATE_ENCODING "wchar_t" |
| #else |
| /* This shouldn't happen, because the earlier #if should have filtered |
| out this case. */ |
| #error "Neither __STDC_ISO_10646__ nor _LIBICONV_VERSION defined" |
| #endif |
| |
| #else |
| |
| /* If we got here and have wchar_t support, we might be on a system |
| with some problem. So, we just disable everything. */ |
| #if defined (HAVE_WCHAR_H) && defined (HAVE_BTOWC) |
| #define PHONY_ICONV |
| #endif |
| |
| typedef char gdb_wchar_t; |
| typedef int gdb_wint_t; |
| |
| #define gdb_wcslen strlen |
| #define gdb_iswprint isprint |
| #define gdb_iswdigit isdigit |
| #define gdb_btowc /* empty */ |
| #define gdb_WEOF EOF |
| |
| #define LCST(X) X |
| |
| /* If we are using the narrow character set, we want to use the host |
| narrow encoding as our intermediate encoding. However, if we are |
| also providing a phony iconv, we might as well just stick with |
| "wchar_t". */ |
| #ifdef PHONY_ICONV |
| #define INTERMEDIATE_ENCODING "wchar_t" |
| #else |
| #define INTERMEDIATE_ENCODING host_charset () |
| #endif |
| |
| #endif |
| |
| #endif /* GDB_WCHAR_H */ |