Fix phony_iconv wide character support.
2016-01-15 Sandra Loosemore <sandra@codesourcery.com> gdb/ * charset.c [PHONY_ICONV] (GDB_DEFAULT_HOST_CHARSET): Conditionalize for Windows host. (GDB_DEFAULT_TARGET_CHARSET): Match GDB_DEFAULT_HOST_CHARSET. (GDB_DEFAULT_TARGET_WIDE_CHARSET): Use UTF-32. (phony_iconv_open): Handle both UTF-32 endiannesses. (phony_iconv): Likewise. Check for output overflow and clean up out-of-input cases. Correct adjustment to input buffer pointer. (set_be_le_names) [PHONY_ICONV]: Use hard-wired names to match phony_iconv_open.
This commit is contained in:
parent
71ef29a86b
commit
f74f61cbf7
2 changed files with 57 additions and 27 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2016-01-15 Sandra Loosemore <sandra@codesourcery.com>
|
||||||
|
|
||||||
|
* charset.c [PHONY_ICONV] (GDB_DEFAULT_HOST_CHARSET):
|
||||||
|
Conditionalize for Windows host.
|
||||||
|
(GDB_DEFAULT_TARGET_CHARSET): Match GDB_DEFAULT_HOST_CHARSET.
|
||||||
|
(GDB_DEFAULT_TARGET_WIDE_CHARSET): Use UTF-32.
|
||||||
|
(phony_iconv_open): Handle both UTF-32 endiannesses.
|
||||||
|
(phony_iconv): Likewise. Check for output overflow and clean up
|
||||||
|
out-of-input cases. Correct adjustment to input buffer pointer.
|
||||||
|
(set_be_le_names) [PHONY_ICONV]: Use hard-wired names to match
|
||||||
|
phony_iconv_open.
|
||||||
|
|
||||||
2016-01-15 Pedro Alves <palves@redhat.com>
|
2016-01-15 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* NEWS: Mention star wildcard ranges.
|
* NEWS: Mention star wildcard ranges.
|
||||||
|
|
|
@ -77,9 +77,13 @@
|
||||||
arrange for there to be a single available character set. */
|
arrange for there to be a single available character set. */
|
||||||
|
|
||||||
#undef GDB_DEFAULT_HOST_CHARSET
|
#undef GDB_DEFAULT_HOST_CHARSET
|
||||||
#define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1"
|
#ifdef USE_WIN32API
|
||||||
#define GDB_DEFAULT_TARGET_CHARSET "ISO-8859-1"
|
# define GDB_DEFAULT_HOST_CHARSET "CP1252"
|
||||||
#define GDB_DEFAULT_TARGET_WIDE_CHARSET "ISO-8859-1"
|
#else
|
||||||
|
# define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1"
|
||||||
|
#endif
|
||||||
|
#define GDB_DEFAULT_TARGET_CHARSET GDB_DEFAULT_HOST_CHARSET
|
||||||
|
#define GDB_DEFAULT_TARGET_WIDE_CHARSET "UTF-32"
|
||||||
#undef DEFAULT_CHARSET_NAMES
|
#undef DEFAULT_CHARSET_NAMES
|
||||||
#define DEFAULT_CHARSET_NAMES GDB_DEFAULT_HOST_CHARSET ,
|
#define DEFAULT_CHARSET_NAMES GDB_DEFAULT_HOST_CHARSET ,
|
||||||
|
|
||||||
|
@ -95,20 +99,27 @@
|
||||||
#undef ICONV_CONST
|
#undef ICONV_CONST
|
||||||
#define ICONV_CONST const
|
#define ICONV_CONST const
|
||||||
|
|
||||||
|
/* We allow conversions from UTF-32, wchar_t, and the host charset.
|
||||||
|
We allow conversions to wchar_t and the host charset.
|
||||||
|
Return 1 if we are converting from UTF-32BE, 2 if from UTF32-LE,
|
||||||
|
0 otherwise. This is used as a flag in calls to iconv. */
|
||||||
|
|
||||||
static iconv_t
|
static iconv_t
|
||||||
phony_iconv_open (const char *to, const char *from)
|
phony_iconv_open (const char *to, const char *from)
|
||||||
{
|
{
|
||||||
/* We allow conversions from UTF-32BE, wchar_t, and the host charset.
|
|
||||||
We allow conversions to wchar_t and the host charset. */
|
|
||||||
if (strcmp (from, "UTF-32BE") && strcmp (from, "wchar_t")
|
|
||||||
&& strcmp (from, GDB_DEFAULT_HOST_CHARSET))
|
|
||||||
return -1;
|
|
||||||
if (strcmp (to, "wchar_t") && strcmp (to, GDB_DEFAULT_HOST_CHARSET))
|
if (strcmp (to, "wchar_t") && strcmp (to, GDB_DEFAULT_HOST_CHARSET))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Return 1 if we are converting from UTF-32BE, 0 otherwise. This is
|
if (!strcmp (from, "UTF-32BE") || !strcmp (from, "UTF-32"))
|
||||||
used as a flag in calls to iconv. */
|
return 1;
|
||||||
return !strcmp (from, "UTF-32BE");
|
|
||||||
|
if (!strcmp (from, "UTF-32LE"))
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
if (strcmp (from, "wchar_t") && strcmp (from, GDB_DEFAULT_HOST_CHARSET))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -123,31 +134,33 @@ phony_iconv (iconv_t utf_flag, const char **inbuf, size_t *inbytesleft,
|
||||||
{
|
{
|
||||||
if (utf_flag)
|
if (utf_flag)
|
||||||
{
|
{
|
||||||
|
enum bfd_endian endian
|
||||||
|
= utf_flag == 1 ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
|
||||||
while (*inbytesleft >= 4)
|
while (*inbytesleft >= 4)
|
||||||
{
|
{
|
||||||
size_t j;
|
unsigned long c
|
||||||
unsigned long c = 0;
|
= extract_unsigned_integer ((const gdb_byte *)*inbuf, 4, endian);
|
||||||
|
|
||||||
for (j = 0; j < 4; ++j)
|
|
||||||
{
|
|
||||||
c <<= 8;
|
|
||||||
c += (*inbuf)[j] & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c >= 256)
|
if (c >= 256)
|
||||||
{
|
{
|
||||||
errno = EILSEQ;
|
errno = EILSEQ;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (*outbytesleft < 1)
|
||||||
|
{
|
||||||
|
errno = E2BIG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
**outbuf = c & 0xff;
|
**outbuf = c & 0xff;
|
||||||
++*outbuf;
|
++*outbuf;
|
||||||
--*outbytesleft;
|
--*outbytesleft;
|
||||||
|
|
||||||
++*inbuf;
|
*inbuf += 4;
|
||||||
*inbytesleft -= 4;
|
*inbytesleft -= 4;
|
||||||
}
|
}
|
||||||
if (*inbytesleft < 4)
|
if (*inbytesleft)
|
||||||
{
|
{
|
||||||
|
/* Partial sequence on input. */
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -165,12 +178,11 @@ phony_iconv (iconv_t utf_flag, const char **inbuf, size_t *inbytesleft,
|
||||||
*outbuf += amt;
|
*outbuf += amt;
|
||||||
*inbytesleft -= amt;
|
*inbytesleft -= amt;
|
||||||
*outbytesleft -= amt;
|
*outbytesleft -= amt;
|
||||||
}
|
if (*inbytesleft)
|
||||||
|
{
|
||||||
if (*inbytesleft)
|
errno = E2BIG;
|
||||||
{
|
return -1;
|
||||||
errno = E2BIG;
|
}
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The number of non-reversible conversions -- but they were all
|
/* The number of non-reversible conversions -- but they were all
|
||||||
|
@ -290,6 +302,11 @@ set_be_le_names (struct gdbarch *gdbarch)
|
||||||
return;
|
return;
|
||||||
be_le_arch = gdbarch;
|
be_le_arch = gdbarch;
|
||||||
|
|
||||||
|
#ifdef PHONY_ICONV
|
||||||
|
/* Match the wide charset names recognized by phony_iconv_open. */
|
||||||
|
target_wide_charset_le_name = "UTF-32LE";
|
||||||
|
target_wide_charset_be_name = "UTF-32BE";
|
||||||
|
#else
|
||||||
target_wide_charset_le_name = NULL;
|
target_wide_charset_le_name = NULL;
|
||||||
target_wide_charset_be_name = NULL;
|
target_wide_charset_be_name = NULL;
|
||||||
|
|
||||||
|
@ -313,6 +330,7 @@ set_be_le_names (struct gdbarch *gdbarch)
|
||||||
target_wide_charset_le_name = charset_enum[i];
|
target_wide_charset_le_name = charset_enum[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# endif /* PHONY_ICONV */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 'Set charset', 'set host-charset', 'set target-charset', 'set
|
/* 'Set charset', 'set host-charset', 'set target-charset', 'set
|
||||||
|
|
Loading…
Reference in a new issue