From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27317 invoked by alias); 9 Dec 2013 08:55: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 27306 invoked by uid 89); 9 Dec 2013 08:55:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 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-f54.google.com Received: from Unknown (HELO mail-la0-f54.google.com) (209.85.215.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 09 Dec 2013 08:55:13 +0000 Received: by mail-la0-f54.google.com with SMTP id b8so1296368lan.41 for ; Mon, 09 Dec 2013 00:55:04 -0800 (PST) X-Received: by 10.152.23.3 with SMTP id i3mr621266laf.78.1386579303926; Mon, 09 Dec 2013 00:55:03 -0800 (PST) Received: from localhost ([188.134.22.24]) by mx.google.com with ESMTPSA id xl4sm12965708lac.9.2013.12.09.00.55.02 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 09 Dec 2013 00:55:03 -0800 (PST) From: Azat Khuzhin To: gdb-patches@sourceware.org Cc: Azat Khuzhin Subject: [PATCH] gdb: set filename-display shortpath support Date: Mon, 09 Dec 2013 08:55:00 -0000 Message-Id: <1386579278-23119-1-git-send-email-a3at.mail@gmail.com> X-SW-Source: 2013-12/txt/msg00321.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). --- V2: fixed coding style issues (thanks to Joel) gdb/source.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- gdb/source.h | 3 +++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/gdb/source.c b/gdb/source.c index 6234bfc..5b03e29 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,46 @@ symtab_to_fullname (struct symtab *s) /* See commentary in source.h. */ 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 != NULL) + return shortpath; + + for (;;) + { + size_t min_part_len; + + slash_name = strstr (slash_name, SLASH_STRING); + slash_dir = strstr (slash_dir, SLASH_STRING); + if (slash_name == NULL || slash_dir == NULL) + break; + + slash_name++; + slash_dir++; + + min_part_len = min (slash_name - prev_slash_name, + slash_dir - prev_slash_dir); + if (strncmp (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 +1187,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 +2137,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 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