From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8534 invoked by alias); 9 Dec 2013 09:21:10 -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 8523 invoked by uid 89); 9 Dec 2013 09:21:09 -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-f50.google.com Received: from Unknown (HELO mail-la0-f50.google.com) (209.85.215.50) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 09 Dec 2013 09:21:08 +0000 Received: by mail-la0-f50.google.com with SMTP id el20so1324803lab.37 for ; Mon, 09 Dec 2013 01:20:58 -0800 (PST) X-Received: by 10.152.87.37 with SMTP id u5mr4666537laz.11.1386580858821; Mon, 09 Dec 2013 01:20:58 -0800 (PST) Received: from localhost ([188.134.22.24]) by mx.google.com with ESMTPSA id m5sm13119098laj.4.2013.12.09.01.20.57 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 09 Dec 2013 01:20:58 -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 09:21:00 -0000 Message-Id: <1386580852-28006-1-git-send-email-a3at.mail@gmail.com> X-SW-Source: 2013-12/txt/msg00324.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) 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..2caeb32 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