Move exit_status_set_internal_vars out of GLOBAL_CURDIR
[deliverable/binutils-gdb.git] / gdb / cli / cli-dump.c
index 8e59ed4f236056dbbdef7a3c03fe56cd2323f521..567ef2eeded00002a902221b38226a23e2364004 100644 (file)
@@ -1,6 +1,6 @@
 /* Dump-to-file commands, for GDB, the GNU debugger.
 
-   Copyright (C) 2002-2017 Free Software Foundation, Inc.
+   Copyright (C) 2002-2020 Free Software Foundation, Inc.
 
    Contributed by Red Hat.
 
 #include "completer.h"
 #include <ctype.h>
 #include "target.h"
-#include "readline/readline.h"
+#include "readline/tilde.h"
 #include "gdbcore.h"
 #include "cli/cli-utils.h"
 #include "gdb_bfd.h"
-#include "filestuff.h"
-#include "common/byte-vector.h"
+#include "gdbsupport/filestuff.h"
+#include "gdbsupport/byte-vector.h"
+#include "gdbarch.h"
 
 static gdb::unique_xmalloc_ptr<char>
 scan_expression (const char **cmd, const char *def)
 {
   if ((*cmd) == NULL || (**cmd) == '\0')
-    return gdb::unique_xmalloc_ptr<char> (xstrdup (def));
+    return make_unique_xstrdup (def);
   else
     {
       char *exp;
@@ -45,7 +46,7 @@ scan_expression (const char **cmd, const char *def)
 
       end = (*cmd) + strcspn (*cmd, " \t");
       exp = savestring ((*cmd), end - (*cmd));
-      (*cmd) = skip_spaces_const (end);
+      (*cmd) = skip_spaces (end);
       return gdb::unique_xmalloc_ptr<char> (exp);
     }
 }
@@ -55,7 +56,6 @@ static gdb::unique_xmalloc_ptr<char>
 scan_filename (const char **cmd, const char *defname)
 {
   gdb::unique_xmalloc_ptr<char> filename;
-  char *fullname;
 
   /* FIXME: Need to get the ``/a(ppend)'' flag from somewhere.  */
 
@@ -71,10 +71,10 @@ scan_filename (const char **cmd, const char *defname)
       /* FIXME: should parse a possibly quoted string.  */
       const char *end;
 
-      (*cmd) = skip_spaces_const (*cmd);
+      (*cmd) = skip_spaces (*cmd);
       end = *cmd + strcspn (*cmd, " \t");
       filename.reset (savestring ((*cmd), end - (*cmd)));
-      (*cmd) = skip_spaces_const (end);
+      (*cmd) = skip_spaces (end);
     }
   gdb_assert (filename != NULL);
 
@@ -128,20 +128,6 @@ static struct cmd_list_element *tekhex_cmdlist;
 static struct cmd_list_element *binary_dump_cmdlist;
 static struct cmd_list_element *binary_append_cmdlist;
 
-static void
-dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
-  help_list (dump_cmdlist, "dump ", all_commands, gdb_stdout);
-}
-
-static void
-append_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"append\" must be followed by a subcommand.\n\n"));
-  help_list (dump_cmdlist, "append ", all_commands, gdb_stdout);
-}
-
 static void
 dump_binary_file (const char *filename, const char *mode, 
                  const bfd_byte *buf, ULONGEST len)
@@ -163,12 +149,10 @@ dump_bfd_file (const char *filename, const char *mode,
 
   gdb_bfd_ref_ptr obfd (bfd_openw_or_error (filename, target, mode));
   osection = bfd_make_section_anyway (obfd.get (), ".newsec");
-  bfd_set_section_size (obfd.get (), osection, len);
-  bfd_set_section_vma (obfd.get (), osection, vaddr);
-  bfd_set_section_alignment (obfd.get (), osection, 0);
-  bfd_set_section_flags (obfd.get (), osection, (SEC_HAS_CONTENTS
-                                                | SEC_ALLOC
-                                                | SEC_LOAD));
+  bfd_set_section_size (osection, len);
+  bfd_set_section_vma (osection, vaddr);
+  bfd_set_section_alignment (osection, 0);
+  bfd_set_section_flags (osection, (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD));
   osection->entsize = 0;
   if (!bfd_set_section_contents (obfd.get (), osection, buf, 0, len))
     warning (_("writing dump file '%s' (%s)"), filename,
@@ -215,7 +199,7 @@ dump_memory_to_file (const char *cmd, const char *mode, const char *file_format)
 }
 
 static void
-dump_memory_command (char *cmd, const char *mode)
+dump_memory_command (const char *cmd, const char *mode)
 {
   dump_memory_to_file (cmd, mode, "binary");
 }
@@ -260,91 +244,91 @@ dump_value_to_file (const char *cmd, const char *mode, const char *file_format)
 }
 
 static void
