From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28777 invoked by alias); 9 Dec 2013 21:21:17 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 28763 invoked by uid 89); 9 Dec 2013 21:21:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-la0-f46.google.com Received: from Unknown (HELO mail-la0-f46.google.com) (209.85.215.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 09 Dec 2013 21:21:15 +0000 Received: by mail-la0-f46.google.com with SMTP id eh20so2018733lab.5 for ; Mon, 09 Dec 2013 13:21:06 -0800 (PST) X-Received: by 10.152.1.234 with SMTP id 10mr6370727lap.19.1386624065724; Mon, 09 Dec 2013 13:21:05 -0800 (PST) Received: from localhost ([188.134.22.24]) by mx.google.com with ESMTPSA id e10sm17120256laa.6.2013.12.09.13.21.04 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 09 Dec 2013 13:21:04 -0800 (PST) From: Azat Khuzhin To: gdb-patches@sourceware.org Cc: eliz@gnu.org, brobecker@adacore.com, palves@redhat.com, Azat Khuzhin Subject: [PATCH v5] gdb: set filename-display shortpath support Date: Mon, 09 Dec 2013 21:21:00 -0000 Message-Id: <1386624043-11077-1-git-send-email-a3at.mail@gmail.com> X-SW-Source: 2013-12/txt/msg00353.txt.bz2 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 2013-12-00 Azat Khuzhin * source.h (symtab_to_shortpath): Add it. * source.c (filename_display): Add shortpath display. * (symtab_to_filename_for_display): Use symtab_to_shortpath. --- V2: fixed coding style issues (thanks to Joel) V3: fixed typo in initial condition for symtab_to_shortpath V4: add changelog into message (lost because of --annotate) V5: use helpers from filenames.h instead of strncmp and SLASH_STRING. (Thanks to Eli, who pointed me out to this.) gdb/source.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- gdb/source.h | 3 +++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/gdb/source.c b/gdb/source.c index 6234bfc..0ea3f88 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 }; @@ -1137,6 +1139,48 @@ symtab_to_fullname (struct symtab *s) /* See commentary in source.h. */ const char * +symtab_to_shortpath (struct symtab *symtab) +{ + const char *prev_slash_name = symtab->filename; + const char *prev_slash_dir = symtab->dirname; + const char *slash_name = symtab->filename; + const char *slash_dir = symtab->dirname; + const char *shortpath = slash_name; + + if (slash_dir == NULL) + return shortpath; + + for (; *slash_name && *slash_dir; slash_name++, slash_dir++) + { + size_t min_part_len; + + if (IS_DIR_SEPARATOR (*slash_name) != IS_DIR_SEPARATOR (*slash_dir)) + break; + if (!IS_DIR_SEPARATOR (*slash_name)) + continue; + + ++slash_name; + ++slash_dir; + if (!*slash_name || !*slash_dir) + break; + + min_part_len = min (slash_name - prev_slash_name, + slash_dir - prev_slash_dir); + if (filename_ncmp (slash_name, slash_dir, min_part_len)) + break; + + shortpath = slash_name; + + prev_slash_name = slash_name; + prev_slash_dir = slash_dir; + } + + return shortpath; +} + +/* See commentary in source.h. */ + +const char * symtab_to_filename_for_display (struct symtab *symtab) { if (filename_display_string == filename_display_basename) @@ -1145,6 +1189,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 +2139,11 @@ 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 filenames 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