This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] gdb: set filename-display shortpath support
- From: Azat Khuzhin <a3at dot mail at gmail dot com>
- To: gdb-patches at sourceware dot org
- Cc: Azat Khuzhin <a3at dot mail at gmail dot com>
- Date: Mon, 9 Dec 2013 01:29:12 +0400
- Subject: [PATCH] gdb: set filename-display shortpath support
- Authentication-results: sourceware.org; auth=none
Display only non-common part of filename and compilation directory
This will be useful for projects that use separate build directory
inside project (like build/cmake and others).
---
gdb/ChangeLog | 6 ++++++
gdb/source.c | 44 +++++++++++++++++++++++++++++++++++++++++---
gdb/source.h | 3 +++
3 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 788eaab..b098e04 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2013-12-00 Azat Khuzhin <a3at.mail@gmail.com>
+
+ * source.h (symtab_to_shortpath): Add it.
+ * source.c (filename-display): Add shortpath display.
+ * source.c (symtab_to_filename_for_display): Use symtab_to_shortpath.
+
2013-12-08 Joel Brobecker <brobecker@adacore.com>
GDB 7.6.2 released.
diff --git a/gdb/source.c b/gdb/source.c
index 6234bfc..505ee7d 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -111,11 +111,13 @@ show_lines_to_list (struct ui_file *file, int from_tty,
static const char filename_display_basename[] = "basename";
static const char filename_display_relative[] = "relative";
static const char filename_display_absolute[] = "absolute";
+static const char filename_display_shortpath[] = "shortpath";
static const char *const filename_display_kind_names[] = {
filename_display_basename,
filename_display_relative,
filename_display_absolute,
+ filename_display_shortpath,
NULL
};
@@ -1134,6 +1136,39 @@ symtab_to_fullname (struct symtab *s)
return s->fullname;
}
+#undef MIN
+#define MIN(A, B) (((A) <= (B)) ? (A) : (B))
+
+const char *
+symtab_to_shortpath (struct symtab *symtab)
+{
+ char *prev_slash_name = (char *)symtab->filename;
+ char *prev_slash_dir = (char *)symtab->dirname;
+ char *slash_name = (char *)symtab->filename;
+ char *slash_dir = (char *)symtab->dirname;
+ const char *shortpath = slash_name;
+
+ if (!slash_dir)
+ return shortpath;
+
+ while ((slash_name = strstr(slash_name, SLASH_STRING)) &&
+ (slash_dir = strstr(slash_dir, SLASH_STRING)))
+ {
+ slash_name++;
+ slash_dir++;
+
+ if (strncmp(slash_name, slash_dir, MIN(slash_name - prev_slash_name, slash_dir - prev_slash_dir)))
+ break;
+
+ shortpath = slash_name;
+
+ prev_slash_name = slash_name;
+ prev_slash_dir = slash_dir;
+ }
+
+ return shortpath;
+}
+
/* See commentary in source.h. */
const char *
@@ -1145,6 +1180,8 @@ symtab_to_filename_for_display (struct symtab *symtab)
return symtab_to_fullname (symtab);
else if (filename_display_string == filename_display_relative)
return symtab->filename;
+ else if (filename_display_string == filename_display_shortpath)
+ return symtab_to_shortpath (symtab);
else
internal_error (__FILE__, __LINE__, _("invalid filename_display_string"));
}
@@ -2093,9 +2130,10 @@ is not specified, print all substitution rules."),
Set how to display filenames."), _("\
Show how to display filenames."), _("\
filename-display can be:\n\
- basename - display only basename of a filename\n\
- relative - display a filename relative to the compilation directory\n\
- absolute - display an absolute filename\n\
+ basename - display only basename of a filename\n\
+ relative - display a filename relative to the compilation directory\n\
+ absolute - display an absolute filename\n\
+ shortpath - display only non-common part of filename and compilation directory\n\
By default, relative filenames are displayed."),
NULL,
show_filename_display_string,
diff --git a/gdb/source.h b/gdb/source.h
index 33cad09..79e3565 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -52,6 +52,9 @@ extern char *rewrite_source_path (const char *path);
extern const char *symtab_to_fullname (struct symtab *s);
+/* Returns only non-common part of filename and compilation directory. */
+extern const char *symtab_to_shortpath(struct symtab *symtab);
+
/* Returns filename without the compile directory part, basename or absolute
filename. It depends on 'set filename-display' value. */
extern const char *symtab_to_filename_for_display (struct symtab *symtab);
--
1.8.4.3