-dump_value_command (char *cmd, const char *mode)
+dump_value_command (const char *cmd, const char *mode)
 {
   dump_value_to_file (cmd, mode, "binary");
 }
 
 static void
-dump_srec_memory (char *args, int from_tty)
+dump_srec_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_WB, "srec");
 }
 
 static void
-dump_srec_value (char *args, int from_tty)
+dump_srec_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_WB, "srec");
 }
 
 static void
-dump_ihex_memory (char *args, int from_tty)
+dump_ihex_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_WB, "ihex");
 }
 
 static void
-dump_ihex_value (char *args, int from_tty)
+dump_ihex_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_WB, "ihex");
 }
 
 static void
-dump_verilog_memory (char *args, int from_tty)
+dump_verilog_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_WB, "verilog");
 }
 
 static void
-dump_verilog_value (char *args, int from_tty)
+dump_verilog_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_WB, "verilog");
 }
 
 static void
-dump_tekhex_memory (char *args, int from_tty)
+dump_tekhex_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_WB, "tekhex");
 }
 
 static void
-dump_tekhex_value (char *args, int from_tty)
+dump_tekhex_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_WB, "tekhex");
 }
 
 static void
-dump_binary_memory (char *args, int from_tty)
+dump_binary_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_WB, "binary");
 }
 
 static void
-dump_binary_value (char *args, int from_tty)
+dump_binary_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_WB, "binary");
 }
 
 static void
-append_binary_memory (char *args, int from_tty)
+append_binary_memory (const char *args, int from_tty)
 {
   dump_memory_to_file (args, FOPEN_AB, "binary");
 }
 
 static void
-append_binary_value (char *args, int from_tty)
+append_binary_value (const char *args, int from_tty)
 {
   dump_value_to_file (args, FOPEN_AB, "binary");
 }
 
 struct dump_context
 {
-  void (*func) (char *cmd, const char *mode);
+  void (*func) (const char *cmd, const char *mode);
   const char *mode;
 };
 
 static void
