Index: gdb/source.c |
diff --git a/gdb/source.c b/gdb/source.c |
index 0ff0782d453a67d39c7436c3e313dcc31d6e3357..6234bfc3954b26d0c1f9b3cf01667c4a2828c757 100644 |
--- a/gdb/source.c |
+++ b/gdb/source.c |
@@ -1,5 +1,5 @@ |
/* List lines of source files for GDB, the GNU debugger. |
- Copyright (C) 1986-2005, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1986-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -27,10 +27,11 @@ |
#include "frame.h" |
#include "value.h" |
#include "gdb_assert.h" |
+#include "filestuff.h" |
#include <sys/types.h> |
-#include "gdb_string.h" |
-#include "gdb_stat.h" |
+#include <string.h> |
+#include <sys/stat.h> |
#include <fcntl.h> |
#include "gdbcore.h" |
#include "gdb_regex.h" |
@@ -44,9 +45,6 @@ |
#include "ui-out.h" |
#include "readline/readline.h" |
-#include "psymtab.h" |
- |
- |
#define OPEN_MODE (O_RDONLY | O_BINARY) |
#define FDOPEN_MODE FOPEN_RB |
@@ -109,6 +107,27 @@ show_lines_to_list (struct ui_file *file, int from_tty, |
value); |
} |
+/* Possible values of 'set filename-display'. */ |
+static const char filename_display_basename[] = "basename"; |
+static const char filename_display_relative[] = "relative"; |
+static const char filename_display_absolute[] = "absolute"; |
+ |
+static const char *const filename_display_kind_names[] = { |
+ filename_display_basename, |
+ filename_display_relative, |
+ filename_display_absolute, |
+ NULL |
+}; |
+ |
+static const char *filename_display_string = filename_display_relative; |
+ |
+static void |
+show_filename_display_string (struct ui_file *file, int from_tty, |
+ struct cmd_list_element *c, const char *value) |
+{ |
+ fprintf_filtered (file, _("Filenames are displayed as \"%s\".\n"), value); |
+} |
+ |
/* Line number of last line printed. Default for various commands. |
current_source_line is usually, but not always, the same as this. */ |
@@ -384,14 +403,14 @@ init_source_path (void) |
{ |
char buf[20]; |
- sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR); |
+ xsnprintf (buf, sizeof (buf), "$cdir%c$cwd", DIRNAME_SEPARATOR); |
source_path = xstrdup (buf); |
forget_cached_source_info (); |
} |
/* Add zero or more directories to the front of the source path. */ |
-void |
+static void |
directory_command (char *dirname, int from_tty) |
{ |
dont_repeat (); |
@@ -655,9 +674,10 @@ is_regular_file (const char *name) |
If OPF_TRY_CWD_FIRST, try to open ./STRING before searching PATH. |
(ie pretend the first element of PATH is "."). This also indicates |
- that a slash in STRING disables searching of the path (this is |
- so that "exec-file ./foo" or "symbol-file ./foo" insures that you |
- get that particular version of foo or an error message). |
+ that, unless OPF_SEARCH_IN_PATH is also specified, a slash in STRING |
+ disables searching of the path (this is so that "exec-file ./foo" or |
+ "symbol-file ./foo" insures that you get that particular version of |
+ foo or an error message). |
If OPTS has OPF_SEARCH_IN_PATH set, absolute names will also be |
searched in path (we usually want this for source files but not for |
@@ -669,6 +689,11 @@ is_regular_file (const char *name) |
and the file, sigh! Emacs gets confuzzed by this when we print the |
source file name!!! |
+ If OPTS has OPF_RETURN_REALPATH set return FILENAME_OPENED resolved by |
+ gdb_realpath. Even without OPF_RETURN_REALPATH this function still returns |
+ filename starting with "/". If FILENAME_OPENED is NULL this option has no |
+ effect. |
+ |
If a file is found, return the descriptor. |
Otherwise, return -1, with errno set for the last name we tried to open. */ |
@@ -716,7 +741,7 @@ openp (const char *path, int opts, const char *string, |
{ |
filename = alloca (strlen (string) + 1); |
strcpy (filename, string); |
- fd = open (filename, mode); |
+ fd = gdb_open_cloexec (filename, mode, 0); |
if (fd >= 0) |
goto done; |
} |
@@ -814,7 +839,7 @@ openp (const char *path, int opts, const char *string, |
if (is_regular_file (filename)) |
{ |
- fd = open (filename, mode); |
+ fd = gdb_open_cloexec (filename, mode, 0); |
if (fd >= 0) |
break; |
} |
@@ -825,27 +850,13 @@ openp (const char *path, int opts, const char *string, |
done: |
if (filename_opened) |
{ |
- /* If a file was opened, canonicalize its filename. Use xfullpath |
- rather than gdb_realpath to avoid resolving the basename part |
- of filenames when the associated file is a symbolic link. This |
- fixes a potential inconsistency between the filenames known to |
- GDB and the filenames it prints in the annotations. */ |
+ /* If a file was opened, canonicalize its filename. */ |
if (fd < 0) |
*filename_opened = NULL; |
- else if (IS_ABSOLUTE_PATH (filename)) |
- *filename_opened = xfullpath (filename); |
+ else if ((opts & OPF_RETURN_REALPATH) != 0) |
+ *filename_opened = gdb_realpath (filename); |
else |
- { |
- /* Beware the // my son, the Emacs barfs, the botch that catch... */ |
- |
- char *f = concat (current_directory, |
- IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) |
- ? "" : SLASH_STRING, |
- filename, (char *)NULL); |
- |
- *filename_opened = xfullpath (f); |
- xfree (f); |
- } |
+ *filename_opened = gdb_abspath (filename); |
} |
return fd; |
@@ -868,8 +879,9 @@ source_full_path_of (const char *filename, char **full_pathname) |
{ |
int fd; |
- fd = openp (source_path, OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH, filename, |
- O_RDONLY, full_pathname); |
+ fd = openp (source_path, |
+ OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, |
+ filename, O_RDONLY, full_pathname); |
if (fd < 0) |
{ |
*full_pathname = NULL; |
@@ -937,7 +949,7 @@ get_substitute_path_rule (const char *path) |
Return NULL if no substitution rule was specified by the user, |
or if no rule applied to the given PATH. */ |
-static char * |
+char * |
rewrite_source_path (const char *path) |
{ |
const struct substitute_path_rule *rule = get_substitute_path_rule (path); |
@@ -967,6 +979,7 @@ find_and_open_source (const char *filename, |
char *path = source_path; |
const char *p; |
int result; |
+ struct cleanup *cleanup; |
/* Quick way out if we already know its full name. */ |
@@ -983,12 +996,10 @@ find_and_open_source (const char *filename, |
*fullname = rewritten_fullname; |
} |
- result = open (*fullname, OPEN_MODE); |
+ result = gdb_open_cloexec (*fullname, OPEN_MODE, 0); |
if (result >= 0) |
{ |
- /* Call xfullpath here to be consistent with openp |
- which we use below. */ |
- char *lpath = xfullpath (*fullname); |
+ char *lpath = gdb_realpath (*fullname); |
xfree (*fullname); |
*fullname = lpath; |
@@ -1000,6 +1011,8 @@ find_and_open_source (const char *filename, |
*fullname = NULL; |
} |
+ cleanup = make_cleanup (null_cleanup, NULL); |
+ |
if (dirname != NULL) |
{ |
/* If necessary, rewrite the compilation directory name according |
@@ -1047,15 +1060,18 @@ find_and_open_source (const char *filename, |
} |
} |
- result = openp (path, OPF_SEARCH_IN_PATH, filename, OPEN_MODE, fullname); |
+ result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename, |
+ OPEN_MODE, fullname); |
if (result < 0) |
{ |
/* Didn't work. Try using just the basename. */ |
p = lbasename (filename); |
if (p != filename) |
- result = openp (path, OPF_SEARCH_IN_PATH, p, OPEN_MODE, fullname); |
+ result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, p, |
+ OPEN_MODE, fullname); |
} |
+ do_cleanups (cleanup); |
return result; |
} |
@@ -1075,35 +1091,62 @@ open_source_file (struct symtab *s) |
/* Finds the fullname that a symtab represents. |
- If this functions finds the fullname, it will save it in s->fullname |
- and it will also return the value. |
+ This functions finds the fullname and saves it in s->fullname. |
+ It will also return the value. |
If this function fails to find the file that this symtab represents, |
- NULL will be returned and s->fullname will be set to NULL. */ |
+ the expected fullname is used. Therefore the files does not have to |
+ exist. */ |
-char * |
+const char * |
symtab_to_fullname (struct symtab *s) |
{ |
- int r; |
- |
- if (!s) |
- return NULL; |
- |
/* Use cached copy if we have it. |
We rely on forget_cached_source_info being called appropriately |
to handle cases like the file being moved. */ |
- if (s->fullname) |
- return s->fullname; |
+ if (s->fullname == NULL) |
+ { |
+ int fd = find_and_open_source (s->filename, s->dirname, &s->fullname); |
- r = find_and_open_source (s->filename, s->dirname, &s->fullname); |
+ if (fd >= 0) |
+ close (fd); |
+ else |
+ { |
+ char *fullname; |
+ struct cleanup *back_to; |
- if (r >= 0) |
- { |
- close (r); |
- return s->fullname; |
- } |
+ /* rewrite_source_path would be applied by find_and_open_source, we |
+ should report the pathname where GDB tried to find the file. */ |
- return NULL; |
+ if (s->dirname == NULL || IS_ABSOLUTE_PATH (s->filename)) |
+ fullname = xstrdup (s->filename); |
+ else |
+ fullname = concat (s->dirname, SLASH_STRING, s->filename, NULL); |
+ |
+ back_to = make_cleanup (xfree, fullname); |
+ s->fullname = rewrite_source_path (fullname); |
+ if (s->fullname == NULL) |
+ s->fullname = xstrdup (fullname); |
+ do_cleanups (back_to); |
+ } |
+ } |
+ |
+ return s->fullname; |
+} |
+ |
+/* See commentary in source.h. */ |
+ |
+const char * |
+symtab_to_filename_for_display (struct symtab *symtab) |
+{ |
+ if (filename_display_string == filename_display_basename) |
+ return lbasename (symtab->filename); |
+ else if (filename_display_string == filename_display_absolute) |
+ return symtab_to_fullname (symtab); |
+ else if (filename_display_string == filename_display_relative) |
+ return symtab->filename; |
+ else |
+ internal_error (__FILE__, __LINE__, _("invalid filename_display_string")); |
} |
/* Create and initialize the table S->line_charpos that records |
@@ -1125,7 +1168,7 @@ find_source_lines (struct symtab *s, int desc) |
gdb_assert (s); |
line_charpos = (int *) xmalloc (lines_allocated * sizeof (int)); |
if (fstat (desc, &st) < 0) |
- perror_with_name (s->filename); |
+ perror_with_name (symtab_to_filename_for_display (s)); |
if (s->objfile && s->objfile->obfd) |
mtime = s->objfile->mtime; |
@@ -1150,7 +1193,7 @@ find_source_lines (struct symtab *s, int desc) |
/* Reassign `size' to result of read for systems where \r\n -> \n. */ |
size = myread (desc, data, size); |
if (size < 0) |
- perror_with_name (s->filename); |
+ perror_with_name (symtab_to_filename_for_display (s)); |
end = data + size; |
p = data; |
line_charpos[0] = 0; |
@@ -1245,10 +1288,9 @@ identify_source_line (struct symtab *s, int line, int mid_statement, |
/* Print source lines from the file of symtab S, |
starting with line number LINE and stopping before line number STOPLINE. */ |
-static void print_source_lines_base (struct symtab *s, int line, int stopline, |
- int noerror); |
static void |
-print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
+print_source_lines_base (struct symtab *s, int line, int stopline, |
+ enum print_source_lines_flags flags) |
{ |
int c; |
int desc; |
@@ -1276,13 +1318,13 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
else |
{ |
desc = last_source_error; |
- noerror = 1; |
+ flags |= PRINT_SOURCE_LINES_NOERROR; |
} |
} |
else |
{ |
desc = last_source_error; |
- noerror = 1; |
+ flags |= PRINT_SOURCE_LINES_NOERROR; |
noprint = 1; |
} |
@@ -1290,17 +1332,43 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
{ |
last_source_error = desc; |
- if (!noerror) |
+ if (!(flags & PRINT_SOURCE_LINES_NOERROR)) |
{ |
- char *name = alloca (strlen (s->filename) + 100); |
- sprintf (name, "%d\t%s", line, s->filename); |
+ const char *filename = symtab_to_filename_for_display (s); |
+ int len = strlen (filename) + 100; |
+ char *name = alloca (len); |
+ |
+ xsnprintf (name, len, "%d\t%s", line, filename); |
print_sys_errmsg (name, errno); |
} |
else |
{ |
ui_out_field_int (uiout, "line", line); |
ui_out_text (uiout, "\tin "); |
- ui_out_field_string (uiout, "file", s->filename); |
+ |
+ /* CLI expects only the "file" field. TUI expects only the |
+ "fullname" field (and TUI does break if "file" is printed). |
+ MI expects both fields. ui_source_list is set only for CLI, |
+ not for TUI. */ |
+ if (ui_out_is_mi_like_p (uiout) |
+ || ui_out_test_flags (uiout, ui_source_list)) |
+ ui_out_field_string (uiout, "file", |
+ symtab_to_filename_for_display (s)); |
+ if (ui_out_is_mi_like_p (uiout) |
+ || !ui_out_test_flags (uiout, ui_source_list)) |
+ { |
+ const char *s_fullname = symtab_to_fullname (s); |
+ char *local_fullname; |
+ |
+ /* ui_out_field_string may free S_FULLNAME by calling |
+ open_source_file for it again. See e.g., |
+ tui_field_string->tui_show_source. */ |
+ local_fullname = alloca (strlen (s_fullname) + 1); |
+ strcpy (local_fullname, s_fullname); |
+ |
+ ui_out_field_string (uiout, "fullname", local_fullname); |
+ } |
+ |
ui_out_text (uiout, "\n"); |
} |
@@ -1316,13 +1384,13 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
{ |
close (desc); |
error (_("Line number %d out of range; %s has %d lines."), |
- line, s->filename, s->nlines); |
+ line, symtab_to_filename_for_display (s), s->nlines); |
} |
if (lseek (desc, s->line_charpos[line - 1], 0) < 0) |
{ |
close (desc); |
- perror_with_name (s->filename); |
+ perror_with_name (symtab_to_filename_for_display (s)); |
} |
stream = fdopen (desc, FDOPEN_MODE); |
@@ -1337,13 +1405,18 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
if (c == EOF) |
break; |
last_line_listed = current_source_line; |
- sprintf (buf, "%d\t", current_source_line++); |
+ if (flags & PRINT_SOURCE_LINES_FILENAME) |
+ { |
+ ui_out_text (uiout, symtab_to_filename_for_display (s)); |
+ ui_out_text (uiout, ":"); |
+ } |
+ xsnprintf (buf, sizeof (buf), "%d\t", current_source_line++); |
ui_out_text (uiout, buf); |
do |
{ |
if (c < 040 && c != '\t' && c != '\n' && c != '\r') |
{ |
- sprintf (buf, "^%c", c + 0100); |
+ xsnprintf (buf, sizeof (buf), "^%c", c + 0100); |
ui_out_text (uiout, buf); |
} |
else if (c == 0177) |
@@ -1360,7 +1433,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
} |
else |
{ |
- sprintf (buf, "%c", c); |
+ xsnprintf (buf, sizeof (buf), "%c", c); |
ui_out_text (uiout, buf); |
} |
} |
@@ -1376,9 +1449,10 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror) |
window otherwise it is simply printed. */ |
void |
-print_source_lines (struct symtab *s, int line, int stopline, int noerror) |
+print_source_lines (struct symtab *s, int line, int stopline, |
+ enum print_source_lines_flags flags) |
{ |
- print_source_lines_base (s, line, stopline, noerror); |
+ print_source_lines_base (s, line, stopline, flags); |
} |
/* Print info on range of pc's in a specified line. */ |
@@ -1447,7 +1521,8 @@ line_info (char *arg, int from_tty) |
if (start_pc == end_pc) |
{ |
printf_filtered ("Line %d of \"%s\"", |
- sal.line, sal.symtab->filename); |
+ sal.line, |
+ symtab_to_filename_for_display (sal.symtab)); |
wrap_here (" "); |
printf_filtered (" is at address "); |
print_address (gdbarch, start_pc, gdb_stdout); |
@@ -1457,7 +1532,8 @@ line_info (char *arg, int from_tty) |
else |
{ |
printf_filtered ("Line %d of \"%s\"", |
- sal.line, sal.symtab->filename); |
+ sal.line, |
+ symtab_to_filename_for_display (sal.symtab)); |
wrap_here (" "); |
printf_filtered (" starts at address "); |
print_address (gdbarch, start_pc, gdb_stdout); |
@@ -1483,7 +1559,7 @@ line_info (char *arg, int from_tty) |
which the user would want to see? If we have debugging symbols |
and no line numbers? */ |
printf_filtered (_("Line number %d is out of range for \"%s\".\n"), |
- sal.line, sal.symtab->filename); |
+ sal.line, symtab_to_filename_for_display (sal.symtab)); |
} |
do_cleanups (cleanups); |
} |
@@ -1511,7 +1587,7 @@ forward_search_command (char *regex, int from_tty) |
desc = open_source_file (current_source_symtab); |
if (desc < 0) |
- perror_with_name (current_source_symtab->filename); |
+ perror_with_name (symtab_to_filename_for_display (current_source_symtab)); |
cleanups = make_cleanup_close (desc); |
if (current_source_symtab->line_charpos == 0) |
@@ -1521,7 +1597,7 @@ forward_search_command (char *regex, int from_tty) |
error (_("Expression not found")); |
if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0) |
- perror_with_name (current_source_symtab->filename); |
+ perror_with_name (symtab_to_filename_for_display (current_source_symtab)); |
discard_cleanups (cleanups); |
stream = fdopen (desc, FDOPEN_MODE); |
@@ -1537,7 +1613,7 @@ forward_search_command (char *regex, int from_tty) |
buf = xmalloc (cursize); |
p = buf; |
- c = getc (stream); |
+ c = fgetc (stream); |
if (c == EOF) |
break; |
do |
@@ -1551,7 +1627,7 @@ forward_search_command (char *regex, int from_tty) |
cursize = newsize; |
} |
} |
- while (c != '\n' && (c = getc (stream)) >= 0); |
+ while (c != '\n' && (c = fgetc (stream)) >= 0); |
/* Remove the \r, if any, at the end of the line, otherwise |
regular expressions that end with $ or \n won't work. */ |
@@ -1600,7 +1676,7 @@ reverse_search_command (char *regex, int from_tty) |
desc = open_source_file (current_source_symtab); |
if (desc < 0) |
- perror_with_name (current_source_symtab->filename); |
+ perror_with_name (symtab_to_filename_for_display (current_source_symtab)); |
cleanups = make_cleanup_close (desc); |
if (current_source_symtab->line_charpos == 0) |
@@ -1610,7 +1686,7 @@ reverse_search_command (char *regex, int from_tty) |
error (_("Expression not found")); |
if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0) |
- perror_with_name (current_source_symtab->filename); |
+ perror_with_name (symtab_to_filename_for_display (current_source_symtab)); |
discard_cleanups (cleanups); |
stream = fdopen (desc, FDOPEN_MODE); |
@@ -1622,14 +1698,14 @@ reverse_search_command (char *regex, int from_tty) |
char buf[4096]; /* Should be reasonable??? */ |
char *p = buf; |
- c = getc (stream); |
+ c = fgetc (stream); |
if (c == EOF) |
break; |
do |
{ |
*p++ = c; |
} |
- while (c != '\n' && (c = getc (stream)) >= 0); |
+ while (c != '\n' && (c = fgetc (stream)) >= 0); |
/* Remove the \r, if any, at the end of the line, otherwise |
regular expressions that end with $ or \n won't work. */ |
@@ -1653,8 +1729,11 @@ reverse_search_command (char *regex, int from_tty) |
line--; |
if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0) |
{ |
+ const char *filename; |
+ |
do_cleanups (cleanups); |
- perror_with_name (current_source_symtab->filename); |
+ filename = symtab_to_filename_for_display (current_source_symtab); |
+ perror_with_name (filename); |
} |
} |
@@ -1761,9 +1840,10 @@ show_substitute_path_command (char *args, int from_tty) |
struct substitute_path_rule *rule = substitute_path_rules; |
char **argv; |
char *from = NULL; |
+ struct cleanup *cleanup; |
argv = gdb_buildargv (args); |
- make_cleanup_freeargv (argv); |
+ cleanup = make_cleanup_freeargv (argv); |
/* We expect zero or one argument. */ |
@@ -1787,6 +1867,8 @@ show_substitute_path_command (char *args, int from_tty) |
printf_filtered (" `%s' -> `%s'.\n", rule->from, rule->to); |
rule = rule->next; |
} |
+ |
+ do_cleanups (cleanup); |
} |
/* Implement the "unset substitute-path" command. */ |
@@ -1798,10 +1880,11 @@ unset_substitute_path_command (char *args, int from_tty) |
char **argv = gdb_buildargv (args); |
char *from = NULL; |
int rule_found = 0; |
+ struct cleanup *cleanup; |
/* This function takes either 0 or 1 argument. */ |
- make_cleanup_freeargv (argv); |
+ cleanup = make_cleanup_freeargv (argv); |
if (argv != NULL && argv[0] != NULL && argv[1] != NULL) |
error (_("Incorrect usage, too many arguments in command")); |
@@ -1839,6 +1922,8 @@ unset_substitute_path_command (char *args, int from_tty) |
error (_("No substitution rule defined for `%s'"), from); |
forget_cached_source_info (); |
+ |
+ do_cleanups (cleanup); |
} |
/* Add a new source path substitution rule. */ |
@@ -1848,9 +1933,10 @@ set_substitute_path_command (char *args, int from_tty) |
{ |
char **argv; |
struct substitute_path_rule *rule; |
+ struct cleanup *cleanup; |
argv = gdb_buildargv (args); |
- make_cleanup_freeargv (argv); |
+ cleanup = make_cleanup_freeargv (argv); |
if (argv == NULL || argv[0] == NULL || argv [1] == NULL) |
error (_("Incorrect usage, too few arguments in command")); |
@@ -1877,6 +1963,8 @@ set_substitute_path_command (char *args, int from_tty) |
add_substitute_path_rule (argv[0], argv[1]); |
forget_cached_source_info (); |
+ |
+ do_cleanups (cleanup); |
} |
@@ -1953,6 +2041,7 @@ The address is also stored as the value of \"$_\".")); |
Search for regular expression (see regex(3)) from last line listed.\n\ |
The matching line number is also stored as the value of \"$_\".")); |
add_com_alias ("search", "forward-search", class_files, 0); |
+ add_com_alias ("fo", "forward-search", class_files, 1); |
add_com ("reverse-search", class_files, reverse_search_command, _("\ |
Search backward for regular expression (see regex(3)) from last line listed.\n\ |
@@ -1967,7 +2056,10 @@ The matching line number is also stored as the value of \"$_\".")); |
add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\ |
Set number of source lines gdb will list by default."), _("\ |
-Show number of source lines gdb will list by default."), NULL, |
+Show number of source lines gdb will list by default."), _("\ |
+Use this to choose how many source lines the \"list\" displays (unless\n\ |
+the \"list\" argument explicitly specifies some other number).\n\ |
+A value of \"unlimited\", or zero, means there's no limit."), |
NULL, |
show_lines_to_list, |
&setlist, &showlist); |
@@ -1994,4 +2086,19 @@ Usage: show substitute-path [FROM]\n\ |
Print the rule for substituting FROM in source file names. If FROM\n\ |
is not specified, print all substitution rules."), |
&showlist); |
+ |
+ add_setshow_enum_cmd ("filename-display", class_files, |
+ filename_display_kind_names, |
+ &filename_display_string, _("\ |
+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\ |
+By default, relative filenames are displayed."), |
+ NULL, |
+ show_filename_display_string, |
+ &setlist, &showlist); |
+ |
} |