X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fauto-load.c;h=63366dffb22e0dacbfab5e25ea2a8d205b378083;hb=5fed81ff351121887a93b5b57caebb86667cbbd2;hp=7da288ffe7905c171cb72119e2996c141374897f;hpb=5fbae7d108f4b885228cc657449905543c42c85a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/auto-load.c b/gdb/auto-load.c index 7da288ffe7..63366dffb2 100644 --- a/gdb/auto-load.c +++ b/gdb/auto-load.c @@ -1,6 +1,6 @@ /* GDB routines for supporting auto-loaded scripts. - Copyright (C) 2012-2015 Free Software Foundation, Inc. + Copyright (C) 2012-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -32,7 +32,6 @@ #include "cli/cli-cmds.h" #include "cli/cli-decode.h" #include "cli/cli-setshow.h" -#include "gdb_vecs.h" #include "readline/tilde.h" #include "completer.h" #include "fnmatch.h" @@ -40,6 +39,7 @@ #include "filestuff.h" #include "extension.h" #include "gdb/section-scripts.h" +#include /* The section to look in for auto-loaded scripts (in file formats that support sections). @@ -218,7 +218,7 @@ auto_load_safe_path_vec_update (void) { char *dir = VEC_index (char_ptr, auto_load_safe_path_vec, ix); char *expanded = tilde_expand (dir); - char *real_path = gdb_realpath (expanded); + gdb::unique_xmalloc_ptr real_path = gdb_realpath (expanded); /* Ensure the current entry is at least tilde_expand-ed. */ VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded); @@ -238,16 +238,15 @@ auto_load_safe_path_vec_update (void) xfree (dir); /* If gdb_realpath returns a different content, append it. */ - if (strcmp (real_path, expanded) == 0) - xfree (real_path); - else + if (strcmp (real_path.get (), expanded) != 0) { - VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path); - if (debug_auto_load) fprintf_unfiltered (gdb_stdlog, _("auto-load: And canonicalized as \"%s\".\n"), - real_path); + real_path.get ()); + + VEC_safe_push (char_ptr, auto_load_safe_path_vec, + real_path.release ()); } } } @@ -302,7 +301,7 @@ show_auto_load_safe_path (struct ui_file *file, int from_tty, variable. */ static void -add_auto_load_safe_path (char *args, int from_tty) +add_auto_load_safe_path (const char *args, int from_tty) { char *s; @@ -323,7 +322,7 @@ Use 'set auto-load safe-path /' for disabling the auto-load safe-path security.\ variable. */ static void -add_auto_load_dir (char *args, int from_tty) +add_auto_load_dir (const char *args, int from_tty) { char *s; @@ -408,9 +407,9 @@ filename_is_in_pattern (const char *filename, const char *pattern) { char *filename_copy, *pattern_copy; - filename_copy = alloca (strlen (filename) + 1); + filename_copy = (char *) alloca (strlen (filename) + 1); strcpy (filename_copy, filename); - pattern_copy = alloca (strlen (pattern) + 1); + pattern_copy = (char *) alloca (strlen (pattern) + 1); strcpy (pattern_copy, pattern); return filename_is_in_pattern_1 (filename_copy, pattern_copy); @@ -419,12 +418,11 @@ filename_is_in_pattern (const char *filename, const char *pattern) /* Return 1 if FILENAME belongs to one of directory components of AUTO_LOAD_SAFE_PATH_VEC. Return 0 otherwise. auto_load_safe_path_vec_update is never called. - *FILENAME_REALP may be updated by gdb_realpath of FILENAME - it has to be - freed by the caller. */ + *FILENAME_REALP may be updated by gdb_realpath of FILENAME. */ static int filename_is_in_auto_load_safe_path_vec (const char *filename, - char **filename_realp) + gdb::unique_xmalloc_ptr *filename_realp) { char *pattern; int ix; @@ -439,17 +437,17 @@ filename_is_in_auto_load_safe_path_vec (const char *filename, if (*filename_realp == NULL) { *filename_realp = gdb_realpath (filename); - if (debug_auto_load && strcmp (*filename_realp, filename) != 0) + if (debug_auto_load && strcmp (filename_realp->get (), filename) != 0) fprintf_unfiltered (gdb_stdlog, _("auto-load: Resolved " "file \"%s\" as \"%s\".\n"), - filename, *filename_realp); + filename, filename_realp->get ()); } - if (strcmp (*filename_realp, filename) != 0) + if (strcmp (filename_realp->get (), filename) != 0) for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, pattern); ++ix) - if (filename_is_in_pattern (*filename_realp, pattern)) + if (filename_is_in_pattern (filename_realp->get (), pattern)) break; } @@ -476,8 +474,7 @@ filename_is_in_auto_load_safe_path_vec (const char *filename, int file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...) { - char *filename_real = NULL; - struct cleanup *back_to; + gdb::unique_xmalloc_ptr filename_real; static int advice_printed = 0; if (debug_auto_load) @@ -489,34 +486,24 @@ file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...) va_end (debug_args); } - back_to = make_cleanup (free_current_contents, &filename_real); - if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real)) - { - do_cleanups (back_to); - return 1; - } + return 1; auto_load_safe_path_vec_update (); if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real)) - { - do_cleanups (back_to); - return 1; - } + return 1; warning (_("File \"%s\" auto-loading has been declined by your " "`auto-load safe-path' set to \"%s\"."), - filename_real, auto_load_safe_path); + filename_real.get (), auto_load_safe_path); if (!advice_printed) { const char *homedir = getenv ("HOME"); - char *homeinit; if (homedir == NULL) homedir = "$HOME"; - homeinit = xstrprintf ("%s/%s", homedir, gdbinit); - make_cleanup (xfree, homeinit); + std::string homeinit = string_printf ("%s/%s", homedir, gdbinit); printf_filtered (_("\ To enable execution of this file add\n\ @@ -528,11 +515,11 @@ line to your configuration file \"%s\".\n\ For more information about this security protection see the\n\ \"Auto-loading safe path\" section in the GDB manual. E.g., run from the shell:\n\ \tinfo \"(gdb)Auto-loading safe path\"\n"), - filename_real, homeinit, homeinit); + filename_real.get (), + homeinit.c_str (), homeinit.c_str ()); advice_printed = 1; } - do_cleanups (back_to); return 0; } @@ -580,7 +567,7 @@ static const struct program_space_data *auto_load_pspace_data; static void auto_load_pspace_data_cleanup (struct program_space *pspace, void *arg) { - struct auto_load_pspace_info *info = arg; + struct auto_load_pspace_info *info = (struct auto_load_pspace_info *) arg; if (info->loaded_script_files) htab_delete (info->loaded_script_files); @@ -597,7 +584,8 @@ get_auto_load_pspace_data (struct program_space *pspace) { struct auto_load_pspace_info *info; - info = program_space_data (pspace, auto_load_pspace_data); + info = ((struct auto_load_pspace_info *) + program_space_data (pspace, auto_load_pspace_data)); if (info == NULL) { info = XCNEW (struct auto_load_pspace_info); @@ -612,7 +600,7 @@ get_auto_load_pspace_data (struct program_space *pspace) static hashval_t hash_loaded_script_entry (const void *data) { - const struct loaded_script *e = data; + const struct loaded_script *e = (const struct loaded_script *) data; return htab_hash_string (e->name) ^ htab_hash_pointer (e->language); } @@ -622,8 +610,8 @@ hash_loaded_script_entry (const void *data) static int eq_loaded_script_entry (const void *a, const void *b) { - const struct loaded_script *ea = a; - const struct loaded_script *eb = b; + const struct loaded_script *ea = (const struct loaded_script *) a; + const struct loaded_script *eb = (const struct loaded_script *) b; return strcmp (ea->name, eb->name) == 0 && ea->language == eb->language; } @@ -693,9 +681,10 @@ maybe_add_script_file (struct auto_load_pspace_info *pspace_info, int loaded, char *p; /* Allocate all space in one chunk so it's easier to free. */ - *slot = xmalloc (sizeof (**slot) - + strlen (name) + 1 - + (full_path != NULL ? (strlen (full_path) + 1) : 0)); + *slot = ((struct loaded_script *) + xmalloc (sizeof (**slot) + + strlen (name) + 1 + + (full_path != NULL ? (strlen (full_path) + 1) : 0))); p = ((char*) *slot) + sizeof (**slot); strcpy (p, name); (*slot)->name = p; @@ -740,7 +729,8 @@ maybe_add_script_text (struct auto_load_pspace_info *pspace_info, char *p; /* Allocate all space in one chunk so it's easier to free. */ - *slot = xmalloc (sizeof (**slot) + strlen (name) + 1); + *slot = ((struct loaded_script *) + xmalloc (sizeof (**slot) + strlen (name) + 1)); p = ((char*) *slot) + sizeof (**slot); strcpy (p, name); (*slot)->name = p; @@ -760,7 +750,8 @@ clear_section_scripts (void) struct program_space *pspace = current_program_space; struct auto_load_pspace_info *info; - info = program_space_data (pspace, auto_load_pspace_data); + info = ((struct auto_load_pspace_info *) + program_space_data (pspace, auto_load_pspace_data)); if (info != NULL && info->loaded_script_files != NULL) { htab_delete (info->loaded_script_files); @@ -782,18 +773,17 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname, { char *filename, *debugfile; int len, retval; - FILE *input; struct cleanup *cleanups; const char *suffix = ext_lang_auto_load_suffix (language); len = strlen (realname); - filename = xmalloc (len + strlen (suffix) + 1); + filename = (char *) xmalloc (len + strlen (suffix) + 1); memcpy (filename, realname, len); strcpy (filename + len, suffix); cleanups = make_cleanup (xfree, filename); - input = gdb_fopen_cloexec (filename, "r"); + gdb_file_up input = gdb_fopen_cloexec (filename, "r"); debugfile = filename; if (debug_auto_load) fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file \"%s\" %s.\n"), @@ -818,7 +808,7 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname, for (ix = 0; VEC_iterate (char_ptr, vec, ix, dir); ++ix) { - debugfile = xmalloc (strlen (dir) + strlen (filename) + 1); + debugfile = (char *) xmalloc (strlen (dir) + strlen (filename) + 1); strcpy (debugfile, dir); /* FILENAME is absolute, so we don't need a "/" here. */ @@ -841,8 +831,6 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname, int is_safe; struct auto_load_pspace_info *pspace_info; - make_cleanup_fclose (input); - is_safe = file_is_auto_load_safe (debugfile, _("auto-load: Loading %s script \"%s\"" @@ -871,7 +859,7 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname, compiled in. And the extension language is required to implement this function. */ gdb_assert (sourcer != NULL); - sourcer (language, objfile, input, debugfile); + sourcer (language, objfile, input.get (), debugfile); } retval = 1; @@ -890,30 +878,28 @@ void auto_load_objfile_script (struct objfile *objfile, const struct extension_language_defn *language) { - char *realname = gdb_realpath (objfile_name (objfile)); - struct cleanup *cleanups = make_cleanup (xfree, realname); + gdb::unique_xmalloc_ptr realname + = gdb_realpath (objfile_name (objfile)); - if (!auto_load_objfile_script_1 (objfile, realname, language)) + if (!auto_load_objfile_script_1 (objfile, realname.get (), language)) { /* For Windows/DOS .exe executables, strip the .exe suffix, so that FOO-gdb.gdb could be used for FOO.exe, and try again. */ - size_t len = strlen (realname); + size_t len = strlen (realname.get ()); const size_t lexe = sizeof (".exe") - 1; - if (len > lexe && strcasecmp (realname + len - lexe, ".exe") == 0) + if (len > lexe && strcasecmp (realname.get () + len - lexe, ".exe") == 0) { len -= lexe; - realname[len] = '\0'; + realname.get ()[len] = '\0'; if (debug_auto_load) fprintf_unfiltered (gdb_stdlog, _("auto-load: Stripped .exe suffix, " "retrying with \"%s\".\n"), - realname); - auto_load_objfile_script_1 (objfile, realname, language); + realname.get ()); + auto_load_objfile_script_1 (objfile, realname.get (), language); } } - - do_cleanups (cleanups); } /* Subroutine of source_section_scripts to simplify it. @@ -927,10 +913,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 in_hash_table; objfile_script_sourcer_func *sourcer; /* Skip this script if support is not compiled in. */ @@ -952,27 +935,22 @@ source_script_file (struct auto_load_pspace_info *pspace_info, return; } - opened = find_and_open_script (file, 1 /*search_path*/, - &stream, &full_path); + gdb::optional opened = find_and_open_script (file, + 1 /*search_path*/); - cleanups = make_cleanup (null_cleanup, NULL); if (opened) { - make_cleanup_fclose (stream); - make_cleanup (xfree, full_path); - - if (!file_is_auto_load_safe (full_path, + if (!file_is_auto_load_safe (opened->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), + opened->full_path.get (), section_name, objfile_name (objfile))) - opened = 0; + opened.reset (); } else { - full_path = 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, too much noise. Instead, we print the warning once and tell the @@ -985,14 +963,16 @@ 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, bool (opened), file, + (opened + ? opened->full_path.get () + : NULL), 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, opened->stream.get (), + opened->full_path.get ()); } /* Subroutine of source_section_scripts to simplify it. @@ -1008,7 +988,7 @@ execute_script_contents (struct auto_load_pspace_info *pspace_info, { objfile_script_executor_func *executor; const char *newline, *script_text; - char *name, *end; + char *name; int is_safe, in_hash_table; struct cleanup *cleanups; @@ -1170,7 +1150,8 @@ auto_load_section_scripts (struct objfile *objfile, const char *section_name) bfd_byte *data = NULL; scripts_sect = bfd_get_section_by_name (abfd, section_name); - if (scripts_sect == NULL) + if (scripts_sect == NULL + || (bfd_get_section_flags (abfd, scripts_sect) & SEC_HAS_CONTENTS) == 0) return; if (!bfd_get_full_section_contents (abfd, scripts_sect, &data)) @@ -1231,13 +1212,14 @@ auto_load_new_objfile (struct objfile *objfile) /* Collect scripts to be printed in a vec. */ -typedef struct loaded_script *loaded_script_ptr; -DEF_VEC_P (loaded_script_ptr); - struct collect_matching_scripts_data { - VEC (loaded_script_ptr) **scripts_p; + collect_matching_scripts_data (std::vector *scripts_p_, + const extension_language_defn *language_) + : scripts_p (scripts_p_), language (language_) + {} + std::vector *scripts_p; const struct extension_language_defn *language; }; @@ -1247,11 +1229,12 @@ struct collect_matching_scripts_data static int collect_matching_scripts (void **slot, void *info) { - struct loaded_script *script = *slot; - struct collect_matching_scripts_data *data = info; + struct loaded_script *script = (struct loaded_script *) *slot; + struct collect_matching_scripts_data *data + = (struct collect_matching_scripts_data *) info; if (script->language == data->language && re_exec (script->name)) - VEC_safe_push (loaded_script_ptr, *data->scripts_p, script); + data->scripts_p->push_back (script); return 1; } @@ -1262,35 +1245,29 @@ static void print_script (struct loaded_script *script) { struct ui_out *uiout = current_uiout; - struct cleanup *chain; - chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); + ui_out_emit_tuple tuple_emitter (uiout, NULL); - ui_out_field_string (uiout, "loaded", script->loaded ? "Yes" : "No"); - ui_out_field_string (uiout, "script", script->name); - ui_out_text (uiout, "\n"); + uiout->field_string ("loaded", script->loaded ? "Yes" : "No"); + uiout->field_string ("script", script->name); + uiout->text ("\n"); /* If the name isn't the full path, print it too. */ if (script->full_path != NULL && strcmp (script->name, script->full_path) != 0) { - ui_out_text (uiout, "\tfull name: "); - ui_out_field_string (uiout, "full_path", script->full_path); - ui_out_text (uiout, "\n"); + uiout->text ("\tfull name: "); + uiout->field_string ("full_path", script->full_path); + uiout->text ("\n"); } - - do_cleanups (chain); } /* Helper for info_auto_load_scripts to sort the scripts by name. */ -static int -sort_scripts_by_name (const void *ap, const void *bp) +static bool +sort_scripts_by_name (loaded_script *a, loaded_script *b) { - const struct loaded_script *a = *(const struct loaded_script **) ap; - const struct loaded_script *b = *(const struct loaded_script **) bp; - - return FILENAME_CMP (a->name, b->name); + return FILENAME_CMP (a->name, b->name) < 0; } /* Special internal GDB value of auto_load_info_scripts's PATTERN identify @@ -1302,16 +1279,9 @@ char auto_load_info_scripts_pattern_nl[] = ""; Print SCRIPTS. */ static void -print_scripts (VEC (loaded_script_ptr) *scripts) +print_scripts (const std::vector &scripts) { - struct ui_out *uiout = current_uiout; - int i; - loaded_script_ptr script; - - qsort (VEC_address (loaded_script_ptr, scripts), - VEC_length (loaded_script_ptr, scripts), - sizeof (loaded_script_ptr), sort_scripts_by_name); - for (i = 0; VEC_iterate (loaded_script_ptr, scripts, i, script); ++i) + for (loaded_script *script : scripts) print_script (script); } @@ -1320,14 +1290,11 @@ print_scripts (VEC (loaded_script_ptr) *scripts) PATTERN. FROM_TTY is the usual GDB boolean for user interactivity. */ void -auto_load_info_scripts (char *pattern, int from_tty, +auto_load_info_scripts (const char *pattern, int from_tty, const struct extension_language_defn *language) { struct ui_out *uiout = current_uiout; struct auto_load_pspace_info *pspace_info; - struct cleanup *script_chain; - VEC (loaded_script_ptr) *script_files, *script_texts; - int nr_scripts; dont_repeat (); @@ -1349,65 +1316,64 @@ auto_load_info_scripts (char *pattern, int from_tty, Plus we want to sort the scripts by name. So first traverse the hash table collecting the matching scripts. */ - script_files = VEC_alloc (loaded_script_ptr, 10); - script_texts = VEC_alloc (loaded_script_ptr, 10); - script_chain = make_cleanup (VEC_cleanup (loaded_script_ptr), &script_files); - make_cleanup (VEC_cleanup (loaded_script_ptr), &script_texts); + std::vector script_files, script_texts; if (pspace_info != NULL && pspace_info->loaded_script_files != NULL) { - struct collect_matching_scripts_data data = { &script_files, language }; + collect_matching_scripts_data data (&script_files, language); /* Pass a pointer to scripts as VEC_safe_push can realloc space. */ htab_traverse_noresize (pspace_info->loaded_script_files, collect_matching_scripts, &data); + + std::sort (script_files.begin (), script_files.end (), + sort_scripts_by_name); } if (pspace_info != NULL && pspace_info->loaded_script_texts != NULL) { - struct collect_matching_scripts_data data = { &script_texts, language }; + collect_matching_scripts_data data (&script_texts, language); /* Pass a pointer to scripts as VEC_safe_push can realloc space. */ htab_traverse_noresize (pspace_info->loaded_script_texts, collect_matching_scripts, &data); + + std::sort (script_texts.begin (), script_texts.end (), + sort_scripts_by_name); } - nr_scripts = (VEC_length (loaded_script_ptr, script_files) - + VEC_length (loaded_script_ptr, script_texts)); + int nr_scripts = script_files.size () + script_texts.size (); /* Table header shifted right by preceding "gdb-scripts: " would not match its columns. */ if (nr_scripts > 0 && pattern == auto_load_info_scripts_pattern_nl) - ui_out_text (uiout, "\n"); + uiout->text ("\n"); - /* Note: This creates a cleanup to output the table end marker. */ - make_cleanup_ui_out_table_begin_end (uiout, 2, nr_scripts, - "AutoLoadedScriptsTable"); + { + ui_out_emit_table table_emitter (uiout, 2, nr_scripts, + "AutoLoadedScriptsTable"); - ui_out_table_header (uiout, 7, ui_left, "loaded", "Loaded"); - ui_out_table_header (uiout, 70, ui_left, "script", "Script"); - ui_out_table_body (uiout); + uiout->table_header (7, ui_left, "loaded", "Loaded"); + uiout->table_header (70, ui_left, "script", "Script"); + uiout->table_body (); - print_scripts (script_files); - print_scripts (script_texts); - - /* Finish up the table before checking for no matching scripts. */ - do_cleanups (script_chain); + print_scripts (script_files); + print_scripts (script_texts); + } if (nr_scripts == 0) { if (pattern && *pattern) - ui_out_message (uiout, 0, "No auto-load scripts matching %s.\n", - pattern); + uiout->message ("No auto-load scripts matching %s.\n", pattern); else - ui_out_message (uiout, 0, "No auto-load scripts.\n"); + uiout->message ("No auto-load scripts.\n"); } } /* Wrapper for "info auto-load gdb-scripts". */ static void -info_auto_load_gdb_scripts (char *pattern, int from_tty) +info_auto_load_gdb_scripts (const char *pattern, int from_tty) { auto_load_info_scripts (pattern, from_tty, &extension_language_gdb); } @@ -1415,7 +1381,7 @@ info_auto_load_gdb_scripts (char *pattern, int from_tty) /* Implement 'info auto-load local-gdbinit'. */ static void -info_auto_load_local_gdbinit (char *args, int from_tty) +info_auto_load_local_gdbinit (const char *args, int from_tty) { if (auto_load_local_gdbinit_pathname == NULL) printf_filtered (_("Local .gdbinit file was not found.\n")); @@ -1474,7 +1440,7 @@ Use `info auto-load %s-scripts [REGEXP]' to list them."), /* The only valid "set auto-load" argument is off|0|no|disable. */ static void -set_auto_load_cmd (char *args, int from_tty) +set_auto_load_cmd (const char *args, int from_tty) { struct cmd_list_element *list; size_t length; @@ -1523,7 +1489,7 @@ automatic loading of Python scripts."), "show auto-load " settings. */ static void -show_auto_load_cmd (char *args, int from_tty) +show_auto_load_cmd (const char *args, int from_tty) { cmd_show_list (*auto_load_show_cmdlist_get (), from_tty, ""); } @@ -1551,32 +1517,25 @@ automatic loading of Python scripts."), newlines at proper places. */ static void -info_auto_load_cmd (char *args, int from_tty) +info_auto_load_cmd (const char *args, int from_tty) { struct cmd_list_element *list; struct cleanup *infolist_chain; struct ui_out *uiout = current_uiout; - infolist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "infolist"); + ui_out_emit_tuple tuple_emitter (uiout, "infolist"); for (list = *auto_load_info_cmdlist_get (); list != NULL; list = list->next) { - struct cleanup *option_chain - = make_cleanup_ui_out_tuple_begin_end (uiout, "option"); + ui_out_emit_tuple option_emitter (uiout, "option"); gdb_assert (!list->prefixlist); gdb_assert (list->type == not_set_cmd); - ui_out_field_string (uiout, "name", list->name); - ui_out_text (uiout, ": "); + uiout->field_string ("name", list->name); + uiout->text (": "); cmd_func (list, auto_load_info_scripts_pattern_nl, from_tty); - - /* Close the tuple. */ - do_cleanups (option_chain); } - - /* Close the tuple. */ - do_cleanups (infolist_chain); } /* Initialize "info auto-load " commands prefix and return it. */ @@ -1597,8 +1556,6 @@ found and/or loaded."), return &retval; } -void _initialize_auto_load (void); - void _initialize_auto_load (void) {