Constify add_setshow_*
[deliverable/binutils-gdb.git] / gdb / auto-load.c
index 292f2ae88e9b46b8a230daeabcbf10b71a9cc04d..3d560146af4785181699ec951329ee1cd19be744 100644 (file)
@@ -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 <algorithm>
 
 /* The section to look in for auto-loaded scripts (in file formats that
    support sections).
@@ -139,7 +139,7 @@ static char *auto_load_dir;
 /* "set" command for the auto_load_dir configuration variable.  */
 
 static void
-set_auto_load_dir (char *args, int from_tty, struct cmd_list_element *c)
+set_auto_load_dir (const char *args, int from_tty, struct cmd_list_element *c)
 {
   /* Setting the variable to "" resets it to the compile time defaults.  */
   if (auto_load_dir[0] == '\0')
@@ -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<char> 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 ());
        }
     }
 }
@@ -263,7 +262,8 @@ auto_load_gdb_datadir_changed (void)
 /* "set" command for the auto_load_safe_path configuration variable.  */
 
 static void
-set_auto_load_safe_path (char *args, int from_tty, struct cmd_list_element *c)
+set_auto_load_safe_path (const char *args,
+                        int from_tty, struct cmd_list_element *c)
 {
   /* Setting the variable to "" resets it to the compile time defaults.  */
   if (auto_load_safe_path[0] == '\0')
@@ -302,7 +302,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 +323,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;
 
@@ -419,12 +419,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<char> *filename_realp)
 {
   char *pattern;
   int ix;
@@ -439,17 +438,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 +475,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<char> filename_real;
   static int advice_printed = 0;
 
   if (debug_auto_load)
@@ -489,34 +487,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 +516,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;
 }
 
@@ -891,30 +879,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<char> 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.
@@ -928,10 +914,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.  */
@@ -953,27 +936,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<open_script> 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
@@ -986,14 +964,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.
@@ -1233,13 +1213,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<loaded_script *> *scripts_p_,
+                                const extension_language_defn *language_)
+  : scripts_p (scripts_p_), language (language_)
+  {}
 
+  std::vector<loaded_script *> *scripts_p;
   const struct extension_language_defn *language;
 };
 
@@ -1254,7 +1235,7 @@ collect_matching_scripts (void **slot, void *info)
     = (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;
 }
@@ -1284,13 +1265,10 @@ print_script (struct loaded_script *script)
 
 /* 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,15 +1280,9 @@ char auto_load_info_scripts_pattern_nl[] = "";
    Print SCRIPTS.  */
 
 static void
-print_scripts (VEC (loaded_script_ptr) *scripts)
+print_scripts (const std::vector<loaded_script *> &scripts)
 {
-  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);
 }
 
@@ -1319,14 +1291,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 ();
 
@@ -1348,31 +1317,33 @@ 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<loaded_script *> 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.  */
@@ -1391,8 +1362,6 @@ auto_load_info_scripts (char *pattern, int from_tty,
     print_scripts (script_texts);
   }
 
-  do_cleanups (script_chain);
-
   if (nr_scripts == 0)
     {
       if (pattern && *pattern)
@@ -1405,7 +1374,7 @@ auto_load_info_scripts (char *pattern, int from_tty,
 /* 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);
 }
@@ -1413,7 +1382,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"));
@@ -1472,7 +1441,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;
@@ -1521,7 +1490,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, "");
 }
@@ -1549,7 +1518,7 @@ 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;
@@ -1588,8 +1557,6 @@ found and/or loaded."),
   return &retval;
 }
 
-void _initialize_auto_load (void);
-
 void
 _initialize_auto_load (void)
 {
This page took 0.031474 seconds and 4 git commands to generate.