summaryrefslogtreecommitdiff
path: root/gdb/source.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-10-27 12:23:44 -0600
committerTom Tromey <tom@tromey.com>2018-11-09 15:47:45 -0700
commit2179fbc36d23f29a83fb3dfcac0fc7d1fb31b8e8 (patch)
tree25112de3c1340c90ca19cefb2dbf5ab5877b6a96 /gdb/source.c
parent9c122c7f9c8260d2cceb1e8f29d69607531f43ba (diff)
downloadbinutils-gdb-2179fbc36d23f29a83fb3dfcac0fc7d1fb31b8e8.tar.gz
Return scoped_fd from open_source_file and find_and_open_source
This changes open_source_file and find_and_open_source to return scoped_fd, then updates the callers as appropriate, including using scoped_fd::to_file. Tested by the buildbot. gdb/ChangeLog 2018-11-09 Tom Tromey <tom@tromey.com> * common/scoped_fd.h (class scoped_fd): Add move constructor and move assignment operator. * psymtab.c (psymtab_to_fullname): Update. * source.h (open_source_file): Return scoped_fd. (find_and_open_source): Likewise. * source.c (open_source_file): Return scoped_fd. (get_filename_and_charpos): Update. (print_source_lines_base): Update. Use scoped_fd::to_file. (forward_search_command): Likewise. (reverse_search_command): Likewise. (find_and_open_source): Return scoped_fd. * tui/tui-source.c (tui_set_source_content): Update. Use gdb_file_up.
Diffstat (limited to 'gdb/source.c')
-rw-r--r--gdb/source.c65
1 files changed, 31 insertions, 34 deletions
diff --git a/gdb/source.c b/gdb/source.c
index 3cdf0b9ec77..59f00fc38fb 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -969,7 +969,9 @@ rewrite_source_path (const char *path)
return gdb::unique_xmalloc_ptr<char> (new_path);
}
-int
+/* See source.h. */
+
+scoped_fd
find_and_open_source (const char *filename,
const char *dirname,
gdb::unique_xmalloc_ptr<char> *fullname)
@@ -995,7 +997,7 @@ find_and_open_source (const char *filename,
if (result >= 0)
{
*fullname = gdb_realpath (fullname->get ());
- return result;
+ return scoped_fd (result);
}
/* Didn't work -- free old one, try again. */
@@ -1056,7 +1058,7 @@ find_and_open_source (const char *filename,
OPEN_MODE, fullname);
}
- return result;
+ return scoped_fd (result);
}
/* Open a source file given a symtab S. Returns a file descriptor or
@@ -1064,15 +1066,16 @@ find_and_open_source (const char *filename,
This function is a convience function to find_and_open_source. */
-int
+scoped_fd
open_source_file (struct symtab *s)
{
if (!s)
- return -1;
+ return scoped_fd (-1);
- gdb::unique_xmalloc_ptr<char> fullname (s->fullname);
+ gdb::unique_xmalloc_ptr<char> fullname;
s->fullname = NULL;
- int fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s), &fullname);
+ scoped_fd fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s),
+ &fullname);
s->fullname = fullname.release ();
return fd;
}
@@ -1094,11 +1097,9 @@ symtab_to_fullname (struct symtab *s)
to handle cases like the file being moved. */
if (s->fullname == NULL)
{
- int fd = open_source_file (s);
+ scoped_fd fd = open_source_file (s);
- if (fd >= 0)
- close (fd);
- else
+ if (fd.get () < 0)
{
gdb::unique_xmalloc_ptr<char> fullname;
@@ -1217,7 +1218,7 @@ get_filename_and_charpos (struct symtab *s, char **fullname)
{
int linenums_changed = 0;
- scoped_fd desc (open_source_file (s));
+ scoped_fd desc = open_source_file (s);
if (desc.get () < 0)
{
if (fullname)
@@ -1271,7 +1272,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
print_source_lines_flags flags)
{
int c;
- int desc;
+ scoped_fd desc;
int noprint = 0;
int nlines = stopline - line;
struct ui_out *uiout = current_uiout;
@@ -1290,24 +1291,26 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
{
last_source_visited = s;
desc = open_source_file (s);
+ if (desc.get () < 0)
+ {
+ last_source_error = desc.get ();
+ noprint = 1;
+ }
}
else
{
- desc = last_source_error;
flags |= PRINT_SOURCE_LINES_NOERROR;
+ noprint = 1;
}
}
else
{
- desc = last_source_error;
flags |= PRINT_SOURCE_LINES_NOERROR;
noprint = 1;
}
- if (desc < 0 || noprint)
+ if (noprint)
{
- last_source_error = desc;
-
if (!(flags & PRINT_SOURCE_LINES_NOERROR))
{
const char *filename = symtab_to_filename_for_display (s);
@@ -1351,22 +1354,16 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
last_source_error = 0;
if (s->line_charpos == 0)
- find_source_lines (s, desc);
+ find_source_lines (s, desc.get ());
if (line < 1 || line > s->nlines)
- {
- close (desc);
- error (_("Line number %d out of range; %s has %d lines."),
- line, symtab_to_filename_for_display (s), s->nlines);
- }
+ error (_("Line number %d out of range; %s has %d lines."),
+ line, symtab_to_filename_for_display (s), s->nlines);
- if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
- {
- close (desc);
- perror_with_name (symtab_to_filename_for_display (s));
- }
+ if (lseek (desc.get (), s->line_charpos[line - 1], 0) < 0)
+ perror_with_name (symtab_to_filename_for_display (s));
- gdb_file_up stream (fdopen (desc, FDOPEN_MODE));
+ gdb_file_up stream = desc.to_file (FDOPEN_MODE);
clearerr (stream.get ());
while (nlines-- > 0)
@@ -1550,7 +1547,7 @@ forward_search_command (const char *regex, int from_tty)
if (current_source_symtab == 0)
select_source_symtab (0);
- scoped_fd desc (open_source_file (current_source_symtab));
+ scoped_fd desc = open_source_file (current_source_symtab);
if (desc.get () < 0)
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
@@ -1564,7 +1561,7 @@ forward_search_command (const char *regex, int from_tty)
< 0)
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
- gdb_file_up stream (fdopen (desc.release (), FDOPEN_MODE));
+ gdb_file_up stream = desc.to_file (FDOPEN_MODE);
clearerr (stream.get ());
while (1)
{
@@ -1632,7 +1629,7 @@ reverse_search_command (const char *regex, int from_tty)
if (current_source_symtab == 0)
select_source_symtab (0);
- scoped_fd desc (open_source_file (current_source_symtab));
+ scoped_fd desc = open_source_file (current_source_symtab);
if (desc.get () < 0)
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
@@ -1646,7 +1643,7 @@ reverse_search_command (const char *regex, int from_tty)
< 0)
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
- gdb_file_up stream (fdopen (desc.release (), FDOPEN_MODE));
+ gdb_file_up stream = desc.to_file (FDOPEN_MODE);
clearerr (stream.get ());
while (line > 1)
{