On 05/03/2017 11:46 PM, Tom Tromey wrote:
> This changes find_and_open_script to return a gdb_file_up. The result
> is also used to indicate whether the function succeeded, so the patch
> also removes the "streamp" argument; and finally, the type of the
> "full_path" argument is changed to remove more cleanups from the
> callers.
>
This is OK.
> -extern int find_and_open_script (const char *file, int search_path,
> - FILE **streamp, char **full_path);
> +extern gdb_file_up
> + find_and_open_script (const char *file, int search_path,
> + gdb::unique_xmalloc_ptr<char> *full_path);
>
Though I wonder whether using gdb::optional wouldn't look clearer:
/* The script that was opened. */
struct open_script
{
gdb_file_up stream;
gdb::unique_xmalloc_ptr<char> full_path;
};
gdb::optional<open_script>
find_and_open_script (const char *file, int search_path);
open_script opened = find_and_open_script (file, 1 /*search_path*/);
if (opened)
{
if (!file_is_auto_load_safe (res->full_path.get (),
_("auto-load: Loading %s script "
"\"%s\" from section \"%s\" of "
"objfile \"%s\".\n"),
ext_lang_name (language),
opened->full_path.get (),
section_name, objfile_name (objfile)))
opened.reset ();
}
...
/* If this file is not currently loaded, load it. */
if (opened && !in_hash_table)
sourcer (language, objfile, opened->stream, opened->full_path.get ());
}
Thanks,
Pedro Alves
@@ -1,5 +1,14 @@
2017-05-02 Tom Tromey <tom@tromey.com>
+ * cli/cli-cmds.c (find_and_open_script): Return gdb_file_p.
+ Remove "streamp" argument. Change "full_path" to a
+ unique_xmalloc_ptr.
+ (source_script_with_search): Update.
+ * auto-load.c (source_script_file): Update.
+ * cli/cli-cmds.h (find_and_open_script): Change type.
+
+2017-05-02 Tom Tromey <tom@tromey.com>
+
* xml-support.c (xml_fetch_content_from_file): Update.
* ui-file.c (stdio_file::open): Update.
* tracefile-tfile.c (tfile_start): Update.
@@ -928,10 +928,7 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
const char *section_name, unsigned int offset,
const char *file)
{
- FILE *stream;
- char *full_path;
- int opened, in_hash_table;
- struct cleanup *cleanups;
+ int opened = 0, in_hash_table;
objfile_script_sourcer_func *sourcer;
/* Skip this script if support is not compiled in. */
@@ -953,26 +950,27 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
return;
}
- opened = find_and_open_script (file, 1 /*search_path*/,
- &stream, &full_path);
+ gdb::unique_xmalloc_ptr<char> full_path;
+ gdb_file_up stream = find_and_open_script (file, 1 /*search_path*/,
+ &full_path);
+ const char *path_ptr = full_path.get ();
- cleanups = make_cleanup (null_cleanup, NULL);
- if (opened)
+ if (stream)
{
- make_cleanup_fclose (stream);
- make_cleanup (xfree, full_path);
-
- if (!file_is_auto_load_safe (full_path,
+ if (!file_is_auto_load_safe (full_path.get (),
_("auto-load: Loading %s script "
"\"%s\" from section \"%s\" of "
"objfile \"%s\".\n"),
- ext_lang_name (language), full_path,
+ ext_lang_name (language),
+ full_path.get (),
section_name, objfile_name (objfile)))
opened = 0;
+ else
+ opened = 1;
}
else
{
- full_path = NULL;
+ path_ptr = NULL;
/* If one script isn't found it's not uncommon for more to not be
found either. We don't want to print a message for each script,
@@ -986,14 +984,12 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
section_name, offset);
}
- in_hash_table = maybe_add_script_file (pspace_info, opened, file, full_path,
+ in_hash_table = maybe_add_script_file (pspace_info, opened, file, path_ptr,
language);
/* If this file is not currently loaded, load it. */
if (opened && !in_hash_table)
- sourcer (language, objfile, stream, full_path);
-
- do_cleanups (cleanups);
+ sourcer (language, objfile, stream.get (), path_ptr);
}
/* Subroutine of source_section_scripts to simplify it.
@@ -495,17 +495,16 @@ show_script_ext_mode (struct ui_file *file, int from_tty,
/* Try to open SCRIPT_FILE.
If successful, the full path name is stored in *FULL_PATHP,
- the stream is stored in *STREAMP, and return 1.
- The caller is responsible for freeing *FULL_PATHP.
- If not successful, return 0; errno is set for the last file
+ and the stream is returned.
+ If not successful, return NULL; errno is set for the last file
we tried to open.
If SEARCH_PATH is non-zero, and the file isn't found in cwd,
search for it in the source search path. */
-int
+gdb_file_up
find_and_open_script (const char *script_file, int search_path,
- FILE **streamp, char **full_pathp)
+ gdb::unique_xmalloc_ptr<char> *full_pathp)
{
char *file;
int fd;
@@ -520,8 +519,10 @@ find_and_open_script (const char *script_file, int search_path,
/* Search for and open 'file' on the search path used for source
files. Put the full location in *FULL_PATHP. */
+ char *temp_path;
fd = openp (source_path, search_flags,
- file, O_RDONLY, full_pathp);
+ file, O_RDONLY, &temp_path);
+ full_pathp->reset (temp_path);
if (fd == -1)
{
@@ -533,19 +534,16 @@ find_and_open_script (const char *script_file, int search_path,
do_cleanups (old_cleanups);
- *streamp = fdopen (fd, FOPEN_RT);
- if (*streamp == NULL)
+ FILE *result = fdopen (fd, FOPEN_RT);
+ if (result == NULL)
{
int save_errno = errno;
close (fd);
- if (full_pathp)
- xfree (*full_pathp);
errno = save_errno;
- return 0;
}
- return 1;
+ return gdb_file_up (result);
}
/* Load script FILE, which has already been opened as STREAM.
@@ -596,14 +594,13 @@ source_script_from_stream (FILE *stream, const char *file,
static void
source_script_with_search (const char *file, int from_tty, int search_path)
{
- FILE *stream;
- char *full_path;
- struct cleanup *old_cleanups;
if (file == NULL || *file == 0)
error (_("source command requires file name of file to source."));
- if (!find_and_open_script (file, search_path, &stream, &full_path))
+ gdb::unique_xmalloc_ptr<char> full_path;
+ gdb_file_up stream = find_and_open_script (file, search_path, &full_path);
+ if (!stream)
{
/* The script wasn't found, or was otherwise inaccessible.
If the source command was invoked interactively, throw an
@@ -618,15 +615,13 @@ source_script_with_search (const char *file, int from_tty, int search_path)
}
}
- old_cleanups = make_cleanup (xfree, full_path);
- make_cleanup_fclose (stream);
/* The python support reopens the file, so we need to pass full_path here
in case the file was found on the search path. It's useful to do this
anyway so that error messages show the actual file used. But only do
this if we (may have) used search_path, as printing the full path in
errors for the non-search case can be more noise than signal. */
- source_script_from_stream (stream, file, search_path ? full_path : file);
- do_cleanups (old_cleanups);
+ source_script_from_stream (stream.get (), file,
+ search_path ? full_path.get () : file);
}
/* Wrapper around source_script_with_search to export it to main.c
@@ -17,6 +17,8 @@
#if !defined (CLI_CMDS_H)
#define CLI_CMDS_H 1
+#include "common/filestuff.h"
+
/* Chain containing all defined commands. */
extern struct cmd_list_element *cmdlist;
@@ -117,8 +119,9 @@ extern void source_script (const char *, int);
/* Exported to objfiles.c. */
-extern int find_and_open_script (const char *file, int search_path,
- FILE **streamp, char **full_path);
+extern gdb_file_up
+ find_and_open_script (const char *file, int search_path,
+ gdb::unique_xmalloc_ptr<char> *full_path);
/* Command tracing state. */