diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2017-09-11 01:03:51 -0400 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2017-10-04 01:57:29 -0400 |
commit | 7da0a8867419fc4a2a64d49cc71a14bd145cebff (patch) | |
tree | b226a30bb410d61dea4e27c0dbd8ec42e440f3af /gdb/common | |
parent | a5259595e7a6faac0240d257f7e9cfa599557d2e (diff) | |
download | gdb-7da0a8867419fc4a2a64d49cc71a14bd145cebff.zip gdb-7da0a8867419fc4a2a64d49cc71a14bd145cebff.tar.gz gdb-7da0a8867419fc4a2a64d49cc71a14bd145cebff.tar.bz2 |
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.
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/gdb_tilde_expand.c | 82 | ||||
-rw-r--r-- | gdb/common/gdb_tilde_expand.h | 27 |
2 files changed, 109 insertions, 0 deletions
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 */ |