Support UTF-8 identifiers in C/C++ expressions (PR gdb/22973)
Factor out cp_ident_is_alpha/cp_ident_is_alnum out of gdb/cp-name-parser.y and use it in the C/C++ expression parser too. New test included. gdb/ChangeLog: 2018-05-22 Pedro Alves <palves@redhat.com> 張俊芝 <zjz@zjz.name> PR gdb/22973 * c-exp.y: Include "c-support.h". (parse_number, c_parse_escape, lex_one_token): Use TOLOWER instead of tolower. Use c_ident_is_alpha to scan names. * c-lang.c: Include "c-support.h". (convert_ucn, convert_octal, convert_hex, convert_escape): Use ISXDIGIT instead of isxdigit and ISDIGIT instead of isdigit. * c-support.h: New file, with bits factored out from ... * cp-name-parser.y: ... this file. Include "c-support.h". (cp_ident_is_alpha, cp_ident_is_alnum): Deleted, moved to c-support.h and renamed. (symbol_end, yylex): Adjust. gdb/testsuite/ChangeLog: 2018-05-22 Pedro Alves <palves@redhat.com> PR gdb/22973 * gdb.base/utf8-identifiers.c: New file. * gdb.base/utf8-identifiers.exp: New file.
This commit is contained in:
parent
0ec848ad25
commit
b1b60145ae
8 changed files with 240 additions and 44 deletions
11
gdb/c-lang.c
11
gdb/c-lang.c
|
@ -25,6 +25,7 @@
|
|||
#include "language.h"
|
||||
#include "varobj.h"
|
||||
#include "c-lang.h"
|
||||
#include "c-support.h"
|
||||
#include "valprint.h"
|
||||
#include "macroscope.h"
|
||||
#include "charset.h"
|
||||
|
@ -382,7 +383,7 @@ convert_ucn (char *p, 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 && ISXDIGIT (*p); ++i, ++p)
|
||||
result = (result << 4) + host_hex_value (*p);
|
||||
|
||||
for (i = 3; i >= 0; --i)
|
||||
|
@ -424,7 +425,7 @@ convert_octal (struct type *type, char *p,
|
|||
unsigned long value = 0;
|
||||
|
||||
for (i = 0;
|
||||
i < 3 && p < limit && isdigit (*p) && *p != '8' && *p != '9';
|
||||
i < 3 && p < limit && ISDIGIT (*p) && *p != '8' && *p != '9';
|
||||
++i)
|
||||
{
|
||||
value = 8 * value + host_hex_value (*p);
|
||||
|
@ -447,7 +448,7 @@ convert_hex (struct type *type, char *p,
|
|||
{
|
||||
unsigned long value = 0;
|
||||
|
||||
while (p < limit && isxdigit (*p))
|
||||
while (p < limit && ISXDIGIT (*p))
|
||||
{
|
||||
value = 16 * value + host_hex_value (*p);
|
||||
++p;
|
||||
|
@ -488,7 +489,7 @@ convert_escape (struct type *type, const char *dest_charset,
|
|||
|
||||
case 'x':
|
||||
ADVANCE;
|
||||
if (!isxdigit (*p))
|
||||
if (!ISXDIGIT (*p))
|
||||
error (_("\\x used with no following hex digits."));
|
||||
p = convert_hex (type, p, limit, output);
|
||||
break;
|
||||
|
@ -510,7 +511,7 @@ convert_escape (struct type *type, const char *dest_charset,
|
|||
int length = *p == 'u' ? 4 : 8;
|
||||
|
||||
ADVANCE;
|
||||
if (!isxdigit (*p))
|
||||
if (!ISXDIGIT (*p))
|
||||
error (_("\\u used with no following hex digits"));
|
||||
p = convert_ucn (p, limit, dest_charset, output, length);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue