Use c-ctype.h (not safe-ctype.h) in gdb

This changes gdb and related programs to use the gnulib c-ctype code
rather than safe-ctype.h.  The gdb-safe-ctype.h header is removed.

This changes common-defs.h to include the c-ctype header, making it
available everywhere in gdb.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33217
Approved-By: Simon Marchi <simon.marchi@efficios.com>
This commit is contained in:
Tom Tromey
2025-08-04 09:58:43 -06:00
parent 50673a4629
commit 15e11aac9c
23 changed files with 78 additions and 140 deletions

View File

@@ -2029,13 +2029,13 @@ parse_number (struct parser_state *par_state,
len -= 2; len -= 2;
} }
/* Handle suffixes: 'f' for float, 'l' for long double. */ /* Handle suffixes: 'f' for float, 'l' for long double. */
else if (len >= 1 && TOLOWER (buf[len - 1]) == 'f') else if (len >= 1 && c_tolower (buf[len - 1]) == 'f')
{ {
putithere->typed_val_float.type putithere->typed_val_float.type
= parse_type (par_state)->builtin_float; = parse_type (par_state)->builtin_float;
len -= 1; len -= 1;
} }
else if (len >= 1 && TOLOWER (buf[len - 1]) == 'l') else if (len >= 1 && c_tolower (buf[len - 1]) == 'l')
{ {
putithere->typed_val_float.type putithere->typed_val_float.type
= parse_type (par_state)->builtin_long_double; = parse_type (par_state)->builtin_long_double;
@@ -2241,9 +2241,9 @@ c_parse_escape (const char **ptr, struct obstack *output)
if (output) if (output)
obstack_grow_str (output, "\\x"); obstack_grow_str (output, "\\x");
++tokptr; ++tokptr;
if (!ISXDIGIT (*tokptr)) if (!c_isxdigit (*tokptr))
error (_("\\x escape without a following hex digit")); error (_("\\x escape without a following hex digit"));
while (ISXDIGIT (*tokptr)) while (c_isxdigit (*tokptr))
{ {
if (output) if (output)
obstack_1grow (output, *tokptr); obstack_1grow (output, *tokptr);
@@ -2266,7 +2266,7 @@ c_parse_escape (const char **ptr, struct obstack *output)
if (output) if (output)
obstack_grow_str (output, "\\"); obstack_grow_str (output, "\\");
for (i = 0; for (i = 0;
i < 3 && ISDIGIT (*tokptr) && *tokptr != '8' && *tokptr != '9'; i < 3 && c_isdigit (*tokptr) && *tokptr != '8' && *tokptr != '9';
++i) ++i)
{ {
if (output) if (output)
@@ -2291,9 +2291,9 @@ c_parse_escape (const char **ptr, struct obstack *output)
obstack_1grow (output, *tokptr); obstack_1grow (output, *tokptr);
} }
++tokptr; ++tokptr;
if (!ISXDIGIT (*tokptr)) if (!c_isxdigit (*tokptr))
error (_("\\%c escape without a following hex digit"), c); error (_("\\%c escape without a following hex digit"), c);
for (i = 0; i < len && ISXDIGIT (*tokptr); ++i) for (i = 0; i < len && c_isxdigit (*tokptr); ++i)
{ {
if (output) if (output)
obstack_1grow (output, *tokptr); obstack_1grow (output, *tokptr);
@@ -2878,7 +2878,7 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
size_t len = strlen ("selector"); size_t len = strlen ("selector");
if (strncmp (p, "selector", len) == 0 if (strncmp (p, "selector", len) == 0
&& (p[len] == '\0' || ISSPACE (p[len]))) && (p[len] == '\0' || c_isspace (p[len])))
{ {
pstate->lexptr = p + len; pstate->lexptr = p + len;
return SELECTOR; return SELECTOR;
@@ -2887,7 +2887,7 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
goto parse_string; goto parse_string;
} }
while (ISSPACE (*p)) while (c_isspace (*p))
p++; p++;
size_t len = strlen ("entry"); size_t len = strlen ("entry");
if (strncmp (p, "entry", len) == 0 && !c_ident_is_alnum (p[len]) if (strncmp (p, "entry", len) == 0 && !c_ident_is_alnum (p[len])

View File

@@ -408,7 +408,7 @@ convert_ucn (const char *p, const char *limit, const char *dest_charset,
gdb_byte data[4]; gdb_byte data[4];
int i; 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); result = (result << 4) + fromhex (*p);
for (i = 3; i >= 0; --i) for (i = 3; i >= 0; --i)
@@ -450,7 +450,7 @@ convert_octal (struct type *type, const char *p,
unsigned long value = 0; unsigned long value = 0;
for (i = 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) ++i)
{ {
value = 8 * value + fromhex (*p); value = 8 * value + fromhex (*p);
@@ -473,7 +473,7 @@ convert_hex (struct type *type, const char *p,
{ {
unsigned long value = 0; unsigned long value = 0;
while (p < limit && ISXDIGIT (*p)) while (p < limit && c_isxdigit (*p))
{ {
value = 16 * value + fromhex (*p); value = 16 * value + fromhex (*p);
++p; ++p;
@@ -518,7 +518,7 @@ convert_escape (struct type *type, const char *dest_charset,
case 'x': case 'x':
advance (); advance ();
if (!ISXDIGIT (*p)) if (!c_isxdigit (*p))
error (_("\\x used with no following hex digits.")); error (_("\\x used with no following hex digits."));
p = convert_hex (type, p, limit, output); p = convert_hex (type, p, limit, output);
break; break;
@@ -540,7 +540,7 @@ convert_escape (struct type *type, const char *dest_charset,
int length = *p == 'u' ? 4 : 8; int length = *p == 'u' ? 4 : 8;
advance (); advance ();
if (!ISXDIGIT (*p)) if (!c_isxdigit (*p))
error (_("\\u used with no following hex digits")); error (_("\\u used with no following hex digits"));
p = convert_ucn (p, limit, dest_charset, output, length); p = convert_ucn (p, limit, dest_charset, output, length);
} }

View File

@@ -19,9 +19,7 @@
#ifndef GDB_C_SUPPORT_H #ifndef GDB_C_SUPPORT_H
#define GDB_C_SUPPORT_H #define GDB_C_SUPPORT_H
#include "safe-ctype.h" /* Like isalpha, but also returns true for the union of all UTF-8
/* Like ISALPHA, but also returns true for the union of all UTF-8
multi-byte sequence bytes and non-ASCII characters in multi-byte sequence bytes and non-ASCII characters in
extended-ASCII charsets (e.g., Latin1). I.e., returns true if the extended-ASCII charsets (e.g., Latin1). I.e., returns true if the
high bit is set. Note that not all UTF-8 ranges are allowed in C++ high bit is set. Note that not all UTF-8 ranges are allowed in C++
@@ -32,15 +30,15 @@
static inline bool static inline bool
c_ident_is_alpha (unsigned char ch) c_ident_is_alpha (unsigned char ch)
{ {
return ISALPHA (ch) || ch >= 0x80; return c_isalpha (ch) || ch >= 0x80;
} }
/* Similarly, but Like ISALNUM. */ /* Similarly, but Like isalnum. */
static inline bool static inline bool
c_ident_is_alnum (unsigned char ch) c_ident_is_alnum (unsigned char ch)
{ {
return ISALNUM (ch) || ch >= 0x80; return c_isalnum (ch) || ch >= 0x80;
} }
#endif /* GDB_C_SUPPORT_H */ #endif /* GDB_C_SUPPORT_H */

View File

@@ -3006,7 +3006,7 @@ gdb_printable_part (char *pathname)
temp = strrchr (pathname, '/'); temp = strrchr (pathname, '/');
#if defined (__MSDOS__) #if defined (__MSDOS__)
if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') if (temp == 0 && c_isalpha (pathname[0]) && pathname[1] == ':')
temp = pathname + 1; temp = pathname + 1;
#endif #endif

View File

@@ -39,7 +39,6 @@
#include <unistd.h> #include <unistd.h>
#include "gdbsupport/gdb-safe-ctype.h"
#include "demangle.h" #include "demangle.h"
#include "cp-support.h" #include "cp-support.h"
#include "c-support.h" #include "c-support.h"
@@ -1362,7 +1361,7 @@ cpname_state::parse_number (const char *p, int len, int parsed_float,
/* See if it has `f' or `l' suffix (float or long double). */ /* See if it has `f' or `l' suffix (float or long double). */
c = TOLOWER (p[len - 1]); c = c_tolower (p[len - 1]);
if (c == 'f') if (c == 'f')
{ {
@@ -1374,7 +1373,7 @@ cpname_state::parse_number (const char *p, int len, int parsed_float,
len--; len--;
type = make_builtin_type ("long double"); type = make_builtin_type ("long double");
} }
else if (ISDIGIT (c) || c == '.') else if (c_isdigit (c) || c == '.')
type = make_builtin_type ("double"); type = make_builtin_type ("double");
else else
return ERROR; return ERROR;
@@ -1439,10 +1438,10 @@ cpname_state::parse_number (const char *p, int len, int parsed_float,
for (int off = 0; off < len; ++off) for (int off = 0; off < len; ++off)
{ {
int dig; int dig;
if (ISDIGIT (p[off])) if (c_isdigit (p[off]))
dig = p[off] - '0'; dig = p[off] - '0';
else else
dig = TOLOWER (p[off]) - 'a' + 10; dig = c_tolower (p[off]) - 'a' + 10;
if (dig >= base) if (dig >= base)
return ERROR; return ERROR;
value *= base; value *= base;
@@ -1769,7 +1768,7 @@ yylex (YYSTYPE *lvalp, cpname_state *state)
} }
/* We will take any letters or digits. parse_number will /* We will take any letters or digits. parse_number will
complain if past the radix, or if L or U are not final. */ complain if past the radix, or if L or U are not final. */
else if (! ISALNUM (*p)) else if (! c_isalnum (*p))
break; break;
if (no_tick.has_value ()) if (no_tick.has_value ())
no_tick->push_back (*p); no_tick->push_back (*p);

View File

@@ -35,7 +35,6 @@
#include "namespace.h" #include "namespace.h"
#include <signal.h> #include <signal.h>
#include "gdbsupport/gdb_setjmp.h" #include "gdbsupport/gdb_setjmp.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "gdbsupport/selftest.h" #include "gdbsupport/selftest.h"
#include "gdbsupport/gdb-sigmask.h" #include "gdbsupport/gdb-sigmask.h"
#include <atomic> #include <atomic>
@@ -105,7 +104,7 @@ static int
cp_already_canonical (const char *string) cp_already_canonical (const char *string)
{ {
/* Identifier start character [a-zA-Z_]. */ /* Identifier start character [a-zA-Z_]. */
if (!ISIDST (string[0])) if (!c_isalpha (string[0]) || string[0] == '_')
return 0; return 0;
/* These are the only two identifiers which canonicalize to other /* These are the only two identifiers which canonicalize to other
@@ -117,7 +116,7 @@ cp_already_canonical (const char *string)
return 0; return 0;
/* Identifier character [a-zA-Z0-9_]. */ /* Identifier character [a-zA-Z0-9_]. */
while (ISIDNUM (string[1])) while (c_isalpha (string[1]) || c_isdigit (string[1]) || string[1] == '_')
string++; string++;
if (string[1] == '\0') if (string[1] == '\0')
@@ -1137,7 +1136,7 @@ cp_find_first_component_aux (const char *name, int permissive)
&& startswith (name + index, CP_OPERATOR_STR)) && startswith (name + index, CP_OPERATOR_STR))
{ {
index += CP_OPERATOR_LEN; index += CP_OPERATOR_LEN;
while (ISSPACE(name[index])) while (c_isspace(name[index]))
++index; ++index;
switch (name[index]) switch (name[index])
{ {
@@ -2350,7 +2349,7 @@ find_toplevel_char (const char *s, char c)
scan += CP_OPERATOR_LEN; scan += CP_OPERATOR_LEN;
if (*scan == c) if (*scan == c)
return scan; return scan;
while (ISSPACE (*scan)) while (c_isspace (*scan))
{ {
++scan; ++scan;
if (*scan == c) if (*scan == c)

View File

@@ -25,7 +25,6 @@
#include "symtab.h" #include "symtab.h"
#include "buildsym.h" #include "buildsym.h"
#include "dictionary.h" #include "dictionary.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "gdbsupport/unordered_map.h" #include "gdbsupport/unordered_map.h"
#include "language.h" #include "language.h"
@@ -772,7 +771,7 @@ language_defn::search_name_hash (const char *string0) const
if (c == 'B' && string[3] == '_') if (c == 'B' && string[3] == '_')
{ {
for (string += 4; ISDIGIT (*string); ++string) for (string += 4; c_isdigit (*string); ++string)
; ;
continue; continue;
} }

View File

@@ -28,7 +28,6 @@
#include "cli/cli-cmds.h" #include "cli/cli-cmds.h"
#include "dis-asm.h" #include "dis-asm.h"
#include "source.h" #include "source.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include <algorithm> #include <algorithm>
#include <optional> #include <optional>
#include "valprint.h" #include "valprint.h"

View File

@@ -19,7 +19,6 @@
#include "dwarf2/cooked-index-entry.h" #include "dwarf2/cooked-index-entry.h"
#include "dwarf2/tag.h" #include "dwarf2/tag.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "gdbsupport/selftest.h" #include "gdbsupport/selftest.h"
/* See cooked-index-entry.h. */ /* See cooked-index-entry.h. */
@@ -57,7 +56,7 @@ cooked_index_entry::compare (const char *stra, const char *strb,
template functions" section in the manual. */ template functions" section in the manual. */
if (c == '<') if (c == '<')
return '\0'; return '\0';
return TOLOWER ((unsigned char) c); return c_tolower (c);
}; };
unsigned char a = munge (*stra); unsigned char a = munge (*stra);

View File

@@ -32,7 +32,6 @@
#include <ctype.h> #include <ctype.h>
#include "mi-parse.h" #include "mi-parse.h"
#include <optional> #include <optional>
#include "gdbsupport/gdb-safe-ctype.h"
#include "inferior.h" #include "inferior.h"
enum what_to_list { locals, arguments, all }; enum what_to_list { locals, arguments, all };

View File

@@ -52,7 +52,6 @@
#include "cli/cli-utils.h" #include "cli/cli-utils.h"
#include "gdbsupport/symbol.h" #include "gdbsupport/symbol.h"
#include <algorithm> #include <algorithm>
#include "gdbsupport/gdb-safe-ctype.h"
#include "gdbsupport/parallel-for.h" #include "gdbsupport/parallel-for.h"
#include "inferior.h" #include "inferior.h"

View File

@@ -195,7 +195,7 @@ unsigned int msymbol_hash_iw (const char *);
requirements. */ requirements. */
#define SYMBOL_HASH_NEXT(hash, c) \ #define SYMBOL_HASH_NEXT(hash, c) \
((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113) ((hash) * 67 + c_tolower (c) - 113)

View File

@@ -29,7 +29,6 @@
#include "gdbtypes.h" #include "gdbtypes.h"
#include "target.h" #include "target.h"
#include "regcache.h" #include "regcache.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "reggroups.h" #include "reggroups.h"
#include "arch-utils.h" #include "arch-utils.h"
#include "frame-unwind.h" #include "frame-unwind.h"

View File

@@ -54,7 +54,6 @@
#include "source.h" #include "source.h"
#include "gdbsupport/byte-vector.h" #include "gdbsupport/byte-vector.h"
#include <optional> #include <optional>
#include "gdbsupport/gdb-safe-ctype.h"
#include "inferior.h" #include "inferior.h"
/* Chain containing all defined memory-tag subcommands. */ /* Chain containing all defined memory-tag subcommands. */

View File

@@ -56,7 +56,6 @@
#include "arch/riscv.h" #include "arch/riscv.h"
#include "record-full.h" #include "record-full.h"
#include "riscv-ravenscar-thread.h" #include "riscv-ravenscar-thread.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include <vector> #include <vector>
@@ -4183,9 +4182,9 @@ riscv_print_insn (bfd_vma addr, struct disassemble_info *info)
static int static int
riscv_stap_is_single_operand (struct gdbarch *gdbarch, const char *s) riscv_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
{ {
return (ISDIGIT (*s) /* Literal number. */ return (c_isdigit (*s) /* Literal number. */
|| *s == '(' /* Register indirection. */ || *s == '(' /* Register indirection. */
|| ISALPHA (*s)); /* Register value. */ || c_isalpha (*s)); /* Register value. */
} }
/* String that appears before a register name in a SystemTap register /* String that appears before a register name in a SystemTap register

View File

@@ -37,7 +37,6 @@
#include "tui/tui-layout.h" #include "tui/tui-layout.h"
#include "tui/tui-source.h" #include "tui/tui-source.h"
#include "gdb_curses.h" #include "gdb_curses.h"
#include "gdbsupport/gdb-safe-ctype.h"
/* The layouts. */ /* The layouts. */
static std::vector<std::unique_ptr<tui_layout_split>> layouts; static std::vector<std::unique_ptr<tui_layout_split>> layouts;
@@ -381,14 +380,14 @@ tui_register_window (const char *name, window_factory &&factory)
for (const char &c : name_copy) for (const char &c : name_copy)
{ {
if (ISSPACE (c)) if (c_isspace (c))
error (_("invalid whitespace character in window name")); error (_("invalid whitespace character in window name"));
if (!ISALNUM (c) && strchr ("-_.", c) == nullptr) if (!c_isalnum (c) && strchr ("-_.", c) == nullptr)
error (_("invalid character '%c' in window name"), c); error (_("invalid character '%c' in window name"), c);
} }
if (!ISALPHA (name_copy[0])) if (!c_isalpha (name_copy[0]))
error (_("window name must start with a letter, not '%c'"), name_copy[0]); error (_("window name must start with a letter, not '%c'"), name_copy[0]);
/* We already check above for all the builtin window names. If we get /* We already check above for all the builtin window names. If we get

View File

@@ -26,7 +26,6 @@
#include "value.h" #include "value.h"
#include "source.h" #include "source.h"
#include "objfiles.h" #include "objfiles.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "tui/tui.h" #include "tui/tui.h"
#include "tui/tui-data.h" #include "tui/tui-data.h"
@@ -109,7 +108,7 @@ tui_copy_source_line (const char **ptr, int *length)
} }
else if (c == '\t') else if (c == '\t')
process_tab (); process_tab ();
else if (ISCNTRL (c)) else if (c_iscntrl (c))
{ {
result.push_back ('^'); result.push_back ('^');
result.push_back (c + 0100); result.push_back (c + 0100);

View File

@@ -75,7 +75,6 @@
#include "gdbsupport/scope-exit.h" #include "gdbsupport/scope-exit.h"
#include "gdbarch.h" #include "gdbarch.h"
#include "cli-out.h" #include "cli-out.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "bt-utils.h" #include "bt-utils.h"
#include "gdbsupport/buildargv.h" #include "gdbsupport/buildargv.h"
#include "pager.h" #include "pager.h"
@@ -1008,7 +1007,7 @@ parse_escape (struct gdbarch *gdbarch, const char **string_ptr)
while (++count < 3) while (++count < 3)
{ {
c = (**string_ptr); c = (**string_ptr);
if (ISDIGIT (c) && c != '8' && c != '9') if (c_isdigit (c) && c != '8' && c != '9')
{ {
(*string_ptr)++; (*string_ptr)++;
i *= 8; i *= 8;
@@ -2068,7 +2067,7 @@ fprintf_symbol (struct ui_file *stream, const char *name,
static bool static bool
valid_identifier_name_char (int ch) valid_identifier_name_char (int ch)
{ {
return (ISALNUM (ch) || ch == '_'); return (c_isalnum (ch) || ch == '_');
} }
/* Skip to end of token, or to END, whatever comes first. Input is /* Skip to end of token, or to END, whatever comes first. Input is
@@ -2078,7 +2077,7 @@ static const char *
cp_skip_operator_token (const char *token, const char *end) cp_skip_operator_token (const char *token, const char *end)
{ {
const char *p = token; const char *p = token;
while (p != end && !ISSPACE (*p) && *p != '(') while (p != end && !c_isspace (*p) && *p != '(')
{ {
if (valid_identifier_name_char (*p)) if (valid_identifier_name_char (*p))
{ {
@@ -2132,9 +2131,9 @@ cp_skip_operator_token (const char *token, const char *end)
static void static void
skip_ws (const char *&string1, const char *&string2, const char *end_str2) skip_ws (const char *&string1, const char *&string2, const char *end_str2)
{ {
while (ISSPACE (*string1)) while (c_isspace (*string1))
string1++; string1++;
while (string2 < end_str2 && ISSPACE (*string2)) while (string2 < end_str2 && c_isspace (*string2))
string2++; string2++;
} }
@@ -2198,7 +2197,7 @@ skip_template_parameter_list (const char **name)
/* Skip any whitespace that might occur after the closing of the /* Skip any whitespace that might occur after the closing of the
parameter list, but only if it is the end of parameter list. */ parameter list, but only if it is the end of parameter list. */
const char *q = p; const char *q = p;
while (ISSPACE (*q)) while (c_isspace (*q))
++q; ++q;
if (*q == '>') if (*q == '>')
p = q; p = q;
@@ -2230,8 +2229,8 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
while (1) while (1)
{ {
if (skip_spaces if (skip_spaces
|| ((ISSPACE (*string1) && !valid_identifier_name_char (*string2)) || ((c_isspace (*string1) && !valid_identifier_name_char (*string2))
|| (ISSPACE (*string2) && !valid_identifier_name_char (*string1)))) || (c_isspace (*string2) && !valid_identifier_name_char (*string1))))
{ {
skip_ws (string1, string2, end_str2); skip_ws (string1, string2, end_str2);
skip_spaces = false; skip_spaces = false;
@@ -2264,7 +2263,7 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
if (match_for_lcd != NULL && abi_start != string1) if (match_for_lcd != NULL && abi_start != string1)
match_for_lcd->mark_ignored_range (abi_start, string1); match_for_lcd->mark_ignored_range (abi_start, string1);
while (ISSPACE (*string1)) while (c_isspace (*string1))
string1++; string1++;
} }
@@ -2331,9 +2330,9 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
string1++; string1++;
string2++; string2++;
while (ISSPACE (*string1)) while (c_isspace (*string1))
string1++; string1++;
while (string2 < end_str2 && ISSPACE (*string2)) while (string2 < end_str2 && c_isspace (*string2))
string2++; string2++;
continue; continue;
} }
@@ -2433,14 +2432,13 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
if (case_sensitivity == case_sensitive_on && *string1 != *string2) if (case_sensitivity == case_sensitive_on && *string1 != *string2)
break; break;
if (case_sensitivity == case_sensitive_off if (case_sensitivity == case_sensitive_off
&& (TOLOWER ((unsigned char) *string1) && c_tolower (*string1) != c_tolower (*string2))
!= TOLOWER ((unsigned char) *string2)))
break; break;
/* If we see any non-whitespace, non-identifier-name character /* If we see any non-whitespace, non-identifier-name character
(any of "()<>*&" etc.), then skip spaces the next time (any of "()<>*&" etc.), then skip spaces the next time
around. */ around. */
if (!ISSPACE (*string1) && !valid_identifier_name_char (*string1)) if (!c_isspace (*string1) && !valid_identifier_name_char (*string1))
skip_spaces = true; skip_spaces = true;
string1++; string1++;
@@ -3153,16 +3151,16 @@ strcmp_iw_ordered (const char *string1, const char *string2)
while (*string1 != '\0' && *string2 != '\0') while (*string1 != '\0' && *string2 != '\0')
{ {
while (ISSPACE (*string1)) while (c_isspace (*string1))
string1++; string1++;
while (ISSPACE (*string2)) while (c_isspace (*string2))
string2++; string2++;
switch (case_pass) switch (case_pass)
{ {
case case_sensitive_off: case case_sensitive_off:
c1 = TOLOWER ((unsigned char) *string1); c1 = c_tolower (*string1);
c2 = TOLOWER ((unsigned char) *string2); c2 = c_tolower (*string2);
break; break;
case case_sensitive_on: case case_sensitive_on:
c1 = *string1; c1 = *string1;
@@ -3271,17 +3269,17 @@ string_to_core_addr (const char *my_string)
{ {
CORE_ADDR addr = 0; CORE_ADDR addr = 0;
if (my_string[0] == '0' && TOLOWER (my_string[1]) == 'x') if (my_string[0] == '0' && c_tolower (my_string[1]) == 'x')
{ {
/* Assume that it is in hex. */ /* Assume that it is in hex. */
int i; int i;
for (i = 2; my_string[i] != '\0'; i++) for (i = 2; my_string[i] != '\0'; i++)
{ {
if (ISDIGIT (my_string[i])) if (c_isdigit (my_string[i]))
addr = (my_string[i] - '0') + (addr * 16); addr = (my_string[i] - '0') + (addr * 16);
else if (ISXDIGIT (my_string[i])) else if (c_isxdigit (my_string[i]))
addr = (TOLOWER (my_string[i]) - 'a' + 0xa) + (addr * 16); addr = (c_tolower (my_string[i]) - 'a' + 0xa) + (addr * 16);
else else
error (_("invalid hex \"%s\""), my_string); error (_("invalid hex \"%s\""), my_string);
} }
@@ -3293,7 +3291,7 @@ string_to_core_addr (const char *my_string)
for (i = 0; my_string[i] != '\0'; i++) for (i = 0; my_string[i] != '\0'; i++)
{ {
if (ISDIGIT (my_string[i])) if (c_isdigit (my_string[i]))
addr = (my_string[i] - '0') + (addr * 10); addr = (my_string[i] - '0') + (addr * 10);
else else
error (_("invalid decimal \"%s\""), my_string); error (_("invalid decimal \"%s\""), my_string);

View File

@@ -21,7 +21,6 @@
#include "xml-builtin.h" #include "xml-builtin.h"
#include "xml-support.h" #include "xml-support.h"
#include "gdbsupport/filestuff.h" #include "gdbsupport/filestuff.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include <vector> #include <vector>
#include <string> #include <string>
@@ -430,10 +429,10 @@ gdb_xml_parser::end_element (const XML_Char *name)
body = scope->body.c_str (); body = scope->body.c_str ();
/* Strip leading and trailing whitespace. */ /* Strip leading and trailing whitespace. */
while (length > 0 && ISSPACE (body[length - 1])) while (length > 0 && c_isspace (body[length - 1]))
length--; length--;
scope->body.erase (length); scope->body.erase (length);
while (*body && ISSPACE (*body)) while (*body && c_isspace (*body))
body++; body++;
} }

View File

@@ -46,7 +46,6 @@
#include <langinfo.h> #include <langinfo.h>
#include <iconv.h> #include <iconv.h>
#include "gdbsupport/filestuff.h" #include "gdbsupport/filestuff.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "tracepoint.h" #include "tracepoint.h"
#include <inttypes.h> #include <inttypes.h>
#include "gdbsupport/common-inferior.h" #include "gdbsupport/common-inferior.h"
@@ -7012,7 +7011,7 @@ replace_non_ascii (char *dest, const char *name)
const char *result = dest; const char *result = dest;
while (*name != '\0') while (*name != '\0')
{ {
if (!ISPRINT (*name)) if (!c_isprint (*name))
*dest++ = '?'; *dest++ = '?';
else else
*dest++ = *name; *dest++ = *name;

View File

@@ -222,6 +222,12 @@
/* Pull in gdb::unique_xmalloc_ptr. */ /* Pull in gdb::unique_xmalloc_ptr. */
#include "gdbsupport/gdb_unique_ptr.h" #include "gdbsupport/gdb_unique_ptr.h"
/* Note that there's no simple way to enforce the use of the c-ctype
functions. We can't poison the <ctype.h> functions (see
safe-ctype.h) because that will provoke errors from libstdc++
headers. */
#include "c-ctype.h"
/* sbrk on macOS is not useful for our purposes, since sbrk(0) always /* sbrk on macOS is not useful for our purposes, since sbrk(0) always
returns the same value. brk/sbrk on macOS is just an emulation returns the same value. brk/sbrk on macOS is just an emulation
that always returns a pointer to a 4MB section reserved for that always returns a pointer to a 4MB section reserved for

View File

@@ -19,7 +19,6 @@
#include "common-utils.h" #include "common-utils.h"
#include "host-defs.h" #include "host-defs.h"
#include "gdbsupport/gdb-safe-ctype.h"
#include "gdbsupport/gdb-xfree.h" #include "gdbsupport/gdb-xfree.h"
void * void *
@@ -180,7 +179,7 @@ extract_string_maybe_quoted (const char **arg)
/* Parse p similarly to gdb_argv buildargv function. */ /* Parse p similarly to gdb_argv buildargv function. */
while (*p != '\0') while (*p != '\0')
{ {
if (ISSPACE (*p) && !squote && !dquote && !bsquote) if (c_isspace (*p) && !squote && !dquote && !bsquote)
break; break;
else else
{ {
@@ -254,21 +253,21 @@ make_quoted_string (const char *str)
static int static int
is_digit_in_base (unsigned char digit, int base) is_digit_in_base (unsigned char digit, int base)
{ {
if (!ISALNUM (digit)) if (!c_isalnum (digit))
return 0; return 0;
if (base <= 10) if (base <= 10)
return (ISDIGIT (digit) && digit < base + '0'); return (c_isdigit (digit) && digit < base + '0');
else else
return (ISDIGIT (digit) || TOLOWER (digit) < base - 10 + 'a'); return (c_isdigit (digit) || c_tolower (digit) < base - 10 + 'a');
} }
static int static int
digit_to_int (unsigned char c) digit_to_int (unsigned char c)
{ {
if (ISDIGIT (c)) if (c_isdigit (c))
return c - '0'; return c - '0';
else else
return TOLOWER (c) - 'a' + 10; return c_tolower (c) - 'a' + 10;
} }
/* As for strtoul, but for ULONGEST results. */ /* As for strtoul, but for ULONGEST results. */
@@ -282,7 +281,7 @@ strtoulst (const char *num, const char **trailer, int base)
int i = 0; int i = 0;
/* Skip leading whitespace. */ /* Skip leading whitespace. */
while (ISSPACE (num[i])) while (c_isspace (num[i]))
i++; i++;
/* Handle prefixes. */ /* Handle prefixes. */
@@ -349,7 +348,7 @@ skip_spaces (char *chp)
{ {
if (chp == NULL) if (chp == NULL)
return NULL; return NULL;
while (*chp && ISSPACE (*chp)) while (*chp && c_isspace (*chp))
chp++; chp++;
return chp; return chp;
} }
@@ -361,7 +360,7 @@ skip_spaces (const char *chp)
{ {
if (chp == NULL) if (chp == NULL)
return NULL; return NULL;
while (*chp && ISSPACE (*chp)) while (*chp && c_isspace (*chp))
chp++; chp++;
return chp; return chp;
} }
@@ -373,7 +372,7 @@ skip_to_space (const char *chp)
{ {
if (chp == NULL) if (chp == NULL)
return NULL; return NULL;
while (*chp && !ISSPACE (*chp)) while (*chp && !c_isspace (*chp))
chp++; chp++;
return chp; return chp;
} }

View File

@@ -1,49 +0,0 @@
/* Wrapper around libiberty's safe-ctype.h for GDB, the GNU debugger.
Copyright (C) 2019-2025 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef GDBSUPPORT_GDB_SAFE_CTYPE_H
#define GDBSUPPORT_GDB_SAFE_CTYPE_H
/* After safe-ctype.h is included, we can no longer use the host's
ctype routines. Trying to do so results in compile errors. Code
that uses safe-ctype.h that wants to refer to the locale-dependent
ctype functions must call these wrapper versions instead.
When compiling in C++ mode, also include <locale> before "safe-ctype.h"
which also defines is* functions. */
static inline int
gdb_isprint (int ch)
{
return isprint (ch);
}
/* readline.h defines these symbols too, but we want libiberty's
versions. */
#undef ISALPHA
#undef ISALNUM
#undef ISDIGIT
#undef ISLOWER
#undef ISPRINT
#undef ISUPPER
#undef ISXDIGIT
#include <locale>
#include "safe-ctype.h"
#endif /* GDBSUPPORT_GDB_SAFE_CTYPE_H */