diff options
Diffstat (limited to 'gdb/c-lang.c')
-rw-r--r-- | gdb/c-lang.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/gdb/c-lang.c b/gdb/c-lang.c index f052401..e8e66a6 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -33,7 +33,6 @@ #include "cp-abi.h" #include "cp-support.h" #include "gdbsupport/gdb_obstack.h" -#include <ctype.h> #include "gdbcore.h" #include "gdbarch.h" #include "c-exp.h" @@ -408,7 +407,7 @@ convert_ucn (const char *p, const char *limit, const char *dest_charset, gdb_byte data[4]; int i; - for (i = 0; i < length && p < limit && ISXDIGIT (*p); ++i, ++p) + for (i = 0; i < length && p < limit && c_isxdigit (*p); ++i, ++p) result = (result << 4) + fromhex (*p); for (i = 3; i >= 0; --i) @@ -450,7 +449,7 @@ convert_octal (struct type *type, const char *p, unsigned long value = 0; for (i = 0; - i < 3 && p < limit && ISDIGIT (*p) && *p != '8' && *p != '9'; + i < 3 && p < limit && c_isdigit (*p) && *p != '8' && *p != '9'; ++i) { value = 8 * value + fromhex (*p); @@ -473,7 +472,7 @@ convert_hex (struct type *type, const char *p, { unsigned long value = 0; - while (p < limit && ISXDIGIT (*p)) + while (p < limit && c_isxdigit (*p)) { value = 16 * value + fromhex (*p); ++p; @@ -484,13 +483,6 @@ convert_hex (struct type *type, const char *p, return p; } -#define ADVANCE \ - do { \ - ++p; \ - if (p == limit) \ - error (_("Malformed escape sequence")); \ - } while (0) - /* Convert an escape sequence to a target format. TYPE is the target character type to use, and DEST_CHARSET is the name of the target character set. The backslash of the escape sequence is at *P, and @@ -502,19 +494,30 @@ static const char * convert_escape (struct type *type, const char *dest_charset, const char *p, const char *limit, struct obstack *output) { + auto advance = [&] () + { + ++p; + if (p == limit) + error (_("Malformed escape sequence")); + }; + /* Skip the backslash. */ - ADVANCE; + advance (); switch (*p) { case '\\': - obstack_1grow (output, '\\'); + /* Convert the backslash itself. This is probably overkill but + it doesn't hurt to do the full conversion. */ + convert_between_encodings (host_charset (), dest_charset, + (const gdb_byte *) p, 1, 1, + output, translit_none); ++p; break; case 'x': - ADVANCE; - if (!ISXDIGIT (*p)) + advance (); + if (!c_isxdigit (*p)) error (_("\\x used with no following hex digits.")); p = convert_hex (type, p, limit, output); break; @@ -535,8 +538,8 @@ convert_escape (struct type *type, const char *dest_charset, { int length = *p == 'u' ? 4 : 8; - ADVANCE; - if (!ISXDIGIT (*p)) + advance (); + if (!c_isxdigit (*p)) error (_("\\u used with no following hex digits")); p = convert_ucn (p, limit, dest_charset, output, length); } |