/* 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 */
