binutils-gdb/gdb/common/gdb_tilde_expand.c
Pedro Alves b02f78f928 Introduce and use make_unique_xstrdup
Adds an utility function to make it shorter to write the common case
of wrapping an xstrdup with a unique_xmalloc_ptr, and uses it
throughout.

Note: I tried to put this in common/common-utils.h near skip_spaces,
etc. but that is included in common/common-defs.h before
common/gdb_unique_ptr.h is included, so it would fail to compile
because gdb::unique_xmalloc_ptr isn't defined at that point yet.  I
tried moving the gdb_unique_ptr.h inclusion before common-utils.h, but
that doesn't work because gdb_unique_ptr.h depends on common-utils.h
for xfree.

gdb/ChangeLog:
2019-06-04  Pedro Alves  <palves@redhat.com>

	* common/gdb_unique_ptr.h (make_unique_xstrdup): New.

	* ada-lang.c (catch_ada_completer): Use make_unique_xstrdup.
	* breakpoint.c (condition_completer): Likewise.
	* cli/cli-dump.c (scan_expression): Likewise.
	* common/filestuff.c (mkdir_recursive): Likewise.
	* common/gdb_tilde_expand.c (gdb_tilde_expand_up)
	* common/pathstuff.c (gdb_realpath, gdb_realpath_keepfile)
	(gdb_abspath): Likewise.
	* compile/compile-cplus-types.c
	(compile_cplus_instance::decl_name): Likewise.
	* completer.c (complete_explicit_location):
	(signal_completer, reg_or_group_completer_1): Likewise.
	* cp-support.c (cp_remove_params_if_any): Likewise.
	* fbsd-tdep.c (fbsd_core_vnode_path): Likewise.
	* guile/scm-safe-call.c (gdbscm_safe_eval_string): Likewise.
	* infcmd.c (strip_bg_char): Likewise.
	* linespec.c (copy_token_string): Likewise.
	* mi/mi-main.c (output_cores): Likewise.
	* psymtab.c (psymtab_search_name):
	* symfile.c (test_set_ext_lang_command): Likewise.
	* target.c (target_fileio_read_stralloc): Likewise.
	* tui/tui-regs.c (tui_reggroup_completer): Likewise.
	* value.c (complete_internalvar): Likewise.

gdb/gdbserver/ChangeLog:
2019-06-04  Pedro Alves  <palves@redhat.com>

	* server.c (captured_main): Use make_unique_xstrdup.
2019-06-04 22:48:32 +01:00

96 lines
2.5 KiB
C

/* Perform tilde expansion on paths for GDB and gdbserver.
Copyright (C) 2017-2019 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;
}
/* See common/gdb_tilde_expand.h. */
gdb::unique_xmalloc_ptr<char>
gdb_tilde_expand_up (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. */
return make_unique_xstrdup (glob.pathv ()[0]);
}