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