Subject: bug#14847: closed (Re: bug#14847: 24.1; gdb-mi.el does not handle backslashes as quotes)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 12 Jul 2013 18:21:02 +0000

Your bug report

#14847: 24.1; gdb-mi.el does not handle backslashes as quotes

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
14847: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14847
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#14847: 24.1; gdb-mi.el does not handle backslashes as quotes
From: Eli Zaretskii <[email-masked]>
To: Sergio Durigan Junior <[email-masked]>
Cc: [email-masked]
Date: Fri, 12 Jul 2013 21:20:22 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Sergio Durigan Junior <[email-masked]>
> Cc: [email-masked]
> Date: Fri, 12 Jul 2013 12:51:24 -0300
> 
> Thanks for testing!  You're doing nothing wrong, the patch is the
> culprit.  `gdb-send' checks for commands starting with "-", but this
> check should be disabled when a command is being continued.
> 
> Could you please try the following version?

Thanks, this works, so I committed this version, and I'm closing the
bug.

Subject: 24.1; gdb-mi.el does not handle backslashes as quotes
From: Sergio Durigan Junior <[email-masked]>
To: [email-masked]
Date: Fri, 12 Jul 2013 00:51:20 -0300
List-Id: <debbugs-submit.debbugs.gnu.org>

If you start gdb-mi.el (on Emacs 24.1), and try to use backslashes to
quote/break long lines, it is not handled correctly.  For example,
suppose your program being debugged inside GDB takes 3 arguments.  You
could run it with:

    (gdb) file myprogram
    Reading symbols from myprogram...done.
    (gdb) run \
    first_arg \
    second_arg \
    third_arg

GDB should correctly run the binary using the 3 args.  However, inside
Emacs, you receive an error:

    Undefined command: "third_arg".  Try "help".

This is because gdb-mi.el is not handling the backslashes correctly.
The error is specifically on the function `gdb_send', and the patch
inlined in this message fixes this.  The patch can also be seen on:

<https://lists.gnu.org/archive/html/emacs-devel/2013-07/msg00423.html>

And there is also a GDB bug related to this issue:

<http://sourceware.org/bugzilla/show_bug.cgi?id=15596>

Thanks.

lisp/ChangeLog:
2013-07-12  Sergio Durigan Junior  <[email-masked]>

	* progmodes/gdb-mi.el (gdb-strip-string-backslash): New function.
	(gdb-send): Correctly handle continuation strings with
	backslashes, and properly set the last command typed.

diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 2c4d6a0..87c5f98 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -1759,6 +1759,9 @@ static char *magick[] = {
 As long as GDB is in the recursive reading loop, it does not expect
 commands to be prefixed by \"-interpreter-exec console\".")
 
+(defun gdb-strip-string-backslash (string)
+  (replace-regexp-in-string "\\\\$" "" string))
+
 (defun gdb-send (proc string)
   "A comint send filter for gdb."
   (with-current-buffer gud-comint-buffer
@@ -1766,8 +1769,13 @@ commands to be prefixed by \"-interpreter-exec console\".")
       (remove-text-properties (point-min) (point-max) '(face))))
   ;; mimic <RET> key to repeat previous command in GDB
   (if (not (string= "" string))
-      (setq gdb-last-command string)
-    (if gdb-last-command (setq string gdb-last-command)))
+      (if gdb-continuation
+	  (setq gdb-last-command (concat gdb-continuation
+					 (gdb-strip-string-backslash string)
+					 " "))
+	(setq gdb-last-command (gdb-strip-string-backslash string)))
+    (if gdb-last-command (setq string gdb-last-command))
+    (setq gdb-continuation nil))
   (if (or (string-match "^-" string)
 	  (> gdb-control-level 0))
       ;; Either MI command or we are feeding GDB's recursive reading loop.
@@ -1779,10 +1787,13 @@ commands to be prefixed by \"-interpreter-exec console\".")
 	    (setq gdb-control-level (1- gdb-control-level))))
     ;; CLI command
     (if (string-match "\\\\$" string)
-	(setq gdb-continuation (concat gdb-continuation string "\n"))
+	(setq gdb-continuation
+	      (concat gdb-continuation (gdb-strip-string-backslash
+					string)
+		      " "))
       (setq gdb-first-done-or-error t)
       (let ((to-send (concat "-interpreter-exec console "
-                             (gdb-mi-quote string)
+                             (gdb-mi-quote (concat gdb-continuation string " "))
                              "\n")))
         (if gdb-enable-debug
             (push (cons 'mi-send to-send) gdb-debug-log))