Add support for distinct host and target character sets.

This commit is contained in:
Kevin Buettner 2002-09-20 00:24:01 +00:00
parent bb7eb0390b
commit 234b45d446
11 changed files with 2265 additions and 485 deletions

View file

@ -29,6 +29,7 @@
#include "valprint.h"
#include "macroscope.h"
#include "gdb_assert.h"
#include "charset.h"
extern void _initialize_c_language (void);
static void c_emit_char (int c, struct ui_file * stream, int quoter);
@ -40,55 +41,30 @@ static void c_emit_char (int c, struct ui_file * stream, int quoter);
static void
c_emit_char (register int c, struct ui_file *stream, int quoter)
{
const char *escape;
int host_char;
c &= 0xFF; /* Avoid sign bit follies */
if (PRINT_LITERAL_FORM (c))
escape = c_target_char_has_backslash_escape (c);
if (escape)
{
if (c == '\\' || c == quoter)
{
fputs_filtered ("\\", stream);
}
fprintf_filtered (stream, "%c", c);
if (quoter == '"' && strcmp (escape, "0") == 0)
/* Print nulls embedded in double quoted strings as \000 to
prevent ambiguity. */
fprintf_filtered (stream, "\\000");
else
fprintf_filtered (stream, "\\%s", escape);
}
else if (target_char_to_host (c, &host_char)
&& host_char_print_literally (host_char))
{
if (host_char == '\\' || host_char == quoter)
fputs_filtered ("\\", stream);
fprintf_filtered (stream, "%c", host_char);
}
else
{
switch (c)
{
case '\n':
fputs_filtered ("\\n", stream);
break;
case '\b':
fputs_filtered ("\\b", stream);
break;
case '\t':
fputs_filtered ("\\t", stream);
break;
case '\f':
fputs_filtered ("\\f", stream);
break;
case '\r':
fputs_filtered ("\\r", stream);
break;
case '\013':
fputs_filtered ("\\v", stream);
break;
case '\033':
fputs_filtered ("\\e", stream);
break;
case '\007':
fputs_filtered ("\\a", stream);
break;
case '\0':
if (quoter == '\'')
fputs_filtered ("\\0", stream);
else
fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
break;
default:
fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
break;
}
}
fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
}
void