]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Use c-ctype.h (not safe-ctype.h) in gdb
authorTom Tromey <tromey@adacore.com>
Mon, 4 Aug 2025 15:58:43 +0000 (09:58 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 9 Sep 2025 17:58:27 +0000 (11:58 -0600)
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>
23 files changed:
gdb/c-exp.y
gdb/c-lang.c
gdb/c-support.h
gdb/completer.c
gdb/cp-name-parser.y
gdb/cp-support.c
gdb/dictionary.c
gdb/disasm.c
gdb/dwarf2/cooked-index-entry.c
gdb/mi/mi-cmd-stack.c
gdb/minsyms.c
gdb/minsyms.h
gdb/or1k-tdep.c
gdb/printcmd.c
gdb/riscv-tdep.c
gdb/tui/tui-layout.c
gdb/tui/tui-winsource.c
gdb/utils.c
gdb/xml-support.c
gdbserver/linux-low.cc
gdbsupport/common-defs.h
gdbsupport/common-utils.cc
gdbsupport/gdb-safe-ctype.h [deleted file]

index 334d58a806714854c46e86dffc4c320485deff83..cd5dc268a4c0d95fb79610ed3f3c2bed430e23b8 100644 (file)
@@ -2029,13 +2029,13 @@ parse_number (struct parser_state *par_state,
          len -= 2;
        }
       /* 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
            = parse_type (par_state)->builtin_float;
          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
            = parse_type (par_state)->builtin_long_double;
@@ -2241,9 +2241,9 @@ c_parse_escape (const char **ptr, struct obstack *output)
       if (output)
        obstack_grow_str (output, "\\x");
       ++tokptr;
-      if (!ISXDIGIT (*tokptr))
+      if (!c_isxdigit (*tokptr))
        error (_("\\x escape without a following hex digit"));
-      while (ISXDIGIT (*tokptr))
+      while (c_isxdigit (*tokptr))
        {
          if (output)
            obstack_1grow (output, *tokptr);
@@ -2266,7 +2266,7 @@ c_parse_escape (const char **ptr, struct obstack *output)
        if (output)
          obstack_grow_str (output, "\\");
        for (i = 0;
-            i < 3 && ISDIGIT (*tokptr) && *tokptr != '8' && *tokptr != '9';
+            i < 3 && c_isdigit (*tokptr) && *tokptr != '8' && *tokptr != '9';
             ++i)
          {
            if (output)
@@ -2291,9 +2291,9 @@ c_parse_escape (const char **ptr, struct obstack *output)
            obstack_1grow (output, *tokptr);
          }
        ++tokptr;
-       if (!ISXDIGIT (*tokptr))
+       if (!c_isxdigit (*tokptr))
          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)
              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");
 
            if (strncmp (p, "selector", len) == 0
-               && (p[len] == '\0' || ISSPACE (p[len])))
+               && (p[len] == '\0' || c_isspace (p[len])))
              {
                pstate->lexptr = p + len;
                return SELECTOR;
@@ -2887,7 +2887,7 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
              goto parse_string;
          }
 
-       while (ISSPACE (*p))
+       while (c_isspace (*p))
          p++;
        size_t len = strlen ("entry");
        if (strncmp (p, "entry", len) == 0 && !c_ident_is_alnum (p[len])
index 9fccc1f761452cc6cb33644a28869a659ab26398..7fff11a76f75c71f569bf1583ed1c1cd9c09e48f 100644 (file)
@@ -408,7 +408,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 +450,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 +473,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;
@@ -518,7 +518,7 @@ convert_escape (struct type *type, const char *dest_charset,
 
     case 'x':
       advance ();
-      if (!ISXDIGIT (*p))
+      if (!c_isxdigit (*p))
        error (_("\\x used with no following hex digits."));
       p = convert_hex (type, p, limit, output);
       break;
@@ -540,7 +540,7 @@ convert_escape (struct type *type, const char *dest_charset,
        int length = *p == 'u' ? 4 : 8;
 
        advance ();
-       if (!ISXDIGIT (*p))
+       if (!c_isxdigit (*p))
          error (_("\\u used with no following hex digits"));
        p = convert_ucn (p, limit, dest_charset, output, length);
       }
index 47f40661a0905ebc722ef82f243ca724bb0fdf19..5fd1118e592f3b1ecbb1e5535fe430abbbec48a9 100644 (file)
@@ -19,9 +19,7 @@
 #ifndef 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
    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++
 static inline bool
 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
 c_ident_is_alnum (unsigned char ch)
 {
-  return ISALNUM (ch) || ch >= 0x80;
+  return c_isalnum (ch) || ch >= 0x80;
 }
 
 #endif /* GDB_C_SUPPORT_H */
index deecbc209f7d2308edd86ae42589ac112e717365..b919b4c4dc35c10473c7b8988881857a1cb71d20 100644 (file)
@@ -3006,7 +3006,7 @@ gdb_printable_part (char *pathname)
 
   temp = strrchr (pathname, '/');
 #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;
 #endif
 
index cafd6b2367abd73005bee62b66521e1a03c5fc7b..7221b785211d44d8407c45f75a46251caad18104 100644 (file)
@@ -39,7 +39,6 @@
 
 
 #include <unistd.h>
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "demangle.h"
 #include "cp-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).  */
 
-      c = TOLOWER (p[len - 1]);
+      c = c_tolower (p[len - 1]);
 
       if (c == 'f')
        {
@@ -1374,7 +1373,7 @@ cpname_state::parse_number (const char *p, int len, int parsed_float,
          len--;
          type = make_builtin_type ("long double");
        }
-      else if (ISDIGIT (c) || c == '.')
+      else if (c_isdigit (c) || c == '.')
        type = make_builtin_type ("double");
       else
        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)
     {
       int dig;
-      if (ISDIGIT (p[off]))
+      if (c_isdigit (p[off]))
        dig = p[off] - '0';
       else
-       dig = TOLOWER (p[off]) - 'a' + 10;
+       dig = c_tolower (p[off]) - 'a' + 10;
       if (dig >= base)
        return ERROR;
       value *= base;
@@ -1769,7 +1768,7 @@ yylex (YYSTYPE *lvalp, cpname_state *state)
              }
            /* We will take any letters or digits.  parse_number will
               complain if past the radix, or if L or U are not final.  */
-           else if (! ISALNUM (*p))
+           else if (! c_isalnum (*p))
              break;
            if (no_tick.has_value ())
              no_tick->push_back (*p);
index 7ed15eef17396c4f9f4d9cf91db6aa5e36516f8e..415217fb7d1d2106eeaa530ebd08f5982e738afa 100644 (file)
@@ -35,7 +35,6 @@
 #include "namespace.h"
 #include <signal.h>
 #include "gdbsupport/gdb_setjmp.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "gdbsupport/selftest.h"
 #include "gdbsupport/gdb-sigmask.h"
 #include <atomic>
@@ -105,7 +104,7 @@ static int
 cp_already_canonical (const char *string)
 {
   /* Identifier start character [a-zA-Z_].  */
-  if (!ISIDST (string[0]))
+  if (!c_isalpha (string[0]) || string[0] == '_')
     return 0;
 
   /* These are the only two identifiers which canonicalize to other
@@ -117,7 +116,7 @@ cp_already_canonical (const char *string)
     return 0;
 
   /* Identifier character [a-zA-Z0-9_].  */
-  while (ISIDNUM (string[1]))
+  while (c_isalpha (string[1]) || c_isdigit (string[1]) || string[1] == '_')
     string++;
 
   if (string[1] == '\0')
@@ -1137,7 +1136,7 @@ cp_find_first_component_aux (const char *name, int permissive)
              && startswith (name + index, CP_OPERATOR_STR))
            {
              index += CP_OPERATOR_LEN;
-             while (ISSPACE(name[index]))
+             while (c_isspace(name[index]))
                ++index;
              switch (name[index])
                {
@@ -2350,7 +2349,7 @@ find_toplevel_char (const char *s, char c)
              scan += CP_OPERATOR_LEN;
              if (*scan == c)
                return scan;
-             while (ISSPACE (*scan))
+             while (c_isspace (*scan))
                {
                  ++scan;
                  if (*scan == c)
index 28e900d9c07a9c39c89a8aa3dffb90d7a1b635ac..17c9b448f592cf4ed5b8308c89d2ea8844d42c9e 100644 (file)
@@ -25,7 +25,6 @@
 #include "symtab.h"
 #include "buildsym.h"
 #include "dictionary.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "gdbsupport/unordered_map.h"
 #include "language.h"
 
@@ -772,7 +771,7 @@ language_defn::search_name_hash (const char *string0) const
 
              if (c == 'B' && string[3] == '_')
                {
-                 for (string += 4; ISDIGIT (*string); ++string)
+                 for (string += 4; c_isdigit (*string); ++string)
                    ;
                  continue;
                }
index b7311923618509537de01a9f25357ee3b3df6636..c8e830ed471cb66e4f1f102e4c1bd1bab229609b 100644 (file)
@@ -28,7 +28,6 @@
 #include "cli/cli-cmds.h"
 #include "dis-asm.h"
 #include "source.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include <algorithm>
 #include <optional>
 #include "valprint.h"
index 863ddd6499c4578e2156f89872adb7ab09297b0b..a5e3fcb6caaad517f4b7a2033c234c7688ee70bc 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "dwarf2/cooked-index-entry.h"
 #include "dwarf2/tag.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "gdbsupport/selftest.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.  */
       if (c == '<')
        return '\0';
-      return TOLOWER ((unsigned char) c);
+      return c_tolower (c);
     };
 
   unsigned char a = munge (*stra);
index d4a2499d4247fdf92f2d8fb9395905148131c06d..fad058efb28502b34441f32c3607e8cecb264082 100644 (file)
@@ -32,7 +32,6 @@
 #include <ctype.h>
 #include "mi-parse.h"
 #include <optional>
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "inferior.h"
 
 enum what_to_list { locals, arguments, all };
index 16befa7782073101bebeefc78a8b678ee8fb04d0..765535cc32eba9e2b98bae594bda8f7343c983b2 100644 (file)
@@ -52,7 +52,6 @@
 #include "cli/cli-utils.h"
 #include "gdbsupport/symbol.h"
 #include <algorithm>
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "gdbsupport/parallel-for.h"
 #include "inferior.h"
 
index 709faa5e8f4ce3de303ef2bc0c99babadcf3b9f3..dcab475bcd31e32bcee0cc7f9fc3f00d46667259 100644 (file)
@@ -195,7 +195,7 @@ unsigned int msymbol_hash_iw (const char *);
    requirements.  */
 
 #define SYMBOL_HASH_NEXT(hash, c)                      \
-  ((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113)
+  ((hash) * 67 + c_tolower (c) - 113)
 
 \f
 
index 27748401f6f8c72596de7f766f3b50aea6f5bcaa..2db207dafdd1439fbc0f8490c20bdcfdcc8b4e02 100644 (file)
@@ -29,7 +29,6 @@
 #include "gdbtypes.h"
 #include "target.h"
 #include "regcache.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "reggroups.h"
 #include "arch-utils.h"
 #include "frame-unwind.h"
index 210cf79a537baddd0a10d770cf50796b8bf288d5..53827ef115b344468d802773c2697a14d2a482ea 100644 (file)
@@ -54,7 +54,6 @@
 #include "source.h"
 #include "gdbsupport/byte-vector.h"
 #include <optional>
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "inferior.h"
 
 /* Chain containing all defined memory-tag subcommands.  */
index 680176ba2a4947ac4da29c1557111f99d7011aa9..6fd7c616664af79126ba842da130f7b4fbd8f2bc 100644 (file)
@@ -56,7 +56,6 @@
 #include "arch/riscv.h"
 #include "record-full.h"
 #include "riscv-ravenscar-thread.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 
 #include <vector>
 
@@ -4183,9 +4182,9 @@ riscv_print_insn (bfd_vma addr, struct disassemble_info *info)
 static int
 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.  */
-         || ISALPHA (*s)); /* Register value.  */
+         || c_isalpha (*s)); /* Register value.  */
 }
 
 /* String that appears before a register name in a SystemTap register
index 558055d4edd9c2aa08cc8af29d285abc927430f4..95d20fbf22cf82d9852bd8a451a8c2bccd09826e 100644 (file)
@@ -37,7 +37,6 @@
 #include "tui/tui-layout.h"
 #include "tui/tui-source.h"
 #include "gdb_curses.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 
 /* The 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)
     {
-      if (ISSPACE (c))
+      if (c_isspace (c))
        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);
     }
 
-  if (!ISALPHA (name_copy[0]))
+  if (!c_isalpha (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
index 618d72bbfe285113fcb73dc0dd279236e001918a..2fe4914f2706c69806315817b4dcbe95cf9302bf 100644 (file)
@@ -26,7 +26,6 @@
 #include "value.h"
 #include "source.h"
 #include "objfiles.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 
 #include "tui/tui.h"
 #include "tui/tui-data.h"
@@ -109,7 +108,7 @@ tui_copy_source_line (const char **ptr, int *length)
        }
       else if (c == '\t')
        process_tab ();
-      else if (ISCNTRL (c))
+      else if (c_iscntrl (c))
        {
          result.push_back ('^');
          result.push_back (c + 0100);
index 92e626a9c752f28fc8eaf1b2d87c58ee0b5b615a..5994ef9fb559e2bee01ed8dcc8f75e73b714be9b 100644 (file)
@@ -75,7 +75,6 @@
 #include "gdbsupport/scope-exit.h"
 #include "gdbarch.h"
 #include "cli-out.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "bt-utils.h"
 #include "gdbsupport/buildargv.h"
 #include "pager.h"
@@ -1008,7 +1007,7 @@ parse_escape (struct gdbarch *gdbarch, const char **string_ptr)
          while (++count < 3)
            {
              c = (**string_ptr);
-             if (ISDIGIT (c) && c != '8' && c != '9')
+             if (c_isdigit (c) && c != '8' && c != '9')
                {
                  (*string_ptr)++;
                  i *= 8;
@@ -2068,7 +2067,7 @@ fprintf_symbol (struct ui_file *stream, const char *name,
 static bool
 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
@@ -2078,7 +2077,7 @@ static const char *
 cp_skip_operator_token (const char *token, const char *end)
 {
   const char *p = token;
-  while (p != end && !ISSPACE (*p) && *p != '(')
+  while (p != end && !c_isspace (*p) && *p != '(')
     {
       if (valid_identifier_name_char (*p))
        {
@@ -2132,9 +2131,9 @@ cp_skip_operator_token (const char *token, const char *end)
 static void
 skip_ws (const char *&string1, const char *&string2, const char *end_str2)
 {
-  while (ISSPACE (*string1))
+  while (c_isspace (*string1))
     string1++;
-  while (string2 < end_str2 && ISSPACE (*string2))
+  while (string2 < end_str2 && c_isspace (*string2))
     string2++;
 }
 
@@ -2198,7 +2197,7 @@ skip_template_parameter_list (const char **name)
       /* Skip any whitespace that might occur after the closing of the
         parameter list, but only if it is the end of parameter list.  */
       const char *q = p;
-      while (ISSPACE (*q))
+      while (c_isspace (*q))
        ++q;
       if (*q == '>')
        p = q;
@@ -2230,8 +2229,8 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
   while (1)
     {
       if (skip_spaces
-         || ((ISSPACE (*string1) && !valid_identifier_name_char (*string2))
-             || (ISSPACE (*string2) && !valid_identifier_name_char (*string1))))
+         || ((c_isspace (*string1) && !valid_identifier_name_char (*string2))
+             || (c_isspace (*string2) && !valid_identifier_name_char (*string1))))
        {
          skip_ws (string1, string2, end_str2);
          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)
            match_for_lcd->mark_ignored_range (abi_start, string1);
 
-         while (ISSPACE (*string1))
+         while (c_isspace (*string1))
            string1++;
        }
 
