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