X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcharset.c;h=ee1ae20d562042827db4b8e38e1c3e8f84cdd6a7;hb=b08b78e7d4bb56f395d3212eed6184ede236c760;hp=16dab6b9fc0a8e74b5cf7a22f97b14f4e3c20f83;hpb=1d6b2d2b4a864c478fb6a46e15a29859641fe788;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/charset.c b/gdb/charset.c index 16dab6b9fc..ee1ae20d56 100644 --- a/gdb/charset.c +++ b/gdb/charset.c @@ -1,6 +1,6 @@ /* Character set conversion support for GDB. - Copyright (C) 2001, 2003, 2007-2012 Free Software Foundation, Inc. + Copyright (C) 2001-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -20,7 +20,6 @@ #include "defs.h" #include "charset.h" #include "gdbcmd.h" -#include "gdb_assert.h" #include "gdb_obstack.h" #include "gdb_wait.h" #include "charset-list.h" @@ -28,9 +27,6 @@ #include "environ.h" #include "arch-utils.h" #include "gdb_vecs.h" - -#include -#include "gdb_string.h" #include #ifdef USE_WIN32API @@ -99,16 +95,7 @@ #undef ICONV_CONST #define ICONV_CONST const -/* Some systems don't have EILSEQ, so we define it here, but not as - EINVAL, because callers of `iconv' want to distinguish EINVAL and - EILSEQ. This is what iconv.h from libiconv does as well. Note - that wchar.h may also define EILSEQ, so this needs to be after we - include wchar.h, which happens in defs.h through gdb_wchar.h. */ -#ifndef EILSEQ -#define EILSEQ ENOENT -#endif - -iconv_t +static iconv_t phony_iconv_open (const char *to, const char *from) { /* We allow conversions from UTF-32BE, wchar_t, and the host charset. @@ -124,13 +111,13 @@ phony_iconv_open (const char *to, const char *from) return !strcmp (from, "UTF-32BE"); } -int +static int phony_iconv_close (iconv_t arg) { return 0; } -size_t +static size_t phony_iconv (iconv_t utf_flag, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { @@ -191,8 +178,28 @@ phony_iconv (iconv_t utf_flag, const char **inbuf, size_t *inbytesleft, return 0; } -#endif +#else /* PHONY_ICONV */ +/* On systems that don't have EILSEQ, GNU iconv's iconv.h defines it + to ENOENT, while gnulib defines it to a different value. Always + map ENOENT to gnulib's EILSEQ, leaving callers agnostic. */ + +static size_t +gdb_iconv (iconv_t utf_flag, ICONV_CONST char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft) +{ + size_t ret; + + ret = iconv (utf_flag, inbuf, inbytesleft, outbuf, outbytesleft); + if (errno == ENOENT) + errno = EILSEQ; + return ret; +} + +#undef iconv +#define iconv gdb_iconv + +#endif /* PHONY_ICONV */ /* The global lists of character sets and translations. */ @@ -461,7 +468,7 @@ host_hex_value (char c) static void cleanup_iconv (void *p) { - iconv_t *descp = p; + iconv_t *descp = (iconv_t *) p; iconv_close (*descp); } @@ -474,7 +481,7 @@ convert_between_encodings (const char *from, const char *to, iconv_t desc; struct cleanup *cleanups; size_t inleft; - char *inp; + ICONV_CONST char *inp; unsigned int space_request; /* Often, the host and target charsets will be the same. */ @@ -490,7 +497,7 @@ convert_between_encodings (const char *from, const char *to, cleanups = make_cleanup (cleanup_iconv, &desc); inleft = num_bytes; - inp = (char *) bytes; + inp = (ICONV_CONST char *) bytes; space_request = num_bytes; @@ -503,14 +510,14 @@ convert_between_encodings (const char *from, const char *to, old_size = obstack_object_size (output); obstack_blank (output, space_request); - outp = obstack_base (output) + old_size; + outp = (char *) obstack_base (output) + old_size; outleft = space_request; - r = iconv (desc, (ICONV_CONST char **) &inp, &inleft, &outp, &outleft); + r = iconv (desc, &inp, &inleft, &outp, &outleft); /* Now make sure that the object on the obstack only includes bytes we have converted. */ - obstack_blank (output, - (int) outleft); + obstack_blank_fast (output, -outleft); if (r == (size_t) -1) { @@ -531,7 +538,7 @@ convert_between_encodings (const char *from, const char *to, { char octal[5]; - sprintf (octal, "\\%.3o", *inp & 0xff); + xsnprintf (octal, sizeof (octal), "\\%.3o", *inp & 0xff); obstack_grow_str (output, octal); ++inp; @@ -571,7 +578,7 @@ struct wchar_iterator iconv_t desc; /* The input string. This is updated as convert characters. */ - char *input; + const gdb_byte *input; /* The number of bytes remaining in the input. */ size_t bytes; @@ -597,7 +604,7 @@ make_wchar_iterator (const gdb_byte *input, size_t bytes, result = XNEW (struct wchar_iterator); result->desc = desc; - result->input = (char *) input; + result->input = input; result->bytes = bytes; result->width = width; @@ -610,7 +617,7 @@ make_wchar_iterator (const gdb_byte *input, size_t bytes, static void do_cleanup_iterator (void *p) { - struct wchar_iterator *iter = p; + struct wchar_iterator *iter = (struct wchar_iterator *) p; iconv_close (iter->desc); xfree (iter->out); @@ -640,14 +647,15 @@ wchar_iterate (struct wchar_iterator *iter, out_request = 1; while (iter->bytes > 0) { + ICONV_CONST char *inptr = (ICONV_CONST char *) iter->input; char *outptr = (char *) &iter->out[0]; - char *orig_inptr = iter->input; + const gdb_byte *orig_inptr = iter->input; size_t orig_in = iter->bytes; size_t out_avail = out_request * sizeof (gdb_wchar_t); size_t num; - size_t r = iconv (iter->desc, - (ICONV_CONST char **) &iter->input, - &iter->bytes, &outptr, &out_avail); + size_t r = iconv (iter->desc, &inptr, &iter->bytes, &outptr, &out_avail); + + iter->input = (gdb_byte *) inptr; if (r == (size_t) -1) { @@ -679,8 +687,7 @@ wchar_iterate (struct wchar_iterator *iter, if (out_request > iter->out_size) { iter->out_size = out_request; - iter->out = xrealloc (iter->out, - out_request * sizeof (gdb_wchar_t)); + iter->out = XRESIZEVEC (gdb_wchar_t, iter->out, out_request); } continue; @@ -909,11 +916,8 @@ find_charset_names (void) if (fail) { /* Some error occurred, so drop the vector. */ - int ix; - char *elt; - for (ix = 0; VEC_iterate (char_ptr, charsets, ix, elt); ++ix) - xfree (elt); - VEC_truncate (char_ptr, charsets, 0); + free_char_ptr_vec (charsets); + charsets = NULL; } else VEC_safe_push (char_ptr, charsets, NULL); @@ -956,7 +960,7 @@ 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 +/* intermediate_encoding returns the charset used 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, @@ -968,7 +972,6 @@ intermediate_encoding (void) iconv_t desc; static const char *stored_result = NULL; char *result; - int i; if (stored_result) return stored_result;