X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/a741e51424146833ac061a903fb85132505e7ea5..ebc7896c3ce2248ea34b8c3f162ac590126840d5:/gdb/c-lang.c diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 9c30483eff..e492b9a205 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -29,6 +29,9 @@ #include "valprint.h" #include "macroscope.h" #include "gdb_assert.h" +#include "charset.h" +#include "gdb_string.h" +#include "demangle.h" extern void _initialize_c_language (void); static void c_emit_char (int c, struct ui_file * stream, int quoter); @@ -40,55 +43,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 + else if (target_char_to_host (c, &host_char) + && host_char_print_literally (host_char)) { - 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; - } + if (host_char == '\\' || host_char == quoter) + fputs_filtered ("\\", stream); + fprintf_filtered (stream, "%c", host_char); } + else + fprintf_filtered (stream, "\\%.3o", (unsigned int) c); } void @@ -575,6 +553,8 @@ const struct language_defn c_language_defn = c_print_type, /* Print a type using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ + NULL, /* Language specific skip_trampoline */ + NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -627,6 +607,8 @@ const struct language_defn cplus_language_defn = c_print_type, /* Print a type using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ + NULL, /* Language specific skip_trampoline */ + cplus_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -656,6 +638,8 @@ const struct language_defn asm_language_defn = c_print_type, /* Print a type using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ + NULL, /* Language specific skip_trampoline */ + NULL, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */