changeset 4729:fdbcbaea7296

(perldb): New function, plus subroutines.
author Richard M. Stallman <rms@gnu.org>
date Thu, 16 Sep 1993 20:02:25 +0000
parents 49643e1db119
children 09e1fb3bf84d
files lisp/gud.el
diffstat 1 files changed, 106 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gud.el	Thu Sep 16 15:34:08 1993 +0000
+++ b/lisp/gud.el	Thu Sep 16 20:02:25 1993 +0000
@@ -65,7 +65,7 @@
 
 (defun gud-find-file (f)
   (error "GUD not properly entered."))
-
+
 ;; ======================================================================
 ;; command definition
 
@@ -146,7 +146,7 @@
 ;; The job of the find-file method is to visit and return the buffer indicated
 ;; by the car of gud-tag-frame.  This may be a file name, a tag name, or
 ;; something else.
-
+
 ;; ======================================================================
 ;; gdb functions
 
@@ -247,7 +247,7 @@
   (run-hooks 'gdb-mode-hook)
   )
 
-
+
 ;; ======================================================================
 ;; sdb functions
 
@@ -326,7 +326,7 @@
   (setq comint-prompt-regexp  "\\(^\\|\n\\)\\*")
   (run-hooks 'sdb-mode-hook)
   )
-
+
 ;; ======================================================================
 ;; dbx functions
 
@@ -388,7 +388,7 @@
   (setq comint-prompt-regexp  "^[^)]*dbx) *")
   (run-hooks 'dbx-mode-hook)
   )
-
+
 ;; ======================================================================
 ;; xdb (HP PARISC debugger) functions
 
@@ -489,11 +489,112 @@
   (make-local-variable 'gud-xdb-accumulation)
   (setq gud-xdb-accumulation "")
   (run-hooks 'xdb-mode-hook))
+
+;; ======================================================================
+;; perldb functions
+
+;;; History of argument lists passed to perldb.
+(defvar gud-perldb-history nil)
+
+(defun gud-perldb-massage-args (file args)
+  (cons "-fullname" (cons file args)))
+
+;; There's no guarantee that Emacs will hand the filter the entire
+;; marker at once; it could be broken up across several strings.  We
+;; might even receive a big chunk with several markers in it.  If we
+;; receive a chunk of text which looks like it might contain the
+;; beginning of a marker, we save it here between calls to the
+;; filter.
+(defvar gud-perldb-marker-acc "")
+
+(defun gud-perldb-marker-filter (string)
+  (save-match-data
+    (setq gud-perldb-marker-acc (concat gud-perldb-marker-acc string))
+    (let ((output ""))
+
+      ;; Process all the complete markers in this chunk.
+      (while (string-match "^\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n"
+			   gud-perldb-marker-acc)
+	(setq
+
+	 ;; Extract the frame position from the marker.
+	 gud-last-frame
+	 (cons (substring gud-perldb-marker-acc (match-beginning 1) (match-end 1))
+	       (string-to-int (substring gud-perldb-marker-acc
+					 (match-beginning 2)
+					 (match-end 2))))
+
+	 ;; Append any text before the marker to the output we're going
+	 ;; to return - we don't include the marker in this text.
+	 output (concat output
+			(substring gud-perldb-marker-acc 0 (match-beginning 0)))
+
+	 ;; Set the accumulator to the remaining text.
+	 gud-perldb-marker-acc (substring gud-perldb-marker-acc (match-end 0))))
+
+      ;; Does the remaining text look like it might end with the
+      ;; beginning of another marker?  If it does, then keep it in
+      ;; gud-perldb-marker-acc until we receive the rest of it.  Since we
+      ;; know the full marker regexp above failed, it's pretty simple to
+      ;; test for marker starts.
+      (if (string-match "^\032.*\\'" gud-perldb-marker-acc)
+	  (progn
+	    ;; Everything before the potential marker start can be output.
+	    (setq output (concat output (substring gud-perldb-marker-acc
+						   0 (match-beginning 0))))
+
+	    ;; Everything after, we save, to combine with later input.
+	    (setq gud-perldb-marker-acc
+		  (substring gud-perldb-marker-acc (match-beginning 0))))
+
+	(setq output (concat output gud-perldb-marker-acc)
+	      gud-perldb-marker-acc ""))
+
+      output)))
+
+(defun gud-perldb-find-file (f)
+  (find-file-noselect f))
+
+;;;###autoload
+(defun perldb (command-line)
+  "Run perldb on program FILE in buffer *gud-FILE*.
+The directory containing FILE becomes the initial working directory
+and source-file directory for your debugger."
+  (interactive
+   (list (read-from-minibuffer "Run perldb (like this): "
+			       (if (consp gud-perldb-history)
+				   (car gud-perldb-history)
+				 "perldb ")
+			       nil nil
+			       '(gud-perldb-history . 1))))
+  (gud-overload-functions '((gud-massage-args . gud-perldb-massage-args)
+			    (gud-marker-filter . gud-perldb-marker-filter)
+			    (gud-find-file . gud-perldb-find-file)
+			    ))
+
+  (gud-common-init command-line)
+
+  (gud-def gud-break  "break %f:%l"  "\C-b" "Set breakpoint at current line.")
+  (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.")
+  (gud-def gud-remove "clear %l"     "\C-d" "Remove breakpoint at current line")
+  (gud-def gud-step   "step %p"      "\C-s" "Step one source line with display.")
+  (gud-def gud-stepi  "stepi %p"     "\C-i" "Step one instruction with display.")
+  (gud-def gud-next   "next %p"      "\C-n" "Step one line (skip functions).")
+  (gud-def gud-cont   "cont"         "\C-r" "Continue with display.")
+  (gud-def gud-finish "finish"       "\C-f" "Finish executing current function.")
+  (gud-def gud-up     "up %p"        "<" "Up N stack frames (numeric arg).")
+  (gud-def gud-down   "down %p"      ">" "Down N stack frames (numeric arg).")
+  (gud-def gud-print  "print %e"     "\C-p" "Evaluate C expression at point.")
+
+  (setq comint-prompt-regexp "^(.*perldb[+]?) *")
+  (run-hooks 'gdb-mode-hook)
+  )
 
 ;;
 ;; End of debugger-specific information
 ;;
 
+
 ;;; When we send a command to the debugger via gud-call, it's annoying
 ;;; to see the command and the new prompt inserted into the debugger's
 ;;; buffer; we have other ways of knowing the command has completed.