From: Pedro Alves <pedro@codesourcery.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: gdb-patches@sourceware.org, dj@redhat.com,
ktietz70@googlemail.com, binutils@sourceware.org,
gcc-patches@gcc.gnu.org
Subject: Re: [patch libiberty include]: Add additional helper functions for directory-separator searching
Date: Wed, 09 Mar 2011 12:40:00 -0000 [thread overview]
Message-ID: <201103091146.36746.pedro@codesourcery.com> (raw)
In-Reply-To: <E1PxBxN-0005a9-GM@fencepost.gnu.org>
On Wednesday 09 March 2011 05:29:09, Eli Zaretskii wrote:
> > Actually, is there any case where lbasename wouldn't
> > work instead of filename_dirrchr?
>
> Almost: lbasename returns a pointer one character after the last
> slash. It also skips the drive letter on DOS/Windows (which might be
> TRT, actually).
I meant a valid use case in the code bases. Might as
well cook up a (gdb) patch. Find it pasted below. Does it look good to you?
The one's left are: 1 in a linux-native only file (never cares
for other filesystem semantics), and a couple in the coff and
mdebug readers. The latter could be rewritten in terms of
lbasename, but I'm not sure whether gcc outputs a literal '/' in
that case even when building on mingw. If so, and we changed them,
we'd be breaking reading these files on Windows, so I'd rather
change them only if proven necessary. (remember the source vs host
path distinction we're missing)
> It would be reasonable to rewrite filename_dirrchr in terms of
> lbasename, though, by backing up the pointer returned by lbasename if
> it points to a slash, and otherwise returning NULL. The case of
> "d:foo" should also be resolved (probably, return a pointer to the
> colon).
The means it's just an adapter, and callers could be rewritten
a little to think in terms of lbasename. The only case where
I imagine filename_dirrchr would be a little bit more efficient,
is when breaking up path directories components from right
to left, for step-wise comparison with another path, say.
IMO, the less code to maintain and the fewer the APIs
readers have to understand, the better.
I did a:
grep strrchr * | grep "'/'"
under gcc and all the cases I saw could/should
be using lbasename. I suggest gcc folks fix that first
before anything else.
--
Pedro Alves
2011-03-09 Pedro Alves <pedro@codesourcery.com>
gdb/
* cli/cli-cmds.c (shell_escape): Use lbasename.
* coffread.c (coff_start_symtab): Constify parameter.
(complete_symtab): Constify `name' parameter.
(coff_symtab_read): Constify `filestring' local.
(coff_getfilename): Constify return and `result' local.
Use lbasename.
* fbsd-nat.c (fbsd_make_corefile_notes): Use lbasename.
* linux-fork.c (info_checkpoints_command): Use lbasename.
* linux-nat.c (linux_nat_make_corefile_notes): Use lbasename.
* minsyms.c (lookup_minimal_symbol): Use lbasename.
* nto-tdep.c (nto_find_and_open_solib): Use lbasename.
* procfs.c (procfs_make_note_section): Use lbasename.
* tui/tui-io.c (printable_part): Constity return and parameter.
Use lbasename.
(print_filename): Constify parameters, and local `s'.
(tui_rl_display_match_list): Constify local `temp'.
---
gdb/cli/cli-cmds.c | 7 ++-----
gdb/coffread.c | 15 +++++++--------
gdb/fbsd-nat.c | 2 +-
gdb/linux-fork.c | 9 +--------
gdb/linux-nat.c | 2 +-
gdb/minsyms.c | 7 +------
gdb/nto-tdep.c | 8 +-------
gdb/procfs.c | 2 +-
gdb/tui/tui-io.c | 22 ++++++----------------
9 files changed, 21 insertions(+), 53 deletions(-)
Index: src/gdb/cli/cli-cmds.c
===================================================================
--- src.orig/gdb/cli/cli-cmds.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/cli/cli-cmds.c 2011-03-09 11:14:37.672800007 +0000
@@ -730,16 +730,13 @@ shell_escape (char *arg, int from_tty)
if ((pid = vfork ()) == 0)
{
- char *p, *user_shell;
+ const char *p, *user_shell;
if ((user_shell = (char *) getenv ("SHELL")) == NULL)
user_shell = "/bin/sh";
/* Get the name of the shell for arg0. */
- if ((p = strrchr (user_shell, '/')) == NULL)
- p = user_shell;
- else
- p++; /* Get past '/' */
+ p = lbasename (user_shell);
if (!arg)
execl (user_shell, p, (char *) 0);
Index: src/gdb/coffread.c
===================================================================
--- src.orig/gdb/coffread.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/coffread.c 2011-03-09 11:14:37.672800007 +0000
@@ -178,7 +178,7 @@ static int init_lineno (bfd *, long, int
static char *getsymname (struct internal_syment *);
-static char *coff_getfilename (union internal_auxent *);
+static const char *coff_getfilename (union internal_auxent *);
static void free_stringtab (void);
@@ -366,7 +366,7 @@ coff_alloc_type (int index)
it indicates the start of data for one original source file. */
static void
-coff_start_symtab (char *name)
+coff_start_symtab (const char *name)
{
start_symtab (
/* We fill in the filename later. start_symtab puts this pointer
@@ -388,7 +388,7 @@ coff_start_symtab (char *name)
text. */
static void
-complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
+complete_symtab (const char *name, CORE_ADDR start_addr, unsigned int size)
{
if (last_source_file != NULL)
xfree (last_source_file);
@@ -713,7 +713,7 @@ coff_symtab_read (long symtab_offset, un
int in_source_file = 0;
int next_file_symnum = -1;
/* Name of the current file. */
- char *filestring = "";
+ const char *filestring = "";
int depth = 0;
int fcn_first_line = 0;
CORE_ADDR fcn_first_line_addr = 0;
@@ -1308,12 +1308,12 @@ getsymname (struct internal_syment *symb
Return only the last component of the name. Result is in static
storage and is only good for temporary use. */
-static char *
+static const char *
coff_getfilename (union internal_auxent *aux_entry)
{
static char buffer[BUFSIZ];
char *temp;
- char *result;
+ const char *result;
if (aux_entry->x_file.x_n.x_zeroes == 0)
{
@@ -1331,8 +1331,7 @@ coff_getfilename (union internal_auxent
/* FIXME: We should not be throwing away the information about what
directory. It should go into dirname of the symtab, or some such
place. */
- if ((temp = strrchr (result, '/')) != NULL)
- result = temp + 1;
+ result = lbasename (result);
return (result);
}
\f
Index: src/gdb/fbsd-nat.c
===================================================================
--- src.orig/gdb/fbsd-nat.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/fbsd-nat.c 2011-03-09 11:14:37.682800003 +0000
@@ -202,7 +202,7 @@ fbsd_make_corefile_notes (bfd *obfd, int
if (get_exec_file (0))
{
- char *fname = strrchr (get_exec_file (0), '/') + 1;
+ char *fname = lbasename (get_exec_file (0));
char *psargs = xstrdup (fname);
if (get_inferior_args ())
Index: src/gdb/linux-fork.c
===================================================================
--- src.orig/gdb/linux-fork.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/linux-fork.c 2011-03-09 11:14:37.682800003 +0000
@@ -584,14 +584,7 @@ info_checkpoints_command (char *arg, int
sal = find_pc_line (pc, 0);
if (sal.symtab)
- {
- char *tmp = strrchr (sal.symtab->filename, '/');
-
- if (tmp)
- printf_filtered (_(", file %s"), tmp + 1);
- else
- printf_filtered (_(", file %s"), sal.symtab->filename);
- }
+ printf_filtered (_(", file %s"), lbasename (sal.symtab->filename));
if (sal.line)
printf_filtered (_(", line %d"), sal.line);
if (!sal.symtab && !sal.line)
Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/linux-nat.c 2011-03-09 11:14:37.682800003 +0000
@@ -4491,7 +4491,7 @@ linux_nat_make_corefile_notes (bfd *obfd
if (get_exec_file (0))
{
- strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
+ strncpy (fname, lbasename (get_exec_file (0)), sizeof (fname));
strncpy (psargs, get_exec_file (0), sizeof (psargs));
if (get_inferior_args ())
{
Index: src/gdb/minsyms.c
===================================================================
--- src.orig/gdb/minsyms.c 2011-03-09 10:53:22.072800005 +0000
+++ src/gdb/minsyms.c 2011-03-09 11:14:37.682800003 +0000
@@ -198,12 +198,7 @@ lookup_minimal_symbol (const char *name,
const char *modified_name;
if (sfile != NULL)
- {
- char *p = strrchr (sfile, '/');
-
- if (p != NULL)
- sfile = p + 1;
- }
+ sfile = lbasename (sfile);
/* For C++, canonicalize the input name. */
modified_name = name;
Index: src/gdb/nto-tdep.c
===================================================================
--- src.orig/gdb/nto-tdep.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/nto-tdep.c 2011-03-09 11:14:37.682800003 +0000
@@ -127,13 +127,7 @@ nto_find_and_open_solib (char *solib, un
sprintf (buf, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
arch_path);
- /* Don't assume basename() isn't destructive. */
- base = strrchr (solib, '/');
- if (!base)
- base = solib;
- else
- base++; /* Skip over '/'. */
-
+ base = lbasename (solib);
ret = openp (buf, 1, base, o_flags, temp_pathname);
if (ret < 0 && base != solib)
{
Index: src/gdb/procfs.c
===================================================================
--- src.orig/gdb/procfs.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/procfs.c 2011-03-09 11:14:37.682800003 +0000
@@ -5734,7 +5734,7 @@ procfs_make_note_section (bfd *obfd, int
if (get_exec_file (0))
{
- strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
+ strncpy (fname, lbasename (get_exec_file (0)), sizeof (fname));
strncpy (psargs, get_exec_file (0),
sizeof (psargs));
Index: src/gdb/tui/tui-io.c
===================================================================
--- src.orig/gdb/tui/tui-io.c 2011-03-09 10:53:22.062800003 +0000
+++ src/gdb/tui/tui-io.c 2011-03-09 11:14:37.682800003 +0000
@@ -324,20 +324,10 @@ tui_readline_output (int error, gdb_clie
final slash. Otherwise, we return what we were passed.
Comes from readline/complete.c. */
-static char *
-printable_part (char *pathname)
+static const char *
+printable_part (const char *pathname)
{
- char *temp;
-
- temp = rl_filename_completion_desired
- ? strrchr (pathname, '/') : (char *)NULL;
-#if defined (__MSDOS__)
- if (rl_filename_completion_desired
- && temp == 0 && isalpha (pathname[0])
- && pathname[1] == ':')
- temp = pathname + 1;
-#endif
- return (temp ? ++temp : pathname);
+ return rl_filename_completion_desired ? lbasename (pathname) : pathname;
}
/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and
@@ -366,10 +356,10 @@ printable_part (char *pathname)
} while (0)
static int
-print_filename (char *to_print, char *full_pathname)
+print_filename (const char *to_print, const char *full_pathname)
{
int printed_len = 0;
- char *s;
+ const char *s;
for (s = to_print; *s; s++)
{
@@ -416,7 +406,7 @@ tui_rl_display_match_list (char **matche
int count, limit, printed_len;
int i, j, k, l;
- char *temp;
+ const char *temp;
/* Screen dimension correspond to the TUI command window. */
int screenwidth = TUI_CMD_WIN->generic.width;
next prev parent reply other threads:[~2011-03-09 11:46 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-08 11:25 Kai Tietz
2011-03-08 11:53 ` Eli Zaretskii
2011-03-08 11:55 ` Kai Tietz
2011-03-08 12:01 ` Eli Zaretskii
2011-03-08 12:48 ` Kai Tietz
2011-03-08 13:25 ` Pedro Alves
2011-03-08 13:33 ` Kai Tietz
2011-03-08 14:30 ` Pedro Alves
2011-03-08 14:45 ` Kai Tietz
2011-03-08 18:49 ` Eli Zaretskii
2011-03-08 18:54 ` Pedro Alves
2011-03-08 18:58 ` Kai Tietz
2011-03-08 19:59 ` Eli Zaretskii
[not found] ` <E1Pwupb-0001ns-M8__47566.5626036518$1299582745$gmane$org@fencepost.gnu.org>
2011-03-08 12:43 ` Andreas Schwab
2011-03-08 16:52 ` Kai Tietz
2011-03-08 17:02 ` Kai Tietz
2011-03-08 18:39 ` Eli Zaretskii
2011-03-08 19:51 ` DJ Delorie
2011-03-08 22:38 ` Eli Zaretskii
2011-03-08 23:10 ` Pedro Alves
2011-03-09 7:12 ` Eli Zaretskii
2011-03-09 12:40 ` Pedro Alves [this message]
2011-03-09 12:54 ` Eli Zaretskii
2011-03-09 13:39 ` Pedro Alves
2011-03-09 13:54 ` Eli Zaretskii
2011-03-12 22:59 ` Kai Tietz
2011-03-09 15:02 ` Build regression [Re: [patch libiberty include]: Add additional helper functions for directory-separator searching] Jan Kratochvil
2011-03-09 15:40 ` Pedro Alves
2011-03-09 16:09 ` Jan Kratochvil
2011-03-13 1:09 ` [patch libiberty include]: Add additional helper functions for directory-separator searching Kai Tietz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201103091146.36746.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=binutils@sourceware.org \
--cc=dj@redhat.com \
--cc=eliz@gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=ktietz70@googlemail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox