GDB (xrefs)
/tmp/gdb-8.1/gdb/charset.c
Go to the documentation of this file.
1 /* Character set conversion support for GDB.
2 
3  Copyright (C) 2001-2018 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "charset.h"
22 #include "gdbcmd.h"
23 #include "gdb_obstack.h"
24 #include "gdb_wait.h"
25 #include "charset-list.h"
26 #include "vec.h"
27 #include "environ.h"
28 #include "arch-utils.h"
29 #include "gdb_vecs.h"
30 #include <ctype.h>
31 
32 #ifdef USE_WIN32API
33 #include <windows.h>
34 #endif
35 
36 /* How GDB's character set support works
37 
38  GDB has three global settings:
39 
40  - The `current host character set' is the character set GDB should
41  use in talking to the user, and which (hopefully) the user's
42  terminal knows how to display properly. Most users should not
43  change this.
44 
45  - The `current target character set' is the character set the
46  program being debugged uses.
47 
48  - The `current target wide character set' is the wide character set
49  the program being debugged uses, that is, the encoding used for
50  wchar_t.
51 
52  There are commands to set each of these, and mechanisms for
53  choosing reasonable default values. GDB has a global list of
54  character sets that it can use as its host or target character
55  sets.
56 
57  The header file `charset.h' declares various functions that
58  different pieces of GDB need to perform tasks like:
59 
60  - printing target strings and characters to the user's terminal
61  (mostly target->host conversions),
62 
63  - building target-appropriate representations of strings and
64  characters the user enters in expressions (mostly host->target
65  conversions),
66 
67  and so on.
68 
69  To avoid excessive code duplication and maintenance efforts,
70  GDB simply requires a capable iconv function. Users on platforms
71  without a suitable iconv can use the GNU iconv library. */
72 
73 
74 #ifdef PHONY_ICONV
75 
76 /* Provide a phony iconv that does as little as possible. Also,
77  arrange for there to be a single available character set. */
78 
79 #undef GDB_DEFAULT_HOST_CHARSET
80 #ifdef USE_WIN32API
81 # define GDB_DEFAULT_HOST_CHARSET "CP1252"
82 #else
83 # define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1"
84 #endif
85 #define GDB_DEFAULT_TARGET_CHARSET GDB_DEFAULT_HOST_CHARSET
86 #define GDB_DEFAULT_TARGET_WIDE_CHARSET "UTF-32"
87 #undef DEFAULT_CHARSET_NAMES
88 #define DEFAULT_CHARSET_NAMES GDB_DEFAULT_HOST_CHARSET ,
89 
90 #undef iconv_t
91 #define iconv_t int
92 #undef iconv_open
93 #define iconv_open phony_iconv_open
94 #undef iconv
95 #define iconv phony_iconv
96 #undef iconv_close
97 #define iconv_close phony_iconv_close
98 
99 #undef ICONV_CONST
100 #define ICONV_CONST const
101 
102 /* We allow conversions from UTF-32, wchar_t, and the host charset.
103  We allow conversions to wchar_t and the host charset.
104  Return 1 if we are converting from UTF-32BE, 2 if from UTF32-LE,
105  0 otherwise. This is used as a flag in calls to iconv. */
106 
107 static iconv_t
108 phony_iconv_open (const char *to, const char *from)
109 {
110  if (strcmp (to, "wchar_t") && strcmp (to, GDB_DEFAULT_HOST_CHARSET))
111  return -1;
112 
113  if (!strcmp (from, "UTF-32BE") || !strcmp (from, "UTF-32"))
114  return 1;
115 
116  if (!strcmp (from, "UTF-32LE"))
117  return 2;
118 
119  if (strcmp (from, "wchar_t") && strcmp (from, GDB_DEFAULT_HOST_CHARSET))
120  return -1;
121 
122  return 0;
123 }
124 
125 static int
127 {
128  return 0;
129 }
130 
131 static size_t
132 phony_iconv (iconv_t utf_flag, const char **inbuf, size_t *inbytesleft,
133  char **outbuf, size_t *outbytesleft)
134 {
135  if (utf_flag)
136  {
137  enum bfd_endian endian
138  = utf_flag == 1 ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
139  while (*inbytesleft >= 4)
140  {
141  unsigned long c
142  = extract_unsigned_integer ((const gdb_byte *)*inbuf, 4, endian);
143 
144  if (c >= 256)
145  {
146  errno = EILSEQ;
147  return -1;
148  }
149  if (*outbytesleft < 1)
150  {
151  errno = E2BIG;
152  return -1;
153  }
154  **outbuf = c & 0xff;
155  ++*outbuf;
156  --*outbytesleft;
157 
158  *inbuf += 4;
159  *inbytesleft -= 4;
160  }
161  if (*inbytesleft)
162  {
163  /* Partial sequence on input. */
164  errno = EINVAL;
165  return -1;
166  }
167  }
168  else
169  {
170  /* In all other cases we simply copy input bytes to the
171  output. */
172  size_t amt = *inbytesleft;
173 
174  if (amt > *outbytesleft)
175  amt = *outbytesleft;
176  memcpy (*outbuf, *inbuf, amt);
177  *inbuf += amt;
178  *outbuf += amt;
179  *inbytesleft -= amt;
180  *outbytesleft -= amt;
181  if (*inbytesleft)
182  {
183  errno = E2BIG;
184  return -1;
185  }
186  }
187 
188  /* The number of non-reversible conversions -- but they were all
189  reversible. */
190  return 0;
191 }
192 
193 #else /* PHONY_ICONV */
194 
195 /* On systems that don't have EILSEQ, GNU iconv's iconv.h defines it
196  to ENOENT, while gnulib defines it to a different value. Always
197  map ENOENT to gnulib's EILSEQ, leaving callers agnostic. */
198 
199 static size_t
200 gdb_iconv (iconv_t utf_flag, ICONV_CONST char **inbuf, size_t *inbytesleft,
201  char **outbuf, size_t *outbytesleft)
202 {
203  size_t ret;
204 
205  ret = iconv (utf_flag, inbuf, inbytesleft, outbuf, outbytesleft);
206  if (errno == ENOENT)
207  errno = EILSEQ;
208  return ret;
209 }
210 
211 #undef iconv
212 #define iconv gdb_iconv
213 
214 #endif /* PHONY_ICONV */
215 
216 
217 /* The global lists of character sets and translations. */
218 
219 
220 #ifndef GDB_DEFAULT_TARGET_CHARSET
221 #define GDB_DEFAULT_TARGET_CHARSET "ISO-8859-1"
222 #endif
223 
224 #ifndef GDB_DEFAULT_TARGET_WIDE_CHARSET
225 #define GDB_DEFAULT_TARGET_WIDE_CHARSET "UTF-32"
226 #endif
227 
229 static const char *host_charset_name = "auto";
230 static void
231 show_host_charset_name (struct ui_file *file, int from_tty,
232  struct cmd_list_element *c,
233  const char *value)
234 {
235  if (!strcmp (value, "auto"))
236  fprintf_filtered (file,
237  _("The host character set is \"auto; currently %s\".\n"),
239  else
240  fprintf_filtered (file, _("The host character set is \"%s\".\n"), value);
241 }
242 
243 static const char *target_charset_name = "auto";
244 static void
245 show_target_charset_name (struct ui_file *file, int from_tty,
246  struct cmd_list_element *c, const char *value)
247 {
248  if (!strcmp (value, "auto"))
249  fprintf_filtered (file,
250  _("The target character set is \"auto; "
251  "currently %s\".\n"),
253  else
254  fprintf_filtered (file, _("The target character set is \"%s\".\n"),
255  value);
256 }
257 
258 static const char *target_wide_charset_name = "auto";
259 static void
261  int from_tty,
262  struct cmd_list_element *c,
263  const char *value)
264 {
265  if (!strcmp (value, "auto"))
266  fprintf_filtered (file,
267  _("The target wide character set is \"auto; "
268  "currently %s\".\n"),
270  else
271  fprintf_filtered (file, _("The target wide character set is \"%s\".\n"),
272  value);
273 }
274 
275 static const char *default_charset_names[] =
276 {
278  0
279 };
280 
281 static const char **charset_enum;
282 
283 
284 /* If the target wide character set has big- or little-endian
285  variants, these are the corresponding names. */
286 static const char *target_wide_charset_be_name;
287 static const char *target_wide_charset_le_name;
288 
289 /* The architecture for which the BE- and LE-names are valid. */
290 static struct gdbarch *be_le_arch;
291 
292 /* A helper function which sets the target wide big- and little-endian
293  character set names, if possible. */
294 
295 static void
297 {
298  int i, len;
299  const char *target_wide;
300 
301  if (be_le_arch == gdbarch)
302  return;
304 
305 #ifdef PHONY_ICONV
306  /* Match the wide charset names recognized by phony_iconv_open. */
307  target_wide_charset_le_name = "UTF-32LE";
308  target_wide_charset_be_name = "UTF-32BE";
309 #else
312 
313  target_wide = target_wide_charset_name;
314  if (!strcmp (target_wide, "auto"))
315  target_wide = gdbarch_auto_wide_charset (gdbarch);
316 
317  len = strlen (target_wide);
318  for (i = 0; charset_enum[i]; ++i)
319  {
320  if (strncmp (target_wide, charset_enum[i], len))
321  continue;
322  if ((charset_enum[i][len] == 'B'
323  || charset_enum[i][len] == 'L')
324  && charset_enum[i][len + 1] == 'E'
325  && charset_enum[i][len + 2] == '\0')
326  {
327  if (charset_enum[i][len] == 'B')
329  else
331  }
332  }
333 # endif /* PHONY_ICONV */
334 }
335 
336 /* 'Set charset', 'set host-charset', 'set target-charset', 'set
337  target-wide-charset', 'set charset' sfunc's. */
338 
339 static void
341 {
342  iconv_t desc;
343  const char *host_cset = host_charset ();
344  const char *target_cset = target_charset (gdbarch);
345  const char *target_wide_cset = target_wide_charset_name;
346 
347  if (!strcmp (target_wide_cset, "auto"))
348  target_wide_cset = gdbarch_auto_wide_charset (gdbarch);
349 
350  desc = iconv_open (target_wide_cset, host_cset);
351  if (desc == (iconv_t) -1)
352  error (_("Cannot convert between character sets `%s' and `%s'"),
353  target_wide_cset, host_cset);
354  iconv_close (desc);
355 
356  desc = iconv_open (target_cset, host_cset);
357  if (desc == (iconv_t) -1)
358  error (_("Cannot convert between character sets `%s' and `%s'"),
359  target_cset, host_cset);
360  iconv_close (desc);
361 
362  /* Clear the cache. */
363  be_le_arch = NULL;
364 }
365 
366 /* This is the sfunc for the 'set charset' command. */
367 static void
368 set_charset_sfunc (const char *charset, int from_tty,
369  struct cmd_list_element *c)
370 {
371  /* CAREFUL: set the target charset here as well. */
374 }
375 
376 /* 'set host-charset' command sfunc. We need a wrapper here because
377  the function needs to have a specific signature. */
378 static void
379 set_host_charset_sfunc (const char *charset, int from_tty,
380  struct cmd_list_element *c)
381 {
383 }
384 
385 /* Wrapper for the 'set target-charset' command. */
386 static void
387 set_target_charset_sfunc (const char *charset, int from_tty,
388  struct cmd_list_element *c)
389 {
391 }
392 
393 /* Wrapper for the 'set target-wide-charset' command. */
394 static void
395 set_target_wide_charset_sfunc (const char *charset, int from_tty,
396  struct cmd_list_element *c)
397 {
399 }
400 
401 /* sfunc for the 'show charset' command. */
402 static void
403 show_charset (struct ui_file *file, int from_tty,
404  struct cmd_list_element *c,
405  const char *name)
406 {
407  show_host_charset_name (file, from_tty, c, host_charset_name);
408  show_target_charset_name (file, from_tty, c, target_charset_name);
409  show_target_wide_charset_name (file, from_tty, c,
411 }
412 
413 
414 /* Accessor functions. */
415 
416 const char *
418 {
419  if (!strcmp (host_charset_name, "auto"))
420  return auto_host_charset_name;
421  return host_charset_name;
422 }
423 
424 const char *
426 {
427  if (!strcmp (target_charset_name, "auto"))
428  return gdbarch_auto_charset (gdbarch);
429  return target_charset_name;
430 }
431 
432 const char *
434 {
435  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
436 
438  if (byte_order == BFD_ENDIAN_BIG)
439  {
442  }
443  else
444  {
447  }
448 
449  if (!strcmp (target_wide_charset_name, "auto"))
451 
453 }
454 
455 
456 /* Host character set management. For the time being, we assume that
457  the host character set is some superset of ASCII. */
458 
459 char
461 {
462  if (c == '?')
463  return 0177;
464  return c & 0237;
465 }
466 
467 /* Convert a host character, C, to its hex value. C must already have
468  been validated using isxdigit. */
469 
470 int
472 {
473  if (isdigit (c))
474  return c - '0';
475  if (c >= 'a' && c <= 'f')
476  return 10 + c - 'a';
477  gdb_assert (c >= 'A' && c <= 'F');
478  return 10 + c - 'A';
479 }
480 
481 
482 /* Public character management functions. */
483 
485 {
486 public:
487 
488  iconv_wrapper (const char *to, const char *from)
489  {
490  m_desc = iconv_open (to, from);
491  if (m_desc == (iconv_t) -1)
492  perror_with_name (_("Converting character sets"));
493  }
494 
496  {
498  }
499 
500  size_t convert (ICONV_CONST char **inp, size_t *inleft, char **outp,
501  size_t *outleft)
502  {
503  return iconv (m_desc, inp, inleft, outp, outleft);
504  }
505 
506 private:
507 
509 };
510 
511 void
512 convert_between_encodings (const char *from, const char *to,
513  const gdb_byte *bytes, unsigned int num_bytes,
514  int width, struct obstack *output,
515  enum transliterations translit)
516 {
517  size_t inleft;
518  ICONV_CONST char *inp;
519  unsigned int space_request;
520 
521  /* Often, the host and target charsets will be the same. */
522  if (!strcmp (from, to))
523  {
524  obstack_grow (output, bytes, num_bytes);
525  return;
526  }
527 
528  iconv_wrapper desc (to, from);
529 
530  inleft = num_bytes;
531  inp = (ICONV_CONST char *) bytes;
532 
533  space_request = num_bytes;
534 
535  while (inleft > 0)
536  {
537  char *outp;
538  size_t outleft, r;
539  int old_size;
540 
541  old_size = obstack_object_size (output);
542  obstack_blank (output, space_request);
543 
544  outp = (char *) obstack_base (output) + old_size;
545  outleft = space_request;
546 
547  r = desc.convert (&inp, &inleft, &outp, &outleft);
548 
549  /* Now make sure that the object on the obstack only includes
550  bytes we have converted. */
551  obstack_blank_fast (output, -outleft);
552 
553  if (r == (size_t) -1)
554  {
555  switch (errno)
556  {
557  case EILSEQ:
558  {
559  int i;
560 
561  /* Invalid input sequence. */
562  if (translit == translit_none)
563  error (_("Could not convert character "
564  "to `%s' character set"), to);
565 
566  /* We emit escape sequence for the bytes, skip them,
567  and try again. */
568  for (i = 0; i < width; ++i)
569  {
570  char octal[5];
571 
572  xsnprintf (octal, sizeof (octal), "\\%.3o", *inp & 0xff);
573  obstack_grow_str (output, octal);
574 
575  ++inp;
576  --inleft;
577  }
578  }
579  break;
580 
581  case E2BIG:
582  /* We ran out of space in the output buffer. Make it
583  bigger next time around. */
584  space_request *= 2;
585  break;
586 
587  case EINVAL:
588  /* Incomplete input sequence. FIXME: ought to report this
589  to the caller somehow. */
590  inleft = 0;
591  break;
592 
593  default:
594  perror_with_name (_("Internal error while "
595  "converting character sets"));
596  }
597  }
598  }
599 }
600 
601 
602 
603 /* Create a new iterator. */
604 wchar_iterator::wchar_iterator (const gdb_byte *input, size_t bytes,
605  const char *charset, size_t width)
606 : m_input (input),
607  m_bytes (bytes),
608  m_width (width),
609  m_out (1)
610 {
612  if (m_desc == (iconv_t) -1)
613  perror_with_name (_("Converting character sets"));
614 }
615 
617 {
618  if (m_desc != (iconv_t) -1)
620 }
621 
622 int
624  gdb_wchar_t **out_chars,
625  const gdb_byte **ptr,
626  size_t *len)
627 {
628  size_t out_request;
629 
630  /* Try to convert some characters. At first we try to convert just
631  a single character. The reason for this is that iconv does not
632  necessarily update its outgoing arguments when it encounters an
633  invalid input sequence -- but we want to reliably report this to
634  our caller so it can emit an escape sequence. */
635  out_request = 1;
636  while (m_bytes > 0)
637  {
638  ICONV_CONST char *inptr = (ICONV_CONST char *) m_input;
639  char *outptr = (char *) m_out.data ();
640  const gdb_byte *orig_inptr = m_input;
641  size_t orig_in = m_bytes;
642  size_t out_avail = out_request * sizeof (gdb_wchar_t);
643  size_t num;
644  size_t r = iconv (m_desc, &inptr, &m_bytes, &outptr, &out_avail);
645 
646  m_input = (gdb_byte *) inptr;
647 
648  if (r == (size_t) -1)
649  {
650  switch (errno)
651  {
652  case EILSEQ:
653  /* Invalid input sequence. We still might have
654  converted a character; if so, return it. */
655  if (out_avail < out_request * sizeof (gdb_wchar_t))
656  break;
657 
658  /* Otherwise skip the first invalid character, and let
659  the caller know about it. */
660  *out_result = wchar_iterate_invalid;
661  *ptr = m_input;
662  *len = m_width;
663  m_input += m_width;
664  m_bytes -= m_width;
665  return 0;
666 
667  case E2BIG:
668  /* We ran out of space. We still might have converted a
669  character; if so, return it. Otherwise, grow the
670  buffer and try again. */
671  if (out_avail < out_request * sizeof (gdb_wchar_t))
672  break;
673 
674  ++out_request;
675  if (out_request > m_out.size ())
676  m_out.resize (out_request);
677  continue;
678 
679  case EINVAL:
680  /* Incomplete input sequence. Let the caller know, and
681  arrange for future calls to see EOF. */
682  *out_result = wchar_iterate_incomplete;
683  *ptr = m_input;
684  *len = m_bytes;
685  m_bytes = 0;
686  return 0;
687 
688  default:
689  perror_with_name (_("Internal error while "
690  "converting character sets"));
691  }
692  }
693 
694  /* We converted something. */
695  num = out_request - out_avail / sizeof (gdb_wchar_t);
696  *out_result = wchar_iterate_ok;
697  *out_chars = m_out.data ();
698  *ptr = orig_inptr;
699  *len = orig_in - m_bytes;
700  return num;
701  }
702 
703  /* Really done. */
704  *out_result = wchar_iterate_eof;
705  return -1;
706 }
707 
708 /* The charset.c module initialization function. */
709 
710 static VEC (char_ptr) *charsets;
711 
712 #ifdef PHONY_ICONV
713 
714 static void
715 find_charset_names (void)
716 {
717  /* Cast is fine here, because CHARSETS is never released. Note that
718  the vec does not hold "const char *" pointers instead of "char *"
719  because the non-phony version stores heap-allocated strings in
720  it. */
721  VEC_safe_push (char_ptr, charsets, (char *) GDB_DEFAULT_HOST_CHARSET);
722  VEC_safe_push (char_ptr, charsets, NULL);
723 }
724 
725 #else /* PHONY_ICONV */
726 
727 /* Sometimes, libiconv redefines iconvlist as libiconvlist -- but
728  provides different symbols in the static and dynamic libraries.
729  So, configure may see libiconvlist but not iconvlist. But, calling
730  iconvlist is the right thing to do and will work. Hence we do a
731  check here but unconditionally call iconvlist below. */
732 #if defined (HAVE_ICONVLIST) || defined (HAVE_LIBICONVLIST)
733 
734 /* A helper function that adds some character sets to the vector of
735  all character sets. This is a callback function for iconvlist. */
736 
737 static int
738 add_one (unsigned int count, const char *const *names, void *data)
739 {
740  unsigned int i;
741 
742  for (i = 0; i < count; ++i)
743  VEC_safe_push (char_ptr, charsets, xstrdup (names[i]));
744 
745  return 0;
746 }
747 
748 static void
749 find_charset_names (void)
750 {
751  iconvlist (add_one, NULL);
752  VEC_safe_push (char_ptr, charsets, NULL);
753 }
754 
755 #else
756 
757 /* Return non-zero if LINE (output from iconv) should be ignored.
758  Older iconv programs (e.g. 2.2.2) include the human readable
759  introduction even when stdout is not a tty. Newer versions omit
760  the intro if stdout is not a tty. */
761 
762 static int
763 ignore_line_p (const char *line)
764 {
765  /* This table is used to filter the output. If this text appears
766  anywhere in the line, it is ignored (strstr is used). */
767  static const char * const ignore_lines[] =
768  {
769  "The following",
770  "not necessarily",
771  "the FROM and TO",
772  "listed with several",
773  NULL
774  };
775  int i;
776 
777  for (i = 0; ignore_lines[i] != NULL; ++i)
778  {
779  if (strstr (line, ignore_lines[i]) != NULL)
780  return 1;
781  }
782 
783  return 0;
784 }
785 
786 static void
787 find_charset_names (void)
788 {
789  struct pex_obj *child;
790  const char *args[3];
791  int err, status;
792  int fail = 1;
793  int flags;
795  char *iconv_program;
796 
797  /* Older iconvs, e.g. 2.2.2, don't omit the intro text if stdout is
798  not a tty. We need to recognize it and ignore it. This text is
799  subject to translation, so force LANGUAGE=C. */
800  iconv_env.set ("LANGUAGE", "C");
801  iconv_env.set ("LC_ALL", "C");
802 
803  child = pex_init (PEX_USE_PIPES, "iconv", NULL);
804 
805 #ifdef ICONV_BIN
806  {
807  char *iconv_dir = relocate_gdb_directory (ICONV_BIN,
808  ICONV_BIN_RELOCATABLE);
809  iconv_program = concat (iconv_dir, SLASH_STRING, "iconv", NULL);
810  xfree (iconv_dir);
811  }
812 #else
813  iconv_program = xstrdup ("iconv");
814 #endif
815  args[0] = iconv_program;
816  args[1] = "-l";
817  args[2] = NULL;
818  flags = PEX_STDERR_TO_STDOUT;
819 #ifndef ICONV_BIN
820  flags |= PEX_SEARCH;
821 #endif
822  /* Note that we simply ignore errors here. */
823  if (!pex_run_in_environment (child, flags,
824  args[0], const_cast<char **> (args),
825  iconv_env.envp (),
826  NULL, NULL, &err))
827  {
828  FILE *in = pex_read_output (child, 0);
829 
830  /* POSIX says that iconv -l uses an unspecified format. We
831  parse the glibc and libiconv formats; feel free to add others
832  as needed. */
833 
834  while (in != NULL && !feof (in))
835  {
836  /* The size of buf is chosen arbitrarily. */
837  char buf[1024];
838  char *start, *r;
839  int len;
840 
841  r = fgets (buf, sizeof (buf), in);
842  if (!r)
843  break;
844  len = strlen (r);
845  if (len <= 3)
846  continue;
847  if (ignore_line_p (r))
848  continue;
849 
850  /* Strip off the newline. */
851  --len;
852  /* Strip off one or two '/'s. glibc will print lines like
853  "8859_7//", but also "10646-1:1993/UCS4/". */
854  if (buf[len - 1] == '/')
855  --len;
856  if (buf[len - 1] == '/')
857  --len;
858  buf[len] = '\0';
859 
860  /* libiconv will print multiple entries per line, separated
861  by spaces. Older iconvs will print multiple entries per
862  line, indented by two spaces, and separated by ", "
863  (i.e. the human readable form). */
864  start = buf;
865  while (1)
866  {
867  int keep_going;
868  char *p;
869 
870  /* Skip leading blanks. */
871  for (p = start; *p && *p == ' '; ++p)
872  ;
873  start = p;
874  /* Find the next space, comma, or end-of-line. */
875  for ( ; *p && *p != ' ' && *p != ','; ++p)
876  ;
877  /* Ignore an empty result. */
878  if (p == start)
879  break;
880  keep_going = *p;
881  *p = '\0';
882  VEC_safe_push (char_ptr, charsets, xstrdup (start));
883  if (!keep_going)
884  break;
885  /* Skip any extra spaces. */
886  for (start = p + 1; *start && *start == ' '; ++start)
887  ;
888  }
889  }
890 
891  if (pex_get_status (child, 1, &status)
892  && WIFEXITED (status) && !WEXITSTATUS (status))
893  fail = 0;
894 
895  }
896 
897  xfree (iconv_program);
898  pex_free (child);
899 
900  if (fail)
901  {
902  /* Some error occurred, so drop the vector. */
903  free_char_ptr_vec (charsets);
904  charsets = NULL;
905  }
906  else
907  VEC_safe_push (char_ptr, charsets, NULL);
908 }
909 
910 #endif /* HAVE_ICONVLIST || HAVE_LIBICONVLIST */
911 #endif /* PHONY_ICONV */
912 
913 /* The "auto" target charset used by default_auto_charset. */
915 
916 const char *
918 {
920 }
921 
922 const char *
924 {
926 }
927 
928 
929 #ifdef USE_INTERMEDIATE_ENCODING_FUNCTION
930 /* Macro used for UTF or UCS endianness suffix. */
931 #if WORDS_BIGENDIAN
932 #define ENDIAN_SUFFIX "BE"
933 #else
934 #define ENDIAN_SUFFIX "LE"
935 #endif
936 
937 /* The code below serves to generate a compile time error if
938  gdb_wchar_t type is not of size 2 nor 4, despite the fact that
939  macro __STDC_ISO_10646__ is defined.
940  This is better than a gdb_assert call, because GDB cannot handle
941  strings correctly if this size is different. */
942 
943 extern char your_gdb_wchar_t_is_bogus[(sizeof (gdb_wchar_t) == 2
944  || sizeof (gdb_wchar_t) == 4)
945  ? 1 : -1];
946 
947 /* intermediate_encoding returns the charset used internally by
948  GDB to convert between target and host encodings. As the test above
949  compiled, sizeof (gdb_wchar_t) is either 2 or 4 bytes.
950  UTF-16/32 is tested first, UCS-2/4 is tested as a second option,
951  otherwise an error is generated. */
952 
953 const char *
954 intermediate_encoding (void)
955 {
956  iconv_t desc;
957  static const char *stored_result = NULL;
958  char *result;
959 
960  if (stored_result)
961  return stored_result;
962  result = xstrprintf ("UTF-%d%s", (int) (sizeof (gdb_wchar_t) * 8),
963  ENDIAN_SUFFIX);
964  /* Check that the name is supported by iconv_open. */
965  desc = iconv_open (result, host_charset ());
966  if (desc != (iconv_t) -1)
967  {
968  iconv_close (desc);
969  stored_result = result;
970  return result;
971  }
972  /* Not valid, free the allocated memory. */
973  xfree (result);
974  /* Second try, with UCS-2 type. */
975  result = xstrprintf ("UCS-%d%s", (int) sizeof (gdb_wchar_t),
976  ENDIAN_SUFFIX);
977  /* Check that the name is supported by iconv_open. */
978  desc = iconv_open (result, host_charset ());
979  if (desc != (iconv_t) -1)
980  {
981  iconv_close (desc);
982  stored_result = result;
983  return result;
984  }
985  /* Not valid, free the allocated memory. */
986  xfree (result);
987  /* No valid charset found, generate error here. */
988  error (_("Unable to find a vaild charset for string conversions"));
989 }
990 
991 #endif /* USE_INTERMEDIATE_ENCODING_FUNCTION */
992 
993 void
995 {
996  /* The first element is always "auto". */
997  VEC_safe_push (char_ptr, charsets, xstrdup ("auto"));
998  find_charset_names ();
999 
1000  if (VEC_length (char_ptr, charsets) > 1)
1001  charset_enum = (const char **) VEC_address (char_ptr, charsets);
1002  else
1004 
1005 #ifndef PHONY_ICONV
1006 #ifdef HAVE_LANGINFO_CODESET
1007  /* The result of nl_langinfo may be overwritten later. This may
1008  leak a little memory, if the user later changes the host charset,
1009  but that doesn't matter much. */
1011  /* Solaris will return `646' here -- but the Solaris iconv then does
1012  not accept this. Darwin (and maybe FreeBSD) may return "" here,
1013  which GNU libiconv doesn't like (infinite loop). */
1014  if (!strcmp (auto_host_charset_name, "646") || !*auto_host_charset_name)
1015  auto_host_charset_name = "ASCII";
1017 #elif defined (USE_WIN32API)
1018  {
1019  /* "CP" + x<=5 digits + paranoia. */
1020  static char w32_host_default_charset[16];
1021 
1022  snprintf (w32_host_default_charset, sizeof w32_host_default_charset,
1023  "CP%d", GetACP());
1024  auto_host_charset_name = w32_host_default_charset;
1026  }
1027 #endif
1028 #endif
1029 
1030  add_setshow_enum_cmd ("charset", class_support,
1032 Set the host and target character sets."), _("\
1033 Show the host and target character sets."), _("\
1034 The `host character set' is the one used by the system GDB is running on.\n\
1035 The `target character set' is the one used by the program being debugged.\n\
1036 You may only use supersets of ASCII for your host character set; GDB does\n\
1037 not support any others.\n\
1038 To see a list of the character sets GDB supports, type `set charset <TAB>'."),
1039  /* Note that the sfunc below needs to set
1040  target_charset_name, because the 'set
1041  charset' command sets two variables. */
1043  show_charset,
1044  &setlist, &showlist);
1045 
1046  add_setshow_enum_cmd ("host-charset", class_support,
1048 Set the host character set."), _("\
1049 Show the host character set."), _("\
1050 The `host character set' is the one used by the system GDB is running on.\n\
1051 You may only use supersets of ASCII for your host character set; GDB does\n\
1052 not support any others.\n\
1053 To see a list of the character sets GDB supports, type `set host-charset <TAB>'."),
1056  &setlist, &showlist);
1057 
1058  add_setshow_enum_cmd ("target-charset", class_support,
1060 Set the target character set."), _("\
1061 Show the target character set."), _("\
1062 The `target character set' is the one used by the program being debugged.\n\
1063 GDB translates characters and strings between the host and target\n\
1064 character sets as needed.\n\
1065 To see a list of the character sets GDB supports, type `set target-charset'<TAB>"),
1068  &setlist, &showlist);
1069 
1070  add_setshow_enum_cmd ("target-wide-charset", class_support,
1072  _("\
1073 Set the target wide character set."), _("\
1074 Show the target wide character set."), _("\
1075 The `target wide character set' is the one used by the program being debugged.\
1076 \nIn particular it is the encoding used by `wchar_t'.\n\
1077 GDB translates characters and strings between the host and target\n\
1078 character sets as needed.\n\
1079 To see a list of the character sets GDB supports, type\n\
1080 `set target-wide-charset'<TAB>"),
1083  &setlist, &showlist);
1084 }
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
Definition: gnu-nat.c:1822
wchar_iterator(const gdb_byte *input, size_t bytes, const char *charset, size_t width)
Definition: charset.c:604
iconv_t m_desc
Definition: charset.h:135
static const char * target_wide_charset_be_name
Definition: charset.c:286
const char * target_charset(struct gdbarch *gdbarch)
Definition: charset.c:425
char * nl_langinfo(nl_item)
Definition: go32-nat.c:996
static void set_host_charset_sfunc(const char *charset, int from_tty, struct cmd_list_element *c)
Definition: charset.c:379
void xfree(void *)
void _initialize_charset(void)
Definition: charset.c:994
#define DEFAULT_CHARSET_NAMES
Definition: charset.c:88
void set(const char *var, const char *value)
Definition: environ.c:106
void add_setshow_enum_cmd(const char *name, enum command_class theclass, const char *const *enumlist, const char **var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
Definition: cli-decode.c:515
size_t m_bytes
Definition: charset.h:141
#define GDB_DEFAULT_HOST_CHARSET
Definition: charset.c:83
transliterations
Definition: charset.h:43
#define VEC_safe_push(T, V, O)
Definition: vec.h:276
static void keep_going(struct execution_control_state *ecs)
Definition: infrun.c:7799
#define _(String)
Definition: gdb_locale.h:35
const char * gdbarch_auto_wide_charset(struct gdbarch *gdbarch)
Definition: gdbarch.c:4704
char * char_ptr
Definition: gdb_vecs.h:25
wchar_iterate_result
Definition: charset.h:74
static gdb_environ from_host_environ()
Definition: environ.c:44
#define iconv_t
Definition: charset.c:91
static void set_target_wide_charset_sfunc(const char *charset, int from_tty, struct cmd_list_element *c)
Definition: charset.c:395
static void show_charset(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *name)
Definition: charset.c:403
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
Definition: gnu-nat.c:1891
static void set_be_le_names(struct gdbarch *gdbarch)
Definition: charset.c:296
size_t m_width
Definition: charset.h:144
struct cmd_list_element * setlist
Definition: cli-cmds.c:111
const char *const name
Definition: aarch64-tdep.c:76
const char * default_auto_charset(void)
Definition: charset.c:917
static size_t phony_iconv(iconv_t utf_flag, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
Definition: charset.c:132
~iconv_wrapper()
Definition: charset.c:495
#define iconv
Definition: charset.c:95
static VEC(char_ptr)
Definition: charset.c:710
#define SLASH_STRING
Definition: host-defs.h:58
void convert_between_encodings(const char *from, const char *to, const gdb_byte *bytes, unsigned int num_bytes, int width, struct obstack *output, enum transliterations translit)
Definition: charset.c:512
static void validate(struct gdbarch *gdbarch)
Definition: charset.c:340
#define GDB_DEFAULT_TARGET_WIDE_CHARSET
Definition: charset.c:86
void fprintf_filtered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2008
const char * default_auto_wide_charset(void)
Definition: charset.c:923
const char * target_wide_charset(struct gdbarch *gdbarch)
Definition: charset.c:433
static const char * target_wide_charset_name
Definition: charset.c:258
void free_char_ptr_vec(VEC(char_ptr) *char_ptr_vec)
Definition: gdb_vecs.c:32
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:577
#define WIFEXITED(w)
Definition: gdb_wait.h:44
static void show_target_charset_name(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition: charset.c:245
struct cmd_list_element * showlist
Definition: cli-cmds.c:119
static struct gdbarch * be_le_arch
Definition: charset.c:290
static const char * auto_host_charset_name
Definition: charset.c:228
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
#define VEC_length(T, V)
Definition: vec.h:140
static int phony_iconv_close(iconv_t arg)
Definition: charset.c:126
static void show_host_charset_name(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition: charset.c:231
static const char * host_charset_name
Definition: charset.c:229
#define iconv_open
Definition: charset.c:93
char host_letter_to_control_character(char c)
Definition: charset.c:460
struct gdbarch * get_current_arch(void)
Definition: arch-utils.c:798
int host_hex_value(char c)
Definition: charset.c:471
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
Definition: gnu-nat.c:1822
int iterate(enum wchar_iterate_result *out_result, gdb_wchar_t **out_chars, const gdb_byte **ptr, size_t *len)
Definition: charset.c:623
char * xstrprintf(const char *format,...)
Definition: common-utils.c:107
#define WEXITSTATUS(w)
Definition: gdb_wait.h:67
gdb::def_vector< gdb_wchar_t > m_out
Definition: charset.h:147
static iconv_t phony_iconv_open(const char *to, const char *from)
Definition: charset.c:108
size_t convert(ICONV_CONST char **inp, size_t *inleft, char **outp, size_t *outleft)
Definition: charset.c:500
#define GDB_DEFAULT_TARGET_CHARSET
Definition: charset.c:85
#define gdb_assert(expr)
Definition: gdb_assert.h:32
Definition: value.c:169
#define ICONV_CONST
Definition: charset.c:100
bfd_byte gdb_byte
Definition: common-types.h:38
#define iconv_close
Definition: charset.c:97
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
Definition: utils.c:692
static void set_target_charset_sfunc(const char *charset, int from_tty, struct cmd_list_element *c)
Definition: charset.c:387
static const char * target_charset_name
Definition: charset.c:243
char gdb_wchar_t
Definition: gdb_wchar.h:101
static const char ** charset_enum
Definition: charset.c:281
int xsnprintf(char *str, size_t size, const char *format,...)
Definition: common-utils.c:134
#define obstack_grow_str(OBSTACK, STRING)
Definition: gdb_obstack.h:46
static void show_target_wide_charset_name(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition: charset.c:260
#define VEC_address(T, V)
Definition: vec.h:385
static const char * target_wide_charset_le_name
Definition: charset.c:287
char ** envp() const
Definition: environ.c:166
#define INTERMEDIATE_ENCODING
Definition: gdb_wchar.h:117
static void set_charset_sfunc(const char *charset, int from_tty, struct cmd_list_element *c)
Definition: charset.c:368
static const char * auto_target_charset_name
Definition: charset.c:914
char * relocate_gdb_directory(const char *initial, int flag)
Definition: main.c:159
const char * host_charset(void)
Definition: charset.c:417
iconv_t m_desc
Definition: charset.c:508
enum bfd_endian byte_order
Definition: gdbarch.c:137
void error(const char *fmt,...)
Definition: errors.c:38
const char * gdbarch_auto_charset(struct gdbarch *gdbarch)
Definition: gdbarch.c:4687
const gdb_byte * m_input
Definition: charset.h:139
iconv_wrapper(const char *to, const char *from)
Definition: charset.c:488
static const char * default_charset_names[]
Definition: charset.c:275