-call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
+call_dump_func (struct cmd_list_element *c, const char *args, int from_tty)
 {
   struct dump_context *d = (struct dump_context *) get_cmd_context (c);
 
@@ -353,14 +337,14 @@ call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
 
 static void
 add_dump_command (const char *name,
-                 void (*func) (char *args, const char *mode),
+                 void (*func) (const char *args, const char *mode),
                  const char *descr)
 
 {
   struct cmd_list_element *c;
   struct dump_context *d;
 
-  c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
+  c = add_cmd (name, all_commands, descr, &dump_cmdlist);
   c->completer =  filename_completer;
   d = XNEW (struct dump_context);
   d->func = func;
@@ -368,7 +352,7 @@ add_dump_command (const char *name,
   set_cmd_context (c, d);
   c->func = call_dump_func;
 
-  c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
+  c = add_cmd (name, all_commands, descr, &append_cmdlist);
   c->completer =  filename_completer;
   d = XNEW (struct dump_context);
   d->func = func;
@@ -403,15 +387,15 @@ static void
 restore_section_callback (bfd *ibfd, asection *isec, void *args)
 {
   struct callback_data *data = (struct callback_data *) args;
-  bfd_vma sec_start  = bfd_section_vma (ibfd, isec);
-  bfd_size_type size = bfd_section_size (ibfd, isec);
+  bfd_vma sec_start  = bfd_section_vma (isec);
+  bfd_size_type size = bfd_section_size (isec);
   bfd_vma sec_end    = sec_start + size;
   bfd_size_type sec_offset = 0;
   bfd_size_type sec_load_count = size;
   int ret;
 
   /* Ignore non-loadable sections, eg. from elf files.  */
-  if (!(bfd_get_section_flags (ibfd, isec) & SEC_LOAD))
+  if (!(bfd_section_flags (isec) & SEC_LOAD))
     return;
 
   /* Does the section overlap with the desired restore range? */
@@ -420,7 +404,7 @@ restore_section_callback (bfd *ibfd, asection *isec, void *args)
     {
       /* No, no useable data in this section.  */
       printf_filtered (_("skipping section %s...\n"), 
-                      bfd_section_name (ibfd, isec));
+                      bfd_section_name (isec));
       return;
     }
 
@@ -441,7 +425,7 @@ restore_section_callback (bfd *ibfd, asection *isec, void *args)
           bfd_errmsg (bfd_get_error ()));
 
   printf_filtered ("Restoring section %s (0x%lx to 0x%lx)",
-                  bfd_section_name (ibfd, isec), 
+                  bfd_section_name (isec), 
                   (unsigned long) sec_start, 
                   (unsigned long) sec_end);
 
@@ -469,6 +453,9 @@ restore_binary_file (const char *filename, struct callback_data *data)
   gdb_file_up file = gdb_fopen_cloexec (filename, FOPEN_RB);
   long len;
 
+  if (file == NULL)
+    error (_("Failed to open %s: %s"), filename, safe_strerror (errno));
+
   /* Get the file size for reading.  */
   if (fseek (file.get (), 0, SEEK_END) == 0)
     {
@@ -513,12 +500,10 @@ restore_binary_file (const char *filename, struct callback_data *data)
 }
 
 static void
-restore_command (char *args_in, int from_tty)
+restore_command (const char *args, int from_tty)
 {
   struct callback_data data;
-  bfd *ibfd;
   int binary_flag = 0;
-  const char *args = args_in;
 
   if (!target_has_execution)
     noprocess ();
@@ -538,7 +523,7 @@ restore_command (char *args_in, int from_tty)
        {
          binary_flag = 1;
          args += strlen (binary_string);
-         args = skip_spaces_const (args);
+         args = skip_spaces (args);
        }
       /* Parse offset (optional).  */
       if (args != NULL && *args != '\0')
@@ -580,64 +565,22 @@ restore_command (char *args_in, int from_tty)
     }
 }
 
-static void
-srec_dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump srec\" must be followed by a subcommand.\n"));
-  help_list (srec_cmdlist, "dump srec ", all_commands, gdb_stdout);
-}
-
-static void
-ihex_dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump ihex\" must be followed by a subcommand.\n"));
-  help_list (ihex_cmdlist, "dump ihex ", all_commands, gdb_stdout);
-}
-
-static void
-verilog_dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump verilog\" must be followed by a subcommand.\n"));
-  help_list (verilog_cmdlist, "dump verilog ", all_commands, gdb_stdout);
-}
-
-static void
-tekhex_dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump tekhex\" must be followed by a subcommand.\n"));
-  help_list (tekhex_cmdlist, "dump tekhex ", all_commands, gdb_stdout);
-}
-
-static void
-binary_dump_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"dump binary\" must be followed by a subcommand.\n"));
-  help_list (binary_dump_cmdlist, "dump binary ", all_commands, gdb_stdout);
-}
-
-static void
-binary_append_command (char *cmd, int from_tty)
-{
-  printf_unfiltered (_("\"append binary\" must be followed by a subcommand.\n"));
-  help_list (binary_append_cmdlist, "append binary ", all_commands,
-            gdb_stdout);
-}
-
+void _initialize_cli_dump ();
 void
