This is the mail archive of the gdb-patches@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]

[PATCH] gdb: set filename-display shortpath support


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


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