Replace clear_hook_in_cleanup with scoped_restore_hook_in
[deliverable/binutils-gdb.git] / gdb / source.c
index 0453f922a297495a67ddb227f83bd128c7ad6bcf..0564c1581b488178c8c423e1a44040ed2d540162 100644 (file)
 #define OPEN_MODE (O_RDONLY | O_BINARY)
 #define FDOPEN_MODE FOPEN_RB
 
-/* Prototypes for exported functions.  */
-
-void _initialize_source (void);
-
 /* Prototypes for local functions.  */
 
 static int get_filename_and_charpos (struct symtab *, char **);
@@ -60,9 +56,9 @@ static void reverse_search_command (char *, int);
 
 static void forward_search_command (char *, int);
 
-static void line_info (char *, int);
+static void info_line_command (char *, int);
 
-static void source_info (char *, int);
+static void info_source_command (char *, int);
 
 /* Path of directories to search for source files.
    Same format as the PATH environment variable's value.  */
@@ -182,7 +178,7 @@ get_lines_to_list (void)
 struct symtab_and_line
 get_current_source_symtab_and_line (void)
 {
-  struct symtab_and_line cursal = { 0 };
+  symtab_and_line cursal;
 
   cursal.pspace = current_source_pspace;
   cursal.symtab = current_source_symtab;
@@ -218,9 +214,9 @@ set_default_source_symtab_and_line (void)
    NOTE: The returned sal pc and end fields are not valid.  */
    
 struct symtab_and_line
-set_current_source_symtab_and_line (const struct symtab_and_line *sal)
+set_current_source_symtab_and_line (const symtab_and_line &sal)
 {
-  struct symtab_and_line cursal = { 0 };
+  symtab_and_line cursal;
 
   cursal.pspace = current_source_pspace;
   cursal.symtab = current_source_symtab;
@@ -228,9 +224,9 @@ set_current_source_symtab_and_line (const struct symtab_and_line *sal)
   cursal.pc = 0;
   cursal.end = 0;
 
-  current_source_pspace = sal->pspace;
-  current_source_symtab = sal->symtab;
-  current_source_line = sal->line;
+  current_source_pspace = sal.pspace;
+  current_source_symtab = sal.symtab;
+  current_source_line = sal.line;
 
   /* Force the next "list" to center around the current line.  */
   clear_lines_listed_range ();
@@ -258,8 +254,6 @@ clear_current_source_symtab_and_line (void)
 void
 select_source_symtab (struct symtab *s)
 {
-  struct symtabs_and_lines sals;
-  struct symtab_and_line sal;
   struct objfile *ofp;
   struct compunit_symtab *cu;
 
@@ -278,10 +272,10 @@ select_source_symtab (struct symtab *s)
      if one exists.  */
   if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0).symbol)
     {
-      sals = decode_line_with_current_source (main_name (),
-                                             DECODE_LINE_FUNFIRSTLINE);
-      sal = sals.sals[0];
-      xfree (sals.sals);
+      std::vector<symtab_and_line> sals
+       = decode_line_with_current_source (main_name (),
+                                          DECODE_LINE_FUNFIRSTLINE);
+      const symtab_and_line &sal = sals[0];
       current_source_pspace = sal.pspace;
       current_source_symtab = sal.symtab;
       current_source_line = std::max (sal.line - (lines_to_list - 1), 1);
@@ -649,7 +643,7 @@ add_path (char *dirname, char **which_path, int parse_separators)
 
 
 static void
-source_info (char *ignore, int from_tty)
+info_source_command (char *ignore, int from_tty)
 {
   struct symtab *s = current_source_symtab;
   struct compunit_symtab *cust;
@@ -994,13 +988,12 @@ get_substitute_path_rule (const char *path)
 }
 
 /* If the user specified a source path substitution rule that applies
-   to PATH, then apply it and return the new path.  This new path must
-   be deallocated afterwards.
-   
+   to PATH, then apply it and return the new path.
+
    Return NULL if no substitution rule was specified by the user,
    or if no rule applied to the given PATH.  */
-   
-char *
+
+gdb::unique_xmalloc_ptr<char>
 rewrite_source_path (const char *path)
 {
   const struct substitute_path_rule *rule = get_substitute_path_rule (path);
@@ -1019,7 +1012,7 @@ rewrite_source_path (const char *path)
   strcpy (new_path, rule->to);
   strcat (new_path, path + from_len);
 
-  return new_path;
+  return gdb::unique_xmalloc_ptr<char> (new_path);
 }
 
 int
@@ -1030,7 +1023,6 @@ 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.  */
 
@@ -1039,7 +1031,7 @@ find_and_open_source (const char *filename,
       /* The user may have requested that source paths be rewritten
          according to substitution rules he provided.  If a substitution
          rule applies to this path, then apply it.  */
-      char *rewritten_fullname = rewrite_source_path (*fullname);
+      char *rewritten_fullname = rewrite_source_path (*fullname).release ();
 
       if (rewritten_fullname != NULL)
         {
@@ -1062,21 +1054,17 @@ find_and_open_source (const char *filename,
       *fullname = NULL;
     }
 
-  cleanup = make_cleanup (null_cleanup, NULL);
-
+  gdb::unique_xmalloc_ptr<char> rewritten_dirname;
   if (dirname != NULL)
     {
       /* If necessary, rewrite the compilation directory name according
          to the source path substitution rules specified by the user.  */
 
-      char *rewritten_dirname = rewrite_source_path (dirname);
+      rewritten_dirname = rewrite_source_path (dirname);
 
       if (rewritten_dirname != NULL)
-        {
-          make_cleanup (xfree, rewritten_dirname);
-          dirname = rewritten_dirname;
-        }
-      
+       dirname = rewritten_dirname.get ();
+
       /* Replace a path entry of $cdir with the compilation directory
         name.  */
 #define        cdir_len        5
@@ -1098,17 +1086,15 @@ find_and_open_source (const char *filename,
        }
     }
 
+  gdb::unique_xmalloc_ptr<char> rewritten_filename;
   if (IS_ABSOLUTE_PATH (filename))
     {
       /* If filename is absolute path, try the source path
         substitution on it.  */
-      char *rewritten_filename = rewrite_source_path (filename);
+      rewritten_filename = rewrite_source_path (filename);
 
       if (rewritten_filename != NULL)
-        {
-          make_cleanup (xfree, rewritten_filename);
-          filename = rewritten_filename;
-        }
+       filename = rewritten_filename.get ();
     }
 
   result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
@@ -1122,7 +1108,6 @@ find_and_open_source (const char *filename,
                        OPEN_MODE, fullname);
     }
 
-  do_cleanups (cleanup);
   return result;
 }
 
@@ -1164,23 +1149,20 @@ symtab_to_fullname (struct symtab *s)
        close (fd);
       else
        {
-         char *fullname;
-         struct cleanup *back_to;
+         gdb::unique_xmalloc_ptr<char> fullname;
 
          /* rewrite_source_path would be applied by find_and_open_source, we
             should report the pathname where GDB tried to find the file.  */
 
          if (SYMTAB_DIRNAME (s) == NULL || IS_ABSOLUTE_PATH (s->filename))
-           fullname = xstrdup (s->filename);
+           fullname.reset (xstrdup (s->filename));
          else
-           fullname = concat (SYMTAB_DIRNAME (s), SLASH_STRING,
-                              s->filename, (char *) NULL);
+           fullname.reset (concat (SYMTAB_DIRNAME (s), SLASH_STRING,
+                                   s->filename, (char *) NULL));
 
-         back_to = make_cleanup (xfree, fullname);
-         s->fullname = rewrite_source_path (fullname);
+         s->fullname = rewrite_source_path (fullname.get ()).release ();
          if (s->fullname == NULL)
-           s->fullname = xstrdup (fullname);
-         do_cleanups (back_to);
+           s->fullname = fullname.release ();
        }
     } 
 
@@ -1502,43 +1484,38 @@ print_source_lines (struct symtab *s, int line, int stopline,
 /* Print info on range of pc's in a specified line.  */
 
 static void
-line_info (char *arg, int from_tty)
+info_line_command (char *arg, int from_tty)
 {
-  struct symtabs_and_lines sals;
-  struct symtab_and_line sal;
   CORE_ADDR start_pc, end_pc;
-  int i;
-  struct cleanup *cleanups;
 
-  init_sal (&sal);             /* initialize to zeroes */
+  std::vector<symtab_and_line> decoded_sals;
+  symtab_and_line curr_sal;
+  gdb::array_view<symtab_and_line> sals;
 
   if (arg == 0)
     {
-      sal.symtab = current_source_symtab;
-      sal.pspace = current_program_space;
+      curr_sal.symtab = current_source_symtab;
+      curr_sal.pspace = current_program_space;
       if (last_line_listed != 0)
-       sal.line = last_line_listed;
+       curr_sal.line = last_line_listed;
       else
-       sal.line = current_source_line;
+       curr_sal.line = current_source_line;
 
-      sals.nelts = 1;
-      sals.sals = XNEW (struct symtab_and_line);
-      sals.sals[0] = sal;
+      sals = curr_sal;
     }
   else
     {
-      sals = decode_line_with_last_displayed (arg, DECODE_LINE_LIST_MODE);
+      decoded_sals = decode_line_with_last_displayed (arg,
+                                                     DECODE_LINE_LIST_MODE);
+      sals = decoded_sals;
 
       dont_repeat ();
     }
 
-  cleanups = make_cleanup (xfree, sals.sals);
-
   /* C++  More than one line may have been specified, as when the user
      specifies an overloaded function name.  Print info on them all.  */
-  for (i = 0; i < sals.nelts; i++)
+  for (const auto &sal : sals)
     {
-      sal = sals.sals[i];
       if (sal.pspace != current_program_space)
        continue;
 
@@ -1599,7 +1576,7 @@ line_info (char *arg, int from_tty)
 
          /* If this is the only line, show the source code.  If it could
             not find the file, don't do anything special.  */
-         if (annotation_level && sals.nelts == 1)
+         if (annotation_level && sals.size () == 1)
            identify_source_line (sal.symtab, sal.line, 0, start_pc);
        }
       else
@@ -1609,7 +1586,6 @@ line_info (char *arg, int from_tty)
        printf_filtered (_("Line number %d is out of range for \"%s\".\n"),
                         sal.line, symtab_to_filename_for_display (sal.symtab));
     }
-  do_cleanups (cleanups);
 }
 \f
 /* Commands to search the source file for a regexp.  */
@@ -2037,10 +2013,10 @@ Setting the value to an empty string sets it to $cdir:$cwd, the default."),
                            show_directories_command,
                            &setlist, &showlist);
 
-  add_info ("source", source_info,
+  add_info ("source", info_source_command,
            _("Information about the current source file."));
 
-  add_info ("line", line_info, _("\
+  add_info ("line", info_line_command, _("\
 Core addresses of the code for a source line.\n\
 Line can be specified as\n\
   LINENUM, to list around that line in current file,\n\
This page took 0.027736 seconds and 4 git commands to generate.