daily update
[deliverable/binutils-gdb.git] / gdb / dsrec.c
index 60653809178378988e239d146df85c224124e92a..142260002ff8dcec2ab9dce81ac2ede065ec309b 100644 (file)
@@ -1,5 +1,6 @@
 /* S-record download support for GDB, the GNU debugger.
-   Copyright 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1997, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,6 +23,8 @@
 #include "serial.h"
 #include "srec.h"
 #include <time.h>
+#include "gdb_assert.h"
+#include "gdb_string.h"
 
 extern void report_transfer_performance (unsigned long, time_t, time_t);
 
@@ -32,19 +35,20 @@ static int make_srec (char *srec, CORE_ADDR targ_addr, bfd * abfd,
                      int flags);
 
 /* Download an executable by converting it to S records.  DESC is a
-   serial_t to send the data to.  FILE is the name of the file to be
-   loaded.  LOAD_OFFSET is the offset into memory to load data into.
-   It is usually specified by the user and is useful with the a.out
-   file format.  MAXRECSIZE is the length in chars of the largest
-   S-record the host can accomodate.  This is measured from the
-   starting `S' to the last char of the checksum.  FLAGS is various
-   random flags, and HASHMARK is non-zero to cause a `#' to be
+   `struct serial *' to send the data to.  FILE is the name of the
+   file to be loaded.  LOAD_OFFSET is the offset into memory to load
+   data into.  It is usually specified by the user and is useful with
+   the a.out file format.  MAXRECSIZE is the length in chars of the
+   largest S-record the host can accomodate.  This is measured from
+   the starting `S' to the last char of the checksum.  FLAGS is
+   various random flags, and HASHMARK is non-zero to cause a `#' to be
    printed out for each record loaded.  WAITACK, if non-NULL, is a
-   function that waits for an acknowledgement after each S-record,
-   and returns non-zero if the ack is read correctly.  */
+   function that waits for an acknowledgement after each S-record, and
+   returns non-zero if the ack is read correctly.  */
 
 void
-load_srec (serial_t desc, const char *file, bfd_vma load_offset, int maxrecsize,
+load_srec (struct serial *desc, const char *file, bfd_vma load_offset,
+          int maxrecsize,
           int flags, int hashmark, int (*waitack) (void))
 {
   bfd *abfd;
@@ -82,7 +86,7 @@ load_srec (serial_t desc, const char *file, bfd_vma load_offset, int maxrecsize,
       srec[reclen] = '\0';
       puts_debug ("sent -->", srec, "<--");
     }
-  SERIAL_WRITE (desc, srec, reclen);
+  serial_write (desc, srec, reclen);
 
   for (s = abfd->sections; s; s = s->next)
     if (s->flags & SEC_LOAD)
@@ -119,7 +123,7 @@ load_srec (serial_t desc, const char *file, bfd_vma load_offset, int maxrecsize,
               acknowledgement is sent back.  */
            do
              {
-               SERIAL_WRITE (desc, srec, reclen);
+               serial_write (desc, srec, reclen);
                if (ui_load_progress_hook)
                  if (ui_load_progress_hook (section_name, (unsigned long) i))
                    error ("Canceled the download");
@@ -155,14 +159,14 @@ load_srec (serial_t desc, const char *file, bfd_vma load_offset, int maxrecsize,
       puts_debug ("sent -->", srec, "<--");
     }
 
-  SERIAL_WRITE (desc, srec, reclen);
+  serial_write (desc, srec, reclen);
 
   /* Some monitors need these to wake up properly.  (Which ones? -sts)  */
-  SERIAL_WRITE (desc, "\r\r", 2);
+  serial_write (desc, "\r\r", 2);
   if (remote_debug)
     puts_debug ("sent -->", "\r\r", "<---");
 
-  SERIAL_FLUSH_INPUT (desc);
+  serial_flush_input (desc);
 
   report_transfer_performance (data_count, start_time, end_time);
 }
@@ -221,10 +225,6 @@ make_srec (char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect,
   const static char data_code_table[] = "123";
   const static char term_code_table[] = "987";
   const static char header_code_table[] = "000";
-  const static char *formats[] =
-  {"S%c%02X%04X",
-   "S%c%02X%06X",
-   "S%c%02X%08X"};
   char const *code_table;
   int addr_size;
   int payload_size;
@@ -241,6 +241,7 @@ make_srec (char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect,
     {
       tmp = flags >> SREC_TERM_SHIFT;  /* Term record */
       code_table = term_code_table;
+      binbuf = NULL;
     }
 
   if ((tmp & SREC_2_BYTE_ADDR) && (targ_addr <= 0xffff))
@@ -250,8 +251,9 @@ make_srec (char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect,
   else if (tmp & SREC_4_BYTE_ADDR)
     addr_size = 4;
   else
-    internal_error ("make_srec:  Bad address (0x%x), or bad flags (0x%x).",
-                   targ_addr, flags);
+    internal_error (__FILE__, __LINE__,
+                   "make_srec:  Bad address (0x%s), or bad flags (0x%x).",
+                   paddr (targ_addr), flags);
 
   /* Now that we know the address size, we can figure out how much
      data this record can hold.  */
@@ -267,9 +269,10 @@ make_srec (char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect,
     payload_size = 0;          /* Term or header packets have no payload */
 
   /* Output the header.  */
-
-  sprintf (srec, formats[addr_size - 2], code_table[addr_size - 2],
-          addr_size + payload_size + 1, (int) targ_addr);
+  snprintf (srec, (*maxrecsize) + 1, "S%c%02X%0*X",
+           code_table[addr_size - 2],
+           addr_size + payload_size + 1,
+           addr_size * 2, (int) targ_addr);
 
   /* Note that the checksum is calculated on the raw data, not the
      hexified data.  It includes the length, address and the data
@@ -283,6 +286,9 @@ make_srec (char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect,
               + ((targ_addr >> 16) & 0xff)
               + ((targ_addr >> 24) & 0xff));
 
+  /* NOTE: cagney/2003-08-10: The equation is old.  Check that the
+     recent snprintf changes match that equation.  */
+  gdb_assert (strlen (srec) == 1 + 1 + 2 + addr_size * 2);
   p = srec + 1 + 1 + 2 + addr_size * 2;
 
   /* Build the Srecord.  */
This page took 0.026331 seconds and 4 git commands to generate.