1/* Character set conversion support for GDB.
2
3   Copyright (C) 2001, 2003, 2007 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_assert.h"
24
25#include <stddef.h>
26#include "gdb_string.h"
27#include <ctype.h>
28
29#ifdef HAVE_ICONV
30#include <iconv.h>
31#endif
32
33
34/* How GDB's character set support works
35
36   GDB has two global settings:
37
38   - The `current host character set' is the character set GDB should
39     use in talking to the user, and which (hopefully) the user's
40     terminal knows how to display properly.
41
42   - The `current target character set' is the character set the
43     program being debugged uses.
44
45   There are commands to set each of these, and mechanisms for
46   choosing reasonable default values.  GDB has a global list of
47   character sets that it can use as its host or target character
48   sets.
49
50   The header file `charset.h' declares various functions that
51   different pieces of GDB need to perform tasks like:
52
53   - printing target strings and characters to the user's terminal
54     (mostly target->host conversions),
55
56   - building target-appropriate representations of strings and
57     characters the user enters in expressions (mostly host->target
58     conversions),
59
60   and so on.
61
62   Now, many of these operations are specific to a particular
63   host/target character set pair.  If GDB supports N character sets,
64   there are N^2 possible pairs.  This means that, the larger GDB's
65   repertoire of character sets gets, the more expensive it gets to add
66   new character sets.
67
68   To make sure that GDB can do the right thing for every possible
69   pairing of host and target character set, while still allowing
70   GDB's repertoire to scale, we use a two-tiered approach:
71
72   - We maintain a global table of "translations" --- groups of
73     functions specific to a particular pair of character sets.
74
75   - However, a translation can be incomplete: some functions can be
76     omitted.  Where there is not a translation to specify exactly
77     what function to use, we provide reasonable defaults.  The
78     default behaviors try to use the "iconv" library functions, which
79     support a wide range of character sets.  However, even if iconv
80     is not available, there are fallbacks to support trivial
81     translations: when the host and target character sets are the
82     same.  */
83
84
85/* The character set and translation structures.  */
86
87
88/* A character set GDB knows about.  GDB only supports character sets
89   with stateless encodings, in which every character is one byte
90   long.  */
91struct charset {
92
93  /* A singly-linked list of all known charsets.  */
94  struct charset *next;
95
96  /* The name of the character set.  Comparisons on character set
97     names are case-sensitive.  */
98  const char *name;
99
100  /* Non-zero iff this character set can be used as a host character
101     set.  At present, GDB basically assumes that the host character
102     set is a superset of ASCII.  */
103  int valid_host_charset;
104
105  /* Pointers to charset-specific functions that depend only on a
106     single character set, and data pointers to pass to them.  */
107  int (*host_char_print_literally) (void *baton,
108                                    int host_char);
109  void *host_char_print_literally_baton;
110
111  int (*target_char_to_control_char) (void *baton,
112                                      int target_char,
113                                      int *target_ctrl_char);
114  void *target_char_to_control_char_baton;
115};
116
117
118/* A translation from one character set to another.  */
119struct translation {
120
121  /* A singly-linked list of all known translations.  */
122  struct translation *next;
123
124  /* This structure describes functions going from the FROM character
125     set to the TO character set.  Comparisons on character set names
126     are case-sensitive.  */
127  const char *from, *to;
128
129  /* Pointers to translation-specific functions, and data pointers to
130     pass to them.  These pointers can be zero, indicating that GDB
131     should fall back on the default behavior.  We hope the default
132     behavior will be correct for many from/to pairs, reducing the
133     number of translations that need to be registered explicitly.  */
134
135  /* TARGET_CHAR is in the `from' charset.
136     Returns a string in the `to' charset.  */
137  const char *(*c_target_char_has_backslash_escape) (void *baton,
138                                                     int target_char);
139  void *c_target_char_has_backslash_escape_baton;
140
141  /* HOST_CHAR is in the `from' charset.
142     TARGET_CHAR points to a char in the `to' charset.  */
143  int (*c_parse_backslash) (void *baton, int host_char, int *target_char);
144  void *c_parse_backslash_baton;
145
146  /* This is used for the host_char_to_target and target_char_to_host
147     functions.  */
148  int (*convert_char) (void *baton, int from, int *to);
149  void *convert_char_baton;
150};
151
152
153
154/* The global lists of character sets and translations.  */
155
156
157#ifndef GDB_DEFAULT_HOST_CHARSET
158#define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1"
159#endif
160
161#ifndef GDB_DEFAULT_TARGET_CHARSET
162#define GDB_DEFAULT_TARGET_CHARSET "ISO-8859-1"
163#endif
164
165static const char *host_charset_name = GDB_DEFAULT_HOST_CHARSET;
166static void
167show_host_charset_name (struct ui_file *file, int from_tty,
168			struct cmd_list_element *c,
169			const char *value)
170{
171  fprintf_filtered (file, _("The host character set is \"%s\".\n"), value);
172}
173
174static const char *target_charset_name = GDB_DEFAULT_TARGET_CHARSET;
175static void
176show_target_charset_name (struct ui_file *file, int from_tty,
177			  struct cmd_list_element *c, const char *value)
178{
179  fprintf_filtered (file, _("The target character set is \"%s\".\n"),
180		    value);
181}
182
183
184static const char *host_charset_enum[] =
185{
186  "ASCII",
187  "ISO-8859-1",
188  0
189};
190
191static const char *target_charset_enum[] =
192{
193  "ASCII",
194  "ISO-8859-1",
195  "EBCDIC-US",
196  "IBM1047",
197  0
198};
199
200/* The global list of all the charsets GDB knows about.  */
201static struct charset *all_charsets;
202
203
204static void
205register_charset (struct charset *cs)
206{
207  struct charset **ptr;
208
209  /* Put the new charset on the end, so that the list ends up in the
210     same order as the registrations in the _initialize function.  */
211  for (ptr = &all_charsets; *ptr; ptr = &(*ptr)->next)
212    ;
213
214  cs->next = 0;
215  *ptr = cs;
216}
217
218
219static struct charset *
220lookup_charset (const char *name)
221{
222  struct charset *cs;
223
224  for (cs = all_charsets; cs; cs = cs->next)
225    if (! strcmp (name, cs->name))
226      return cs;
227
228  return NULL;
229}
230
231
232/* The global list of translations.  */
233static struct translation *all_translations;
234
235
236static void
237register_translation (struct translation *t)
238{
239  t->next = all_translations;
240  all_translations = t;
241}
242
243
244static struct translation *
245lookup_translation (const char *from, const char *to)
246{
247  struct translation *t;
248
249  for (t = all_translations; t; t = t->next)
250    if (! strcmp (from, t->from)
251        && ! strcmp (to, t->to))
252      return t;
253
254  return 0;
255}
256
257
258
259/* Constructing charsets.  */
260
261/* Allocate, initialize and return a straightforward charset.
262   Use this function, rather than creating the structures yourself,
263   so that we can add new fields to the structure in the future without
264   having to tweak all the old charset descriptions.  */
265static struct charset *
266simple_charset (const char *name,
267                int valid_host_charset,
268                int (*host_char_print_literally) (void *baton, int host_char),
269                void *host_char_print_literally_baton,
270                int (*target_char_to_control_char) (void *baton,
271                                                    int target_char,
272                                                    int *target_ctrl_char),
273                void *target_char_to_control_char_baton)
274{
275  struct charset *cs = xmalloc (sizeof (*cs));
276
277  memset (cs, 0, sizeof (*cs));
278  cs->name = name;
279  cs->valid_host_charset = valid_host_charset;
280  cs->host_char_print_literally = host_char_print_literally;
281  cs->host_char_print_literally_baton = host_char_print_literally_baton;
282  cs->target_char_to_control_char = target_char_to_control_char;
283  cs->target_char_to_control_char_baton = target_char_to_control_char_baton;
284
285  return cs;
286}
287
288
289
290/* ASCII functions.  */
291
292static int
293ascii_print_literally (void *baton, int c)
294{
295  c &= 0xff;
296
297  return (0x20 <= c && c <= 0x7e);
298}
299
300
301static int
302ascii_to_control (void *baton, int c, int *ctrl_char)
303{
304  *ctrl_char = (c & 037);
305  return 1;
306}
307
308
309/* ISO-8859 family functions.  */
310
311
312static int
313iso_8859_print_literally (void *baton, int c)
314{
315  c &= 0xff;
316
317  return ((0x20 <= c && c <= 0x7e) /* ascii printables */
318          || (! sevenbit_strings && 0xA0 <= c)); /* iso 8859 printables */
319}
320
321
322static int
323iso_8859_to_control (void *baton, int c, int *ctrl_char)
324{
325  *ctrl_char = (c & 0200) | (c & 037);
326  return 1;
327}
328
329
330/* Construct an ISO-8859-like character set.  */
331static struct charset *
332iso_8859_family_charset (const char *name)
333{
334  return simple_charset (name, 1,
335                         iso_8859_print_literally, 0,
336                         iso_8859_to_control, 0);
337}
338
339
340
341/* EBCDIC family functions.  */
342
343
344static int
345ebcdic_print_literally (void *baton, int c)
346{
347  c &= 0xff;
348
349  return (64 <= c && c <= 254);
350}
351
352
353static int
354ebcdic_to_control (void *baton, int c, int *ctrl_char)
355{
356  /* There are no control character equivalents in EBCDIC.  Use
357     numeric escapes.  */
358  return 0;
359}
360
361
362/* Construct an EBCDIC-like character set.  */
363static struct charset *
364ebcdic_family_charset (const char *name)
365{
366  return simple_charset (name, 0,
367                         ebcdic_print_literally, 0,
368                         ebcdic_to_control, 0);
369}
370
371
372
373
374
375/* Fallback functions using iconv.  */
376
377#if defined(HAVE_ICONV)
378
379struct cached_iconv {
380  struct charset *from, *to;
381  iconv_t i;
382};
383
384
385/* Make sure the iconv cache *CI contains an iconv descriptor
386   translating from FROM to TO.  If it already does, fine; otherwise,
387   close any existing descriptor, and open up a new one.  On success,
388   return zero; on failure, return -1 and set errno.  */
389static int
390check_iconv_cache (struct cached_iconv *ci,
391                   struct charset *from,
392                   struct charset *to)
393{
394  iconv_t i;
395
396  /* Does the cached iconv descriptor match the conversion we're trying
397     to do now?  */
398  if (ci->from == from
399      && ci->to == to
400      && ci->i != (iconv_t) 0)
401    return 0;
402
403  /* It doesn't.  If we actually had any iconv descriptor open at
404     all, close it now.  */
405  if (ci->i != (iconv_t) 0)
406    {
407      i = ci->i;
408      ci->i = (iconv_t) 0;
409
410      if (iconv_close (i) == -1)
411        error (_("Error closing `iconv' descriptor for "
412		 "`%s'-to-`%s' character conversion: %s"),
413               ci->from->name, ci->to->name, safe_strerror (errno));
414    }
415
416  /* Open a new iconv descriptor for the required conversion.  */
417  i = iconv_open (to->name, from->name);
418  if (i == (iconv_t) -1)
419    return -1;
420
421  ci->i = i;
422  ci->from = from;
423  ci->to = to;
424
425  return 0;
426}
427
428
429/* Convert FROM_CHAR using the cached iconv conversion *CI.  Return
430   non-zero if the conversion was successful, zero otherwise.  */
431static int
432cached_iconv_convert (struct cached_iconv *ci, int from_char, int *to_char)
433{
434  char from;
435  ICONV_CONST char *from_ptr = &from;
436  char to, *to_ptr = &to;
437  size_t from_left = sizeof (from), to_left = sizeof (to);
438
439  gdb_assert (ci->i != (iconv_t) 0);
440
441  from = from_char;
442  if (iconv (ci->i, &from_ptr, &from_left, &to_ptr, &to_left)
443      == (size_t) -1)
444    {
445      /* These all suggest that the input or output character sets
446         have multi-byte encodings of some characters, which means
447         it's unsuitable for use as a GDB character set.  We should
448         never have selected it.  */
449      gdb_assert (errno != E2BIG && errno != EINVAL);
450
451      /* This suggests a bug in the code managing *CI.  */
452      gdb_assert (errno != EBADF);
453
454      /* This seems to mean that there is no equivalent character in
455         the `to' character set.  */
456      if (errno == EILSEQ)
457        return 0;
458
459      /* Anything else is mysterious.  */
460      internal_error (__FILE__, __LINE__,
461		      _("Error converting character `%d' from `%s' to `%s' "
462			"character set: %s"),
463                      from_char, ci->from->name, ci->to->name,
464                      safe_strerror (errno));
465    }
466
467  /* If the pointers weren't advanced across the input, that also
468     suggests something was wrong.  */
469  gdb_assert (from_left == 0 && to_left == 0);
470
471  *to_char = (unsigned char) to;
472  return 1;
473}
474
475
476static void
477register_iconv_charsets (void)
478{
479  /* Here we should check whether various character sets were
480     recognized by the local iconv implementation.
481
482     The first implementation registered a bunch of character sets
483     recognized by iconv, but then we discovered that iconv on Solaris
484     and iconv on GNU/Linux had no character sets in common.  So we
485     replaced them with the hard-coded tables that appear later in the
486     file.  */
487}
488
489#endif /* defined (HAVE_ICONV) */
490
491
492/* Fallback routines for systems without iconv.  */
493
494#if ! defined (HAVE_ICONV)
495struct cached_iconv { char nothing; };
496
497static int
498check_iconv_cache (struct cached_iconv *ci,
499                   struct charset *from,
500                   struct charset *to)
501{
502  errno = EINVAL;
503  return -1;
504}
505
506static int
507cached_iconv_convert (struct cached_iconv *ci, int from_char, int *to_char)
508{
509  /* This function should never be called.  */
510  gdb_assert (0);
511}
512
513static void
514register_iconv_charsets (void)
515{
516}
517
518#endif /* ! defined(HAVE_ICONV) */
519
520
521/* Default trivial conversion functions.  */
522
523static int
524identity_either_char_to_other (void *baton, int either_char, int *other_char)
525{
526  *other_char = either_char;
527  return 1;
528}
529
530
531
532/* Default non-trivial conversion functions.  */
533
534
535static char backslashable[] = "abfnrtv";
536static char *backslashed[] = {"a", "b", "f", "n", "r", "t", "v", "0"};
537static char represented[] = "\a\b\f\n\r\t\v";
538
539
540/* Translate TARGET_CHAR into the host character set, and see if it
541   matches any of our standard escape sequences.  */
542static const char *
543default_c_target_char_has_backslash_escape (void *baton, int target_char)
544{
545  int host_char;
546  const char *ix;
547
548  /* If target_char has no equivalent in the host character set,
549     assume it doesn't have a backslashed form.  */
550  if (! target_char_to_host (target_char, &host_char))
551    return NULL;
552
553  ix = strchr (represented, host_char);
554  if (ix)
555    return backslashed[ix - represented];
556  else
557    return NULL;
558}
559
560
561/* Translate the backslash the way we would in the host character set,
562   and then try to translate that into the target character set.  */
563static int
564default_c_parse_backslash (void *baton, int host_char, int *target_char)
565{
566  const char *ix;
567
568  ix = strchr (backslashable, host_char);
569
570  if (! ix)
571    return 0;
572  else
573    return host_char_to_target (represented[ix - backslashable],
574                                target_char);
575}
576
577
578/* Convert using a cached iconv descriptor.  */
579static int
580iconv_convert (void *baton, int from_char, int *to_char)
581{
582  struct cached_iconv *ci = baton;
583  return cached_iconv_convert (ci, from_char, to_char);
584}
585
586
587
588/* Conversion tables.  */
589
590
591/* I'd much rather fall back on iconv whenever possible.  But the
592   character set names you use with iconv aren't standardized at all,
593   a lot of platforms have really meager character set coverage, etc.
594   I wanted to have at least something we could use to exercise the
595   test suite on all platforms.
596
597   In the long run, we should have a configure-time process explore
598   somehow which character sets the host platform supports, and some
599   arrangement that allows GDB users to use platform-indepedent names
600   for character sets.  */
601
602
603/* We generated these tables using iconv on a GNU/Linux machine.  */
604
605
606static int ascii_to_iso_8859_1_table[] = {
607    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 16 */
608   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */
609   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */
610   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */
611   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 80 */
612   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 96 */
613   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 112 */
614  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 128 */
615   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */
616   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */
617   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */
618   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
619   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */
620   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */
621   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */
622   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  /* 256 */
623};
624
625
626static int ascii_to_ebcdic_us_table[] = {
627    0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 37, 11, 12, 13, 14, 15, /* 16 */
628   16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */
629   64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */
630  240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */
631  124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */
632  215,216,217,226,227,228,229,230,231,232,233, -1,224, -1, -1,109, /* 96 */
633  121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */
634  151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7, /* 128 */
635   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */
636   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */
637   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */
638   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
639   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */
640   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */
641   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */
642   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  /* 256 */
643};
644
645
646static int ascii_to_ibm1047_table[] = {
647    0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 37, 11, 12, 13, 14, 15, /* 16 */
648   16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */
649   64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */
650  240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */
651  124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */
652  215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109, /* 96 */
653  121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */
654  151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7, /* 128 */
655   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */
656   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */
657   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */
658   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
659   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */
660   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */
661   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */
662   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  /* 256 */
663};
664
665
666static int iso_8859_1_to_ascii_table[] = {
667    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 16 */
668   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */
669   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */
670   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */
671   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 80 */
672   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 96 */
673   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 112 */
674  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 128 */
675   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */
676   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */
677   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */
678   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
679   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */
680   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */
681   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */
682   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  /* 256 */
683};
684
685
686static int iso_8859_1_to_ebcdic_us_table[] = {
687    0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 37, 11, 12, 13, 14, 15, /* 16 */
688   16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */
689   64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */
690  240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */
691  124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */
692  215,216,217,226,227,228,229,230,231,232,233, -1,224, -1, -1,109, /* 96 */
693  121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */
694  151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7, /* 128 */
695   32, 33, 34, 35, 36, 21,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27, /* 144 */
696   48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255, /* 160 */
697   -1, -1, 74, -1, -1, -1,106, -1, -1, -1, -1, -1, 95, -1, -1, -1, /* 176 */
698   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
699   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */
700   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */
701   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */
702   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  /* 256 */
703};
704
705
706static int iso_8859_1_to_ibm1047_table[] = {
707    0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 37, 11, 12, 13, 14, 15, /* 16 */
708   16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */
709   64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */
710  240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */
711  124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */
712  215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109, /* 96 */
713  121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */
714  151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7, /* 128 */
715   32, 33, 34, 35, 36, 21,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27, /* 144 */
716   48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255, /* 160 */
717   65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188, /* 176 */
718  144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171, /* 192 */
719  100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119, /* 208 */
720  172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89, /* 224 */
721   68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87, /* 240 */
722  140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223  /* 256 */
723};
724
725
726static int ebcdic_us_to_ascii_table[] = {
727    0,  1,  2,  3, -1,  9, -1,127, -1, -1, -1, 11, 12, 13, 14, 15, /* 16 */
728   16, 17, 18, 19, -1, -1,  8, -1, 24, 25, -1, -1, 28, 29, 30, 31, /* 32 */
729   -1, -1, -1, -1, -1, 10, 23, 27, -1, -1, -1, -1, -1,  5,  6,  7, /* 48 */
730   -1, -1, 22, -1, -1, -1, -1,  4, -1, -1, -1, -1, 20, 21, -1, 26, /* 64 */
731   32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, 60, 40, 43,124, /* 80 */
732   38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59, -1, /* 96 */
733   45, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 37, 95, 62, 63, /* 112 */
734   -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */
735   -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */
736   -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */
737   -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, -1, -1, -1, /* 176 */
738   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
739  123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */
740  125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */
741   92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */
742   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1, -1  /* 256 */
743};
744
745
746static int ebcdic_us_to_iso_8859_1_table[] = {
747    0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15, /* 16 */
748   16, 17, 18, 19,157,133,  8,135, 24, 25,146,143, 28, 29, 30, 31, /* 32 */
749  128,129,130,131,132, 10, 23, 27,136,137,138,139,140,  5,  6,  7, /* 48 */
750  144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26, /* 64 */
751   32, -1, -1, -1, -1, -1, -1, -1, -1, -1,162, 46, 60, 40, 43,124, /* 80 */
752   38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59,172, /* 96 */
753   45, 47, -1, -1, -1, -1, -1, -1, -1, -1,166, 44, 37, 95, 62, 63, /* 112 */
754   -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */
755   -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */
756   -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */
757   -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, -1, -1, -1, /* 176 */
758   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
759  123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */
760  125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */
761   92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */
762   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1,159  /* 256 */
763};
764
765
766static int ebcdic_us_to_ibm1047_table[] = {
767    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 16 */
768   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */
769   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */
770   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */
771   64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 75, 76, 77, 78, 79, /* 80 */
772   80, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, 94,176, /* 96 */
773   96, 97, -1, -1, -1, -1, -1, -1, -1, -1,106,107,108,109,110,111, /* 112 */
774   -1, -1, -1, -1, -1, -1, -1, -1, -1,121,122,123,124,125,126,127, /* 128 */
775   -1,129,130,131,132,133,134,135,136,137, -1, -1, -1, -1, -1, -1, /* 144 */
776   -1,145,146,147,148,149,150,151,152,153, -1, -1, -1, -1, -1, -1, /* 160 */
777   -1,161,162,163,164,165,166,167,168,169, -1, -1, -1, -1, -1, -1, /* 176 */
778   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
779  192,193,194,195,196,197,198,199,200,201, -1, -1, -1, -1, -1, -1, /* 208 */
780  208,209,210,211,212,213,214,215,216,217, -1, -1, -1, -1, -1, -1, /* 224 */
781  224, -1,226,227,228,229,230,231,232,233, -1, -1, -1, -1, -1, -1, /* 240 */
782  240,241,242,243,244,245,246,247,248,249, -1, -1, -1, -1, -1,255  /* 256 */
783};
784
785
786static int ibm1047_to_ascii_table[] = {
787    0,  1,  2,  3, -1,  9, -1,127, -1, -1, -1, 11, 12, 13, 14, 15, /* 16 */
788   16, 17, 18, 19, -1, -1,  8, -1, 24, 25, -1, -1, 28, 29, 30, 31, /* 32 */
789   -1, -1, -1, -1, -1, 10, 23, 27, -1, -1, -1, -1, -1,  5,  6,  7, /* 48 */
790   -1, -1, 22, -1, -1, -1, -1,  4, -1, -1, -1, -1, 20, 21, -1, 26, /* 64 */
791   32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, 60, 40, 43,124, /* 80 */
792   38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59, 94, /* 96 */
793   45, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 37, 95, 62, 63, /* 112 */
794   -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */
795   -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */
796   -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */
797   -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, 91, -1, -1, /* 176 */
798   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, /* 192 */
799  123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */
800  125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */
801   92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */
802   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1, -1  /* 256 */
803};
804
805
806static int ibm1047_to_iso_8859_1_table[] = {
807    0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15, /* 16 */
808   16, 17, 18, 19,157,133,  8,135, 24, 25,146,143, 28, 29, 30, 31, /* 32 */
809  128,129,130,131,132, 10, 23, 27,136,137,138,139,140,  5,  6,  7, /* 48 */
810  144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26, /* 64 */
811   32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124, /* 80 */
812   38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94, /* 96 */
813   45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63, /* 112 */
814  248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34, /* 128 */
815  216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177, /* 144 */
816  176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164, /* 160 */
817  181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174, /* 176 */
818  172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215, /* 192 */
819  123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245, /* 208 */
820  125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255, /* 224 */
821   92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213, /* 240 */
822   48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159  /* 256 */
823};
824
825
826static int ibm1047_to_ebcdic_us_table[] = {
827    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 16 */
828   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */
829   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */
830   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */
831   64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 75, 76, 77, 78, 79, /* 80 */
832   80, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, /* 96 */
833   96, 97, -1, -1, -1, -1, -1, -1, -1, -1,106,107,108,109,110,111, /* 112 */
834   -1, -1, -1, -1, -1, -1, -1, -1, -1,121,122,123,124,125,126,127, /* 128 */
835   -1,129,130,131,132,133,134,135,136,137, -1, -1, -1, -1, -1, -1, /* 144 */
836   -1,145,146,147,148,149,150,151,152,153, -1, -1, -1, -1, -1, -1, /* 160 */
837   -1,161,162,163,164,165,166,167,168,169, -1, -1, -1, -1, -1, -1, /* 176 */
838   95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */
839  192,193,194,195,196,197,198,199,200,201, -1, -1, -1, -1, -1, -1, /* 208 */
840  208,209,210,211,212,213,214,215,216,217, -1, -1, -1, -1, -1, -1, /* 224 */
841  224, -1,226,227,228,229,230,231,232,233, -1, -1, -1, -1, -1, -1, /* 240 */
842  240,241,242,243,244,245,246,247,248,249, -1, -1, -1, -1, -1,255  /* 256 */
843};
844
845
846static int
847table_convert_char (void *baton, int from, int *to)
848{
849  int *table = (int *) baton;
850
851  if (0 <= from && from <= 255
852      && table[from] != -1)
853    {
854      *to = table[from];
855      return 1;
856    }
857  else
858    return 0;
859}
860
861
862static struct translation *
863table_translation (const char *from, const char *to, int *table,
864                   const char *(*c_target_char_has_backslash_escape)
865                   (void *baton, int target_char),
866                   void *c_target_char_has_backslash_escape_baton,
867                   int (*c_parse_backslash) (void *baton,
868                                             int host_char,
869                                             int *target_char),
870                   void *c_parse_backslash_baton)
871{
872  struct translation *t = xmalloc (sizeof (*t));
873
874  memset (t, 0, sizeof (*t));
875  t->from = from;
876  t->to = to;
877  t->c_target_char_has_backslash_escape = c_target_char_has_backslash_escape;
878  t->c_target_char_has_backslash_escape_baton
879    = c_target_char_has_backslash_escape_baton;
880  t->c_parse_backslash = c_parse_backslash;
881  t->c_parse_backslash_baton = c_parse_backslash_baton;
882  t->convert_char = table_convert_char;
883  t->convert_char_baton = (void *) table;
884
885  return t;
886}
887
888
889static struct translation *
890simple_table_translation (const char *from, const char *to, int *table)
891{
892  return table_translation (from, to, table, 0, 0, 0, 0);
893}
894
895
896
897/* Setting and retrieving the host and target charsets.  */
898
899
900/* The current host and target character sets.  */
901static struct charset *current_host_charset, *current_target_charset;
902
903/* The current functions and batons we should use for the functions in
904   charset.h.  */
905
906static const char *(*c_target_char_has_backslash_escape_func)
907     (void *baton, int target_char);
908static void *c_target_char_has_backslash_escape_baton;
909
910static int (*c_parse_backslash_func) (void *baton,
911                                      int host_char,
912                                      int *target_char);
913static void *c_parse_backslash_baton;
914
915static int (*host_char_to_target_func) (void *baton,
916                                        int host_char,
917                                        int *target_char);
918static void *host_char_to_target_baton;
919
920static int (*target_char_to_host_func) (void *baton,
921                                        int target_char,
922                                        int *host_char);
923static void *target_char_to_host_baton;
924
925
926/* Cached iconv conversions, that might be useful to fallback
927   routines.  */
928static struct cached_iconv cached_iconv_host_to_target;
929static struct cached_iconv cached_iconv_target_to_host;
930
931
932/* Charset structures manipulation functions.  */
933
934static struct charset *
935lookup_charset_or_error (const char *name)
936{
937  struct charset *cs = lookup_charset (name);
938
939  if (! cs)
940    error (_("GDB doesn't know of any character set named `%s'."), name);
941
942  return cs;
943}
944
945static void
946check_valid_host_charset (struct charset *cs)
947{
948  if (! cs->valid_host_charset)
949    error (_("GDB can't use `%s' as its host character set."), cs->name);
950}
951
952/* Set the host and target character sets to HOST and TARGET.  */
953static void
954set_host_and_target_charsets (struct charset *host, struct charset *target)
955{
956  struct translation *h2t, *t2h;
957
958  /* If they're not both initialized yet, then just do nothing for
959     now.  As soon as we're done running our initialize function,
960     everything will be initialized.  */
961  if (! host || ! target)
962    {
963      current_host_charset = host;
964      current_target_charset = target;
965      return;
966    }
967
968  h2t = lookup_translation (host->name, target->name);
969  t2h = lookup_translation (target->name, host->name);
970
971  /* If the translations don't provide conversion functions, make sure
972     iconv can back them up.  Do this *before* modifying any state.  */
973  if (host != target)
974    {
975      if (! h2t || ! h2t->convert_char)
976        {
977          if (check_iconv_cache (&cached_iconv_host_to_target, host, target)
978              < 0)
979            error (_("GDB can't convert from the `%s' character set to `%s'."),
980                   host->name, target->name);
981        }
982      if (! t2h || ! t2h->convert_char)
983        {
984          if (check_iconv_cache (&cached_iconv_target_to_host, target, host)
985              < 0)
986            error (_("GDB can't convert from the `%s' character set to `%s'."),
987                   target->name, host->name);
988        }
989    }
990
991  if (t2h && t2h->c_target_char_has_backslash_escape)
992    {
993      c_target_char_has_backslash_escape_func
994        = t2h->c_target_char_has_backslash_escape;
995      c_target_char_has_backslash_escape_baton
996        = t2h->c_target_char_has_backslash_escape_baton;
997    }
998  else
999    c_target_char_has_backslash_escape_func
1000      = default_c_target_char_has_backslash_escape;
1001
1002  if (h2t && h2t->c_parse_backslash)
1003    {
1004      c_parse_backslash_func = h2t->c_parse_backslash;
1005      c_parse_backslash_baton = h2t->c_parse_backslash_baton;
1006    }
1007  else
1008    c_parse_backslash_func = default_c_parse_backslash;
1009
1010  if (h2t && h2t->convert_char)
1011    {
1012      host_char_to_target_func = h2t->convert_char;
1013      host_char_to_target_baton = h2t->convert_char_baton;
1014    }
1015  else if (host == target)
1016    host_char_to_target_func = identity_either_char_to_other;
1017  else
1018    {
1019      host_char_to_target_func = iconv_convert;
1020      host_char_to_target_baton = &cached_iconv_host_to_target;
1021    }
1022
1023  if (t2h && t2h->convert_char)
1024    {
1025      target_char_to_host_func = t2h->convert_char;
1026      target_char_to_host_baton = t2h->convert_char_baton;
1027    }
1028  else if (host == target)
1029    target_char_to_host_func = identity_either_char_to_other;
1030  else
1031    {
1032      target_char_to_host_func = iconv_convert;
1033      target_char_to_host_baton = &cached_iconv_target_to_host;
1034    }
1035
1036  current_host_charset = host;
1037  current_target_charset = target;
1038}
1039
1040/* Do the real work of setting the host charset.  */
1041static void
1042set_host_charset (const char *charset)
1043{
1044  struct charset *cs = lookup_charset_or_error (charset);
1045  check_valid_host_charset (cs);
1046  set_host_and_target_charsets (cs, current_target_charset);
1047}
1048
1049/* Do the real work of setting the target charset.  */
1050static void
1051set_target_charset (const char *charset)
1052{
1053  struct charset *cs = lookup_charset_or_error (charset);
1054
1055  set_host_and_target_charsets (current_host_charset, cs);
1056}
1057
1058
1059/* 'Set charset', 'set host-charset', 'set target-charset', 'show
1060   charset' sfunc's.  */
1061
1062/* This is the sfunc for the 'set charset' command.  */
1063static void
1064set_charset_sfunc (char *charset, int from_tty, struct cmd_list_element *c)
1065{
1066  struct charset *cs = lookup_charset_or_error (host_charset_name);
1067  check_valid_host_charset (cs);
1068  /* CAREFUL: set the target charset here as well. */
1069  target_charset_name = host_charset_name;
1070  set_host_and_target_charsets (cs, cs);
1071}
1072
1073/* 'set host-charset' command sfunc.  We need a wrapper here because
1074   the function needs to have a specific signature.  */
1075static void
1076set_host_charset_sfunc (char *charset, int from_tty,
1077			  struct cmd_list_element *c)
1078{
1079  set_host_charset (host_charset_name);
1080}
1081
1082/* Wrapper for the 'set target-charset' command.  */
1083static void
1084set_target_charset_sfunc (char *charset, int from_tty,
1085			    struct cmd_list_element *c)
1086{
1087  set_target_charset (target_charset_name);
1088}
1089
1090/* sfunc for the 'show charset' command.  */
1091static void
1092show_charset (struct ui_file *file, int from_tty, struct cmd_list_element *c,
1093	      const char *name)
1094{
1095  if (current_host_charset == current_target_charset)
1096    fprintf_filtered (file,
1097		      _("The current host and target character set is `%s'.\n"),
1098		      host_charset ());
1099  else
1100    {
1101      fprintf_filtered (file, _("The current host character set is `%s'.\n"),
1102			host_charset ());
1103      fprintf_filtered (file, _("The current target character set is `%s'.\n"),
1104			target_charset ());
1105    }
1106}
1107
1108
1109/* Accessor functions.  */
1110
1111const char *
1112host_charset (void)
1113{
1114  return current_host_charset->name;
1115}
1116
1117const char *
1118target_charset (void)
1119{
1120  return current_target_charset->name;
1121}
1122
1123
1124
1125/* Public character management functions.  */
1126
1127
1128const char *
1129c_target_char_has_backslash_escape (int target_char)
1130{
1131  return ((*c_target_char_has_backslash_escape_func)
1132          (c_target_char_has_backslash_escape_baton, target_char));
1133}
1134
1135
1136int
1137c_parse_backslash (int host_char, int *target_char)
1138{
1139  return (*c_parse_backslash_func) (c_parse_backslash_baton,
1140                                    host_char, target_char);
1141}
1142
1143
1144int
1145host_char_print_literally (int host_char)
1146{
1147  return ((*current_host_charset->host_char_print_literally)
1148          (current_host_charset->host_char_print_literally_baton,
1149           host_char));
1150}
1151
1152
1153int
1154target_char_to_control_char (int target_char, int *target_ctrl_char)
1155{
1156  return ((*current_target_charset->target_char_to_control_char)
1157          (current_target_charset->target_char_to_control_char_baton,
1158           target_char, target_ctrl_char));
1159}
1160
1161
1162int
1163host_char_to_target (int host_char, int *target_char)
1164{
1165  return ((*host_char_to_target_func)
1166          (host_char_to_target_baton, host_char, target_char));
1167}
1168
1169
1170int
1171target_char_to_host (int target_char, int *host_char)
1172{
1173  return ((*target_char_to_host_func)
1174          (target_char_to_host_baton, target_char, host_char));
1175}
1176
1177
1178
1179/* The charset.c module initialization function.  */
1180
1181extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */
1182
1183void
1184_initialize_charset (void)
1185{
1186  struct cmd_list_element *new_cmd;
1187
1188  /* Register all the character set GDB knows about.
1189
1190     You should use the same names that iconv does, where possible, to
1191     take advantage of the iconv-based default behaviors.
1192
1193     CAUTION: if you register a character set, you must also register
1194     as many translations as are necessary to make that character set
1195     interoperate correctly with all the other character sets.  We do
1196     provide default behaviors when no translation is available, or
1197     when a translation's function pointer for a particular operation
1198     is zero.  Hopefully, these defaults will be correct often enough
1199     that we won't need to provide too many translations.  */
1200  register_charset (simple_charset ("ASCII", 1,
1201                                    ascii_print_literally, 0,
1202                                    ascii_to_control, 0));
1203  register_charset (iso_8859_family_charset ("ISO-8859-1"));
1204  register_charset (ebcdic_family_charset ("EBCDIC-US"));
1205  register_charset (ebcdic_family_charset ("IBM1047"));
1206  register_iconv_charsets ();
1207
1208  {
1209    struct { char *from; char *to; int *table; } tlist[] = {
1210      { "ASCII",      "ISO-8859-1", ascii_to_iso_8859_1_table },
1211      { "ASCII",      "EBCDIC-US",  ascii_to_ebcdic_us_table },
1212      { "ASCII",      "IBM1047",    ascii_to_ibm1047_table },
1213      { "ISO-8859-1", "ASCII",      iso_8859_1_to_ascii_table },
1214      { "ISO-8859-1", "EBCDIC-US",  iso_8859_1_to_ebcdic_us_table },
1215      { "ISO-8859-1", "IBM1047",    iso_8859_1_to_ibm1047_table },
1216      { "EBCDIC-US",  "ASCII",      ebcdic_us_to_ascii_table },
1217      { "EBCDIC-US",  "ISO-8859-1", ebcdic_us_to_iso_8859_1_table },
1218      { "EBCDIC-US",  "IBM1047",    ebcdic_us_to_ibm1047_table },
1219      { "IBM1047",    "ASCII",      ibm1047_to_ascii_table },
1220      { "IBM1047",    "ISO-8859-1", ibm1047_to_iso_8859_1_table },
1221      { "IBM1047",    "EBCDIC-US",  ibm1047_to_ebcdic_us_table }
1222    };
1223
1224    int i;
1225
1226    for (i = 0; i < (sizeof (tlist) / sizeof (tlist[0])); i++)
1227      register_translation (simple_table_translation (tlist[i].from,
1228                                                      tlist[i].to,
1229                                                      tlist[i].table));
1230  }
1231
1232  set_host_charset (host_charset_name);
1233  set_target_charset (target_charset_name);
1234
1235  add_setshow_enum_cmd ("charset", class_support,
1236			host_charset_enum, &host_charset_name, _("\
1237Set the host and target character sets."), _("\
1238Show the host and target character sets."), _("\
1239The `host character set' is the one used by the system GDB is running on.\n\
1240The `target character set' is the one used by the program being debugged.\n\
1241You may only use supersets of ASCII for your host character set; GDB does\n\
1242not support any others.\n\
1243To see a list of the character sets GDB supports, type `set charset <TAB>'."),
1244			/* Note that the sfunc below needs to set
1245			   target_charset_name, because the 'set
1246			   charset' command sets two variables.  */
1247			set_charset_sfunc,
1248			show_charset,
1249			&setlist, &showlist);
1250
1251  add_setshow_enum_cmd ("host-charset", class_support,
1252			host_charset_enum, &host_charset_name, _("\
1253Set the host character set."), _("\
1254Show the host character set."), _("\
1255The `host character set' is the one used by the system GDB is running on.\n\
1256You may only use supersets of ASCII for your host character set; GDB does\n\
1257not support any others.\n\
1258To see a list of the character sets GDB supports, type `set host-charset <TAB>'."),
1259			set_host_charset_sfunc,
1260			show_host_charset_name,
1261			&setlist, &showlist);
1262
1263  add_setshow_enum_cmd ("target-charset", class_support,
1264			target_charset_enum, &target_charset_name, _("\
1265Set the target character set."), _("\
1266Show the target character set."), _("\
1267The `target character set' is the one used by the program being debugged.\n\
1268GDB translates characters and strings between the host and target\n\
1269character sets as needed.\n\
1270To see a list of the character sets GDB supports, type `set target-charset'<TAB>"),
1271			set_target_charset_sfunc,
1272			show_target_charset_name,
1273			&setlist, &showlist);
1274}
1275