[PATCHv6,10/14] gdb: new extract_single_filename_arg helper function

Message ID 592023767a0ff5ff92fae75b0373387c98bb89db.1725017349.git.aburgess@redhat.com
State New
Headers
Series Further filename completion improvements |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Test passed

Commit Message

Andrew Burgess Aug. 30, 2024, 11:33 a.m. UTC
  This commit is in preparation for the next few commits, this commit
adds a new function extract_single_filename_arg.

This new function will be used to convert GDB commands that expect a
single filename argument to have these commands take a possibly quoted
or escaped string.

There's no use of the new function in this commit, for that see the
following commits.
---
 gdb/utils.c | 18 ++++++++++++++++++
 gdb/utils.h | 14 ++++++++++++++
 2 files changed, 32 insertions(+)
  

Patch

diff --git a/gdb/utils.c b/gdb/utils.c
index 94310300fb5..07c5d3c5f5b 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -80,6 +80,7 @@ 
 #include "gdbsupport/buildargv.h"
 #include "pager.h"
 #include "run-on-main-thread.h"
+#include "gdbsupport/gdb_tilde_expand.h"
 
 void (*deprecated_error_begin_hook) (void);
 
@@ -3667,6 +3668,23 @@  copy_bitwise (gdb_byte *dest, ULONGEST dest_offset,
     }
 }
 
+/* See utils.h.  */
+
+std::string
+extract_single_filename_arg (const char *args)
+{
+  if (args == nullptr)
+    return {};
+
+  std::string filename = extract_string_maybe_quoted (&args);
+  args = skip_spaces (args);
+  if (*args != '\0')
+    error (_("Junk after filename \"%s\": %s"), filename.c_str (), args);
+  if (!filename.empty ())
+    filename = gdb_tilde_expand (filename.c_str ());
+  return filename;
+}
+
 #if GDB_SELF_TEST
 static void
 test_assign_set_return_if_changed ()
diff --git a/gdb/utils.h b/gdb/utils.h
index 90c8012e73b..d69c81ca834 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -371,6 +371,20 @@  assign_return_if_changed (T &lval, const T &val)
   return true;
 }
 
+/* ARG is an argument string as passed to a GDB command which is expected
+   to contain a single, possibly quoted, filename argument.  Extract the
+   filename and return it as a string.  If the filename is quoted then the
+   quotes will have been removed.  If the filename is not quoted then any
+   escaping within the filename will have been removed.
+
+   If there is any content in ARG after the filename then an error will be
+   thrown complaining about the extra content.
+
+   If there is no filename in ARG, or if ARG is nullptr, then an empty
+   string will be returned.  */
+
+extern std::string extract_single_filename_arg (const char *arg);
+
 /* A class that can be used to intercept warnings.  A class is used
    here, rather than a gdb::function_view because it proved difficult
    to use a function view in conjunction with ATTRIBUTE_PRINTF in a