This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Introduce gdb_tilde_expand


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7da0a8867419fc4a2a64d49cc71a14bd145cebff

commit 7da0a8867419fc4a2a64d49cc71a14bd145cebff
Author: Sergio Durigan Junior <sergiodj@redhat.com>
Date:   Mon Sep 11 01:03:51 2017 -0400

    Introduce gdb_tilde_expand
    
    Currently, whenever we want to handle paths provided by the user and
    perform tilde expansion on GDB, we rely on "tilde_expand", which comes
    from readline.  This was enough for our use cases so far, but the
    situation will change when we start dealing with paths on gdbserver as
    well, which is what the next patches implement.
    
    Unfortunately it is not possible to use "tilde_expand" in this case
    because gdbserver doesn't use readline.  For that reason I decided to
    implement a new "gdb_tilde_expand" function, which is basically a
    wrapper for "glob" and its GNU extension, GLOB_TILDE_CHECK.  With the
    import of the "glob" module from gnulib, we're sure that "glob" always
    supports this extension.
    
    gdb/ChangeLog:
    2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
    
    	* Makefile.in (SFILES): Add gdb_tilde_expand.c.
    	(HFILES_NO_SRCDIR): Add gdb_tilde_expand.h.
    	(COMMON_OBS): Add gdb_tilde_expand.o.
    	* common/gdb_tilde_expand.c: New file.
    	* common/gdb_tilde_expand.h: Likewise.
    
    gdb/gdbserver/ChangeLog:
    2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
    
    	* Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c.
    	(OBS): Add gdb_tilde_expand.o.

Diff:
---
 gdb/ChangeLog                 |  8 +++++
 gdb/Makefile.in               |  3 ++
 gdb/common/gdb_tilde_expand.c | 82 +++++++++++++++++++++++++++++++++++++++++++
 gdb/common/gdb_tilde_expand.h | 27 ++++++++++++++
 gdb/gdbserver/ChangeLog       |  5 +++
 gdb/gdbserver/Makefile.in     |  2 ++
 6 files changed, 127 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e9cb48c..6f9c7e6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+	* Makefile.in (SFILES): Add gdb_tilde_expand.c.
+	(HFILES_NO_SRCDIR): Add gdb_tilde_expand.h.
+	(COMMON_OBS): Add gdb_tilde_expand.o.
+	* common/gdb_tilde_expand.c: New file.
+	* common/gdb_tilde_expand.h: Likewise.
+
 2017-10-03  Maciej W. Rozycki  <macro@imgtec.com>
 
 	* gdbarch.sh (objfile): Remove duplicate declaration.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index f3f1d40..9454e3a 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1248,6 +1248,7 @@ SFILES = \
 	common/filestuff.c \
 	common/format.c \
 	common/job-control.c \
+	common/gdb_tilde_expand.c \
 	common/gdb_vecs.c \
 	common/new-op.c \
 	common/print-utils.c \
@@ -1532,6 +1533,7 @@ HFILES_NO_SRCDIR = \
 	common/fileio.h \
 	common/format.h \
 	common/gdb_assert.h \
+	common/gdb_tilde_expand.h \
 	common/gdb_locale.h \
 	common/gdb_setjmp.h \
 	common/gdb_signals.h \
@@ -1737,6 +1739,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
 	frame-unwind.o \
 	gcore.o \
 	gdb_bfd.o \
+	gdb_tilde_expand.o \
 	gdb-dlfcn.o \
 	gdb_obstack.o \
 	gdb_regex.o \
diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c
new file mode 100644
index 0000000..8dd9423
--- /dev/null
+++ b/gdb/common/gdb_tilde_expand.c
@@ -0,0 +1,82 @@
+/* Perform tilde expansion on paths for GDB and gdbserver.
+
+   Copyright (C) 2017 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/>.  */
+
+#include "common-defs.h"
+#include "gdb_tilde_expand.h"
+#include <glob.h>
+
+/* RAII-style class wrapping "glob".  */
+
+class gdb_glob
+{
+public:
+  /* Construct a "gdb_glob" object by calling "glob" with the provided
+     parameters.  This function can throw if "glob" fails.  */
+  gdb_glob (const char *pattern, int flags,
+	    int (*errfunc) (const char *epath, int eerrno))
+  {
+    int ret = glob (pattern, flags, errfunc, &m_glob);
+
+    if (ret != 0)
+      {
+	if (ret == GLOB_NOMATCH)
+	  error (_("Could not find a match for '%s'."), pattern);
+	else
+	  error (_("glob could not process pattern '%s'."),
+		 pattern);
+      }
+  }
+
+  /* Destroy the object and free M_GLOB.  */
+  ~gdb_glob ()
+  {
+    globfree (&m_glob);
+  }
+
+  /* Return the GL_PATHC component of M_GLOB.  */
+  int pathc () const
+  {
+    return m_glob.gl_pathc;
+  }
+
+  /* Return the GL_PATHV component of M_GLOB.  */
+  char **pathv () const
+  {
+    return m_glob.gl_pathv;
+  }
+
+private:
+  /* The actual glob object we're dealing with.  */
+  glob_t m_glob;
+};
+
+/* See common/gdb_tilde_expand.h.  */
+
+std::string
+gdb_tilde_expand (const char *dir)
+{
+  gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL);
+
+  gdb_assert (glob.pathc () > 0);
+  /* "glob" may return more than one match to the path provided by the
+     user, but we are only interested in the first match.  */
+  std::string expanded_dir = glob.pathv ()[0];
+
+  return expanded_dir;
+}
diff --git a/gdb/common/gdb_tilde_expand.h b/gdb/common/gdb_tilde_expand.h
new file mode 100644
index 0000000..2ec0563
--- /dev/null
+++ b/gdb/common/gdb_tilde_expand.h
@@ -0,0 +1,27 @@
+/* Perform tilde expansion on paths for GDB and gdbserver.
+
+   Copyright (C) 2017 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 GDB_TILDE_EXPAND_H
+#define GDB_TILDE_EXPAND_H
+
+/* Perform path expansion (i.e., tilde expansion) on DIR, and return
+   the full path.  */
+extern std::string gdb_tilde_expand (const char *dir);
+
+#endif /* ! GDB_TILDE_EXPAND_H */
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 67223a0..3de4b10 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+	* Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c.
+	(OBS): Add gdb_tilde_expand.o.
+
 2017-10-02  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* lynx-i386-low.c (lynx_i386_arch_setup): Call init_target_desc.
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 1bbe515..6c931ba 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -205,6 +205,7 @@ SFILES = \
 	$(srcdir)/common/fileio.c \
 	$(srcdir)/common/filestuff.c \
 	$(srcdir)/common/job-control.c \
+	$(srcdir)/common/gdb_tilde_expand.c \
 	$(srcdir)/common/gdb_vecs.c \
 	$(srcdir)/common/new-op.c \
 	$(srcdir)/common/print-utils.c \
@@ -247,6 +248,7 @@ OBS = \
 	fileio.o \
 	filestuff.o \
 	format.o \
+	gdb_tilde_expand.o \
 	gdb_vecs.o \
 	hostio.o \
 	inferiors.o \


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]