Introduce make_unique_xstrndup
authorTom Tromey <tom@tromey.com>
Fri, 4 Jun 2021 22:00:33 +0000 (16:00 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 5 Nov 2021 19:58:48 +0000 (13:58 -0600)
This adds a new make_unique_xstrndup function, which is the "n"
analogue of make_unique_xstrdup.  It also updates a couple existing
places to use this function.

gdb/cli/cli-setshow.c
gdb/parse.c
gdbsupport/gdb_unique_ptr.h

index dcb50caf5e333028c58551c47c74ed5fa7de70b1..18e2d4ed5c8245bf2f7863066b456012cc92b830 100644 (file)
@@ -375,14 +375,13 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
          {
            /* Clear trailing whitespace of filename.  */
            const char *ptr = arg + strlen (arg) - 1;
-           char *copy;
 
            while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
              ptr--;
-           copy = xstrndup (arg, ptr + 1 - arg);
+           gdb::unique_xmalloc_ptr<char> copy
+             = make_unique_xstrndup (arg, ptr + 1 - arg);
 
-           val = tilde_expand (copy);
-           xfree (copy);
+           val = tilde_expand (copy.get ());
          }
        else
          val = xstrdup ("");
index b2f23eb67bb18fb3ca52765cb6462407b707ecf3..a76a6c1afdbc2730f4bfbda05e08b76449217caf 100644 (file)
@@ -199,7 +199,8 @@ parser_state::mark_completion_tag (enum type_code tag, const char *ptr,
              || tag == TYPE_CODE_STRUCT
              || tag == TYPE_CODE_ENUM);
   m_completion_state.expout_tag_completion_type = tag;
-  m_completion_state.expout_completion_name.reset (xstrndup (ptr, length));
+  m_completion_state.expout_completion_name
+    = make_unique_xstrndup (ptr, length);
 }
 
 /* See parser-defs.h.  */
index df88cea9cf03c49ce2cb988a0dbe74f95444537c..77aecb48e62959077f982bd8e04ffd4e5fed0d49 100644 (file)
@@ -64,4 +64,13 @@ make_unique_xstrdup (const char *str)
   return gdb::unique_xmalloc_ptr<char> (xstrdup (str));
 }
 
+/* Dup the first N characters of STR and return a unique_xmalloc_ptr
+   for the result.  The result is always \0-terminated.  */
+
+static inline gdb::unique_xmalloc_ptr<char>
+make_unique_xstrndup (const char *str, size_t n)
+{
+  return gdb::unique_xmalloc_ptr<char> (xstrndup (str, n));
+}
+
 #endif /* COMMON_GDB_UNIQUE_PTR_H */