| 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);
|
| +
|
| }
|
|
|