* monitor.c (monitor_debug): Fix remotedebug buffering.
[binutils-gdb.git] / gdb / monitor.c
index a7cece7c3bfbc537c44be6e997ba051816dddd8c..69edc9a1ad4cde4ca65d4bc7d4264f853cd5659e 100644 (file)
@@ -137,7 +137,23 @@ monitor_debug (prefix, string, suffix)
 
   /* print prefix and suffix after each line */
   static int new_line=1;
-  if (new_line==1) {   /* print prefix if last char was a newline */
+  static char *prev_prefix = "";
+  static char *prev_suffix = "";
+      
+  /* if the prefix is changing, print the previous suffix, a new line,
+     and the new prefix */
+  if (strcmp(prev_prefix, prefix) != 0 && !new_line)
+    {
+      fputs_unfiltered (prev_suffix, gdb_stderr);
+      fputs_unfiltered ("\n", gdb_stderr);
+      fputs_unfiltered (prefix, gdb_stderr);
+    }
+  prev_prefix = prefix;
+  prev_suffix = suffix;
+
+  /* print prefix if last char was a newline*/
+
+  if (new_line == 1) {
     fputs_unfiltered (prefix, gdb_stderr);
     new_line=0;
   }
@@ -446,7 +462,7 @@ monitor_expect_prompt (buf, buflen)
      char *buf;
      int buflen;
 {
-  return monitor_expect (PROMPT, buf, buflen);
+  return monitor_expect (current_monitor->prompt, buf, buflen);
 }
 
 /* Get N 32-bit words from remote, each preceded by a space, and put
@@ -679,10 +695,10 @@ monitor_resume (pid, step, sig)
 {
   dcache_flush (remote_dcache);
   if (step)
-    monitor_printf (STEP_CMD);
+    monitor_printf (current_monitor->step);
   else
     {
-      monitor_printf (CONT_CMD);
+      monitor_printf (current_monitor->cont);
       if (current_monitor->flags & MO_NEED_REGDUMP_AFTER_CONT)
        dump_reg_flag = 1;
     }
@@ -850,7 +866,7 @@ monitor_fetch_register (regno)
   char regbuf[MAX_REGISTER_RAW_SIZE * 2 + 1];
   int i;
 
-  name = REGNAMES (regno);
+  name = current_monitor->regnames[regno];
 
   if (!name)
     {
@@ -955,7 +971,7 @@ monitor_store_register (regno)
   char *name;
   unsigned int val;
 
-  name = REGNAMES (regno);
+  name = current_monitor->regnames[regno];
   if (!name)
     return;
 
@@ -1351,7 +1367,7 @@ monitor_insert_breakpoint (addr, shadow)
        {
          breakaddr[i] = addr;
          monitor_read_memory (addr, shadow, sizeof (break_insn));
-         monitor_printf (SET_BREAK_CMD, addr);
+         monitor_printf (current_monitor->set_break, addr);
          monitor_expect_prompt (NULL, 0);
          return 0;
        }
@@ -1376,9 +1392,9 @@ monitor_remove_breakpoint (addr, shadow)
          breakaddr[i] = 0;
          /* some monitors remove breakpoints based on the address */
          if (current_monitor->flags & MO_CLR_BREAK_USES_ADDR)   
-           monitor_printf (CLR_BREAK_CMD, addr);
+           monitor_printf (current_monitor->clr_break, addr);
          else
-           monitor_printf (CLR_BREAK_CMD, i);
+           monitor_printf (current_monitor->clr_break, i);
          monitor_expect_prompt (NULL, 0);
          return 0;
        }
@@ -1387,6 +1403,18 @@ monitor_remove_breakpoint (addr, shadow)
   return 1;
 }
 
+/* monitor_wait_srec_ack -- wait for the target to send an acknowledgement for
+   an S-record.  Return non-zero if the ACK is received properly.  */
+
+static int
+monitor_wait_srec_ack ()
+{
+  /* FIXME: eventually we'll want to be able to handle acknowledgements
+     of something other than a '+' character.  Right now this is only
+     going to work for EST visionICE.  */
+  return readchar (timeout) == '+';
+}
+
 /* monitor_load -- download a file. */
 
 static void
@@ -1400,11 +1428,13 @@ monitor_load (file, from_tty)
     current_monitor->load_routine (monitor_desc, file, hashmark);
   else
     {                          /* The default is ascii S-records */
-      monitor_printf (LOAD_CMD);       /* tell the monitor to load */
+      monitor_printf (current_monitor->load);
       if (current_monitor->loadresp)
        monitor_expect (current_monitor->loadresp, NULL, 0);
 
-      load_srec (monitor_desc, file, 32, SREC_ALL, hashmark);
+      load_srec (monitor_desc, file, 32, SREC_ALL, hashmark,
+                current_monitor->flags & MO_SREC_ACK ?
+                  monitor_wait_srec_ack : NULL);
 
       monitor_expect_prompt (NULL, 0);
     }
@@ -1450,7 +1480,7 @@ monitor_command (args, from_tty)
   if (monitor_desc == NULL)
     error ("monitor target not open.");
 
-  p = PROMPT;
+  p = current_monitor->prompt;
 
   /* Send the command.  Note that if no args were supplied, then we're
      just sending the monitor a newline, which is sometimes useful.  */