@@ -2331,9 +2330,9 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
          string1++;
          string2++;
 
-         while (ISSPACE (*string1))
+         while (c_isspace (*string1))
            string1++;
-         while (string2 < end_str2 && ISSPACE (*string2))
+         while (string2 < end_str2 && c_isspace (*string2))
            string2++;
          continue;
        }
@@ -2433,14 +2432,13 @@ strncmp_iw_with_mode (const char *string1, const char *string2,
       if (case_sensitivity == case_sensitive_on && *string1 != *string2)
        break;
       if (case_sensitivity == case_sensitive_off
-         && (TOLOWER ((unsigned char) *string1)
-             != TOLOWER ((unsigned char) *string2)))
+         && c_tolower (*string1) != c_tolower (*string2))
        break;
 
       /* If we see any non-whitespace, non-identifier-name character
         (any of "()<>*&" etc.), then skip spaces the next time
         around.  */
-      if (!ISSPACE (*string1) && !valid_identifier_name_char (*string1))
+      if (!c_isspace (*string1) && !valid_identifier_name_char (*string1))
        skip_spaces = true;
 
       string1++;
@@ -3153,16 +3151,16 @@ strcmp_iw_ordered (const char *string1, const char *string2)
 
       while (*string1 != '\0' && *string2 != '\0')
        {
-         while (ISSPACE (*string1))
+         while (c_isspace (*string1))
            string1++;
-         while (ISSPACE (*string2))
+         while (c_isspace (*string2))
            string2++;
 
          switch (case_pass)
          {
            case case_sensitive_off:
-             c1 = TOLOWER ((unsigned char) *string1);
-             c2 = TOLOWER ((unsigned char) *string2);
+             c1 = c_tolower (*string1);
+             c2 = c_tolower (*string2);
              break;
            case case_sensitive_on:
              c1 = *string1;
@@ -3271,17 +3269,17 @@ string_to_core_addr (const char *my_string)
 {
   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.  */
       int 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);
-         else if (ISXDIGIT (my_string[i]))
-           addr = (TOLOWER (my_string[i]) - 'a' + 0xa) + (addr * 16);
+         else if (c_isxdigit (my_string[i]))
+           addr = (c_tolower (my_string[i]) - 'a' + 0xa) + (addr * 16);
          else
            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++)
        {
-         if (ISDIGIT (my_string[i]))
+         if (c_isdigit (my_string[i]))
            addr = (my_string[i] - '0') + (addr * 10);
          else
            error (_("invalid decimal \"%s\""), my_string);
index 08524f85309dc8af7ab2d3f74f1929d28984194f..ebf6ea6b966c4007bee9066d4fb6defdeba17a10 100644 (file)
@@ -21,7 +21,6 @@
 #include "xml-builtin.h"
 #include "xml-support.h"
 #include "gdbsupport/filestuff.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include <vector>
 #include <string>
 
@@ -430,10 +429,10 @@ gdb_xml_parser::end_element (const XML_Char *name)
          body = scope->body.c_str ();
 
          /* Strip leading and trailing whitespace.  */
-         while (length > 0 && ISSPACE (body[length - 1]))
+         while (length > 0 && c_isspace (body[length - 1]))
            length--;
          scope->body.erase (length);
-         while (*body && ISSPACE (*body))
+         while (*body && c_isspace (*body))
            body++;
        }
 
index e8c4eb8a78d159111b750c04d2d54fe32fe08bba..98e581530ddebae2982c4db49761aafb50c29d78 100644 (file)
@@ -46,7 +46,6 @@
 #include <langinfo.h>
 #include <iconv.h>
 #include "gdbsupport/filestuff.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "tracepoint.h"
 #include <inttypes.h>
 #include "gdbsupport/common-inferior.h"
@@ -7012,7 +7011,7 @@ replace_non_ascii (char *dest, const char *name)
   const char *result = dest;
   while (*name != '\0')
     {
-      if (!ISPRINT (*name))
+      if (!c_isprint (*name))
        *dest++ = '?';
       else
        *dest++ = *name;
index 8d7e2a9353c198adbcb63f5473634702a3c4e563..6f58914ccd5855a3df08b503baf65a40c6e85708 100644 (file)
 /* Pull in gdb::unique_xmalloc_ptr.  */
 #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
    returns the same value.  brk/sbrk on macOS is just an emulation
    that always returns a pointer to a 4MB section reserved for
index 266d836b3c69899af3118ba0d8c58f9a1089140e..5c7ba313996ac8521d0329d623ba71283b2f1071 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "common-utils.h"
 #include "host-defs.h"
-#include "gdbsupport/gdb-safe-ctype.h"
 #include "gdbsupport/gdb-xfree.h"
 
 void *
@@ -180,7 +179,7 @@ extract_string_maybe_quoted (const char **arg)
   /* Parse p similarly to gdb_argv buildargv function.  */
   while (*p != '\0')
     {
-      if (ISSPACE (*p) && !squote && !dquote && !bsquote)
+      if (c_isspace (*p) && !squote && !dquote && !bsquote)
        break;
       else
        {
@@ -254,21 +253,21 @@ make_quoted_string (const char *str)
 static int
 is_digit_in_base (unsigned char digit, int base)
 {
-  if (!ISALNUM (digit))
+  if (!c_isalnum (digit))
     return 0;
   if (base <= 10)
-    return (ISDIGIT (digit) && digit < base + '0');
+    return (c_isdigit (digit) && digit < base + '0');
   else
-    return (ISDIGIT (digit) || TOLOWER (digit) < base - 10 + 'a');
+    return (c_isdigit (digit) || c_tolower (digit) < base - 10 + 'a');
 }
 
 static int
 digit_to_int (unsigned char c)
 {
-  if (ISDIGIT (c))
+  if (c_isdigit (c))
     return c - '0';
   else
-    return TOLOWER (c) - 'a' + 10;
+    return c_tolower (c) - 'a' + 10;
 }
 
 /* As for strtoul, but for ULONGEST results.  */
@@ -282,7 +281,7 @@ strtoulst (const char *num, const char **trailer, int base)
   int i = 0;
 
   /* Skip leading whitespace.  */
-  while (ISSPACE (num[i]))
+  while (c_isspace (num[i]))
     i++;
 
   /* Handle prefixes.  */
@@ -349,7 +348,7 @@ skip_spaces (char *chp)
 {
   if (chp == NULL)
     return NULL;
-  while (*chp && ISSPACE (*chp))
+  while (*chp && c_isspace (*chp))
     chp++;
   return chp;
 }
@@ -361,7 +360,7 @@ skip_spaces (const char *chp)
 {
   if (chp == NULL)
     return NULL;
-  while (*chp && ISSPACE (*chp))
+  while (*chp && c_isspace (*chp))
     chp++;
   return chp;
 }
@@ -373,7 +372,7 @@ skip_to_space (const char *chp)
 {
   if (chp == NULL)
     return NULL;
-  while (*chp && !ISSPACE (*chp))
+  while (*chp && !c_isspace (*chp))
     chp++;
   return chp;
 }
diff --git a/gdbsupport/gdb-safe-ctype.h b/gdbsupport/gdb-safe-ctype.h
deleted file mode 100644 (file)
index 36b78f5..0000000
+++ /dev/null
@@ -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 */