-_initialize_cli_dump (void)
+_initialize_cli_dump ()
 {
   struct cmd_list_element *c;
 
-  add_prefix_cmd ("dump", class_vars, dump_command,
-                 _("Dump target code/data to a local file."),
-                 &dump_cmdlist, "dump ",
-                 0/*allow-unknown*/,
-                 &cmdlist);
-  add_prefix_cmd ("append", class_vars, append_command,
-                 _("Append target code/data to a local file."),
-                 &append_cmdlist, "append ",
-                 0/*allow-unknown*/,
-                 &cmdlist);
+  add_basic_prefix_cmd ("dump", class_vars,
+                       _("Dump target code/data to a local file."),
+                       &dump_cmdlist, "dump ",
+                       0/*allow-unknown*/,
+                       &cmdlist);
+  add_basic_prefix_cmd ("append", class_vars,
+                       _("Append target code/data to a local file."),
+                       &append_cmdlist, "append ",
+                       0/*allow-unknown*/,
+                       &cmdlist);
 
   add_dump_command ("memory", dump_memory_command, "\
 Write contents of memory to a raw binary file.\n\
@@ -649,41 +592,41 @@ Write the value of an expression to a raw binary file.\n\
 Arguments are FILE EXPRESSION.  Writes the value of EXPRESSION to\n\
 the specified FILE in raw target ordered bytes.");
 
-  add_prefix_cmd ("srec", all_commands, srec_dump_command,
-                 _("Write target code/data to an srec file."),
-                 &srec_cmdlist, "dump srec ", 
-                 0 /*allow-unknown*/, 
-                 &dump_cmdlist);
-
-  add_prefix_cmd ("ihex", all_commands, ihex_dump_command,
-                 _("Write target code/data to an intel hex file."),
-                 &ihex_cmdlist, "dump ihex ", 
-                 0 /*allow-unknown*/, 
-                 &dump_cmdlist);
-
-  add_prefix_cmd ("verilog", all_commands, verilog_dump_command,
-                 _("Write target code/data to a verilog hex file."),
-                 &verilog_cmdlist, "dump verilog ",
-                 0 /*allow-unknown*/,
-                 &dump_cmdlist);
-
-  add_prefix_cmd ("tekhex", all_commands, tekhex_dump_command,
-                 _("Write target code/data to a tekhex file."),
-                 &tekhex_cmdlist, "dump tekhex ", 
-                 0 /*allow-unknown*/, 
-                 &dump_cmdlist);
-
-  add_prefix_cmd ("binary", all_commands, binary_dump_command,
-                 _("Write target code/data to a raw binary file."),
-                 &binary_dump_cmdlist, "dump binary ", 
-                 0 /*allow-unknown*/, 
-                 &dump_cmdlist);
-
-  add_prefix_cmd ("binary", all_commands, binary_append_command,
-                 _("Append target code/data to a raw binary file."),
-                 &binary_append_cmdlist, "append binary ", 
-                 0 /*allow-unknown*/, 
-                 &append_cmdlist);
+  add_basic_prefix_cmd ("srec", all_commands,
+                       _("Write target code/data to an srec file."),
+                       &srec_cmdlist, "dump srec ", 
+                       0 /*allow-unknown*/, 
+                       &dump_cmdlist);
+
+  add_basic_prefix_cmd ("ihex", all_commands,
+                       _("Write target code/data to an intel hex file."),
+                       &ihex_cmdlist, "dump ihex ", 
+                       0 /*allow-unknown*/, 
+                       &dump_cmdlist);
+
+  add_basic_prefix_cmd ("verilog", all_commands,
+                       _("Write target code/data to a verilog hex file."),
+                       &verilog_cmdlist, "dump verilog ",
+                       0 /*allow-unknown*/,
+                       &dump_cmdlist);
+
+  add_basic_prefix_cmd ("tekhex", all_commands,
+                       _("Write target code/data to a tekhex file."),
+                       &tekhex_cmdlist, "dump tekhex ", 
+                       0 /*allow-unknown*/, 
+                       &dump_cmdlist);
+
+  add_basic_prefix_cmd ("binary", all_commands,
+                       _("Write target code/data to a raw binary file."),
+                       &binary_dump_cmdlist, "dump binary ", 
+                       0 /*allow-unknown*/, 
+                       &dump_cmdlist);
+
+  add_basic_prefix_cmd ("binary", all_commands,
+                       _("Append target code/data to a raw binary file."),
+                       &binary_append_cmdlist, "append binary ", 
+                       0 /*allow-unknown*/, 
+                       &append_cmdlist);
 
   add_cmd ("memory", all_commands, dump_srec_memory, _("\
 Write contents of memory to an srec file.\n\
This page took 0.031444 seconds and 4 git commands to generate.