;; Maintainer: FSF
;; Keywords: unix, tools
-;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
(global-set-key (concat gud-key-prefix "\C-l") 'gud-refresh)
(define-key ctl-x-map " " 'gud-break) ;; backward compatibility hack
-(defvar gud-massage-args nil)
-(put 'gud-massage-args 'permanent-local t)
(defvar gud-marker-filter nil)
(put 'gud-marker-filter 'permanent-local t)
(defvar gud-find-file nil)
(put 'gud-find-file 'permanent-local t)
-(defun gud-massage-args (&rest args)
- (apply gud-massage-args args))
-
(defun gud-marker-filter (&rest args)
(apply gud-marker-filter args))
(while (string-match "//+" file)
(setq file (replace-match "/" t t file)))
(funcall gud-find-file file))
+
+;; Keymap definitions for menu bar entries common to all debuggers and
+;; slots for debugger-dependent ones in sensible places. (Defined here
+;; before use.)
+(defvar gud-menu-map (make-sparse-keymap "Gud") nil)
+(define-key gud-menu-map [refresh] '("Refresh" . gud-refresh))
+(define-key gud-menu-map [remove] '("Remove breakpoint" . gud-remove))
+(define-key gud-menu-map [tbreak] nil) ; gdb, sdb and xdb
+(define-key gud-menu-map [break] '("Set breakpoint" . gud-break))
+(define-key gud-menu-map [up] nil) ; gdb, dbx, and xdb
+(define-key gud-menu-map [down] nil) ; gdb, dbx, and xdb
+(define-key gud-menu-map [print] '("Print expression" . gud-print))
+(define-key gud-menu-map [finish] nil) ; gdb or xdb
+(define-key gud-menu-map [stepi] '("Step instruction" . gud-stepi))
+(define-key gud-menu-map [step] '("Step line" . gud-step))
+(define-key gud-menu-map [next] '("Next line" . gud-next))
+(define-key gud-menu-map [cont] '("Continue" . gud-cont))
\f
;; ======================================================================
;; command definition
(defvar gud-gdb-history nil)
(defun gud-gdb-massage-args (file args)
- (cons "-fullname" (cons file args)))
+ (cons "-fullname" 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
output))
+(defun gud-new-keymap (map)
+ "Return a new keymap which inherits from MAP and has name `Gud'."
+ (nconc (make-sparse-keymap "Gud") map))
+
(defun gud-gdb-find-file (f)
- (find-file-noselect f))
+ (save-excursion
+ (let ((buf (find-file-noselect f)))
+ (set-buffer buf)
+ (use-local-map (gud-new-keymap (current-local-map)))
+ (define-key (current-local-map) [menu-bar debug]
+ (cons "Gud" (gud-new-keymap gud-menu-map)))
+ (local-set-key [menu-bar debug tbreak]
+ '("Temporary breakpoint" . gud-tbreak))
+ (local-set-key [menu-bar debug finish] '("Finish function" . gud-finish))
+ (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
+ (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+ buf)))
(defvar gdb-minibuffer-local-map nil
"Keymap for minibuffer prompting of gdb startup command.")
(gud-def gud-break "break %f:%l" "\C-b" "Set breakpoint at current line.")
(gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set temporary breakpoint at current line.")
- (gud-def gud-remove "clear %l" "\C-d" "Remove breakpoint at current line")
+ (gud-def gud-remove "clear %f:%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).")
(defvar gud-sdb-lastfile nil)
-(defun gud-sdb-massage-args (file args)
- (cons file args))
+(defun gud-sdb-massage-args (file args) args)
(defun gud-sdb-marker-filter (string)
(setq gud-marker-acc
string)
(defun gud-sdb-find-file (f)
- (if gud-sdb-needs-tags
- (find-tag-noselect f)
- (find-file-noselect f)))
+ (save-excursion
+ (let ((buf (if gud-sdb-needs-tags
+ (find-tag-noselect f)
+ (find-file-noselect f))))
+ (set-buffer buf)
+ (use-local-map (gud-new-keymap (current-local-map)))
+ (define-key (current-local-map) [menu-bar debug]
+ (cons "Gud" (gud-new-keymap gud-menu-map)))
+ (local-set-key [menu-bar debug tbreak] '("Temporary breakpoint" . gud-tbreak))
+ buf)))
;;;###autoload
(defun sdb (command-line)
;;; History of argument lists passed to dbx.
(defvar gud-dbx-history nil)
-(defun gud-dbx-massage-args (file args)
- (cons file args))
+(defun gud-dbx-massage-args (file args) args)
(defun gud-dbx-marker-filter (string)
(setq gud-marker-acc (if gud-marker-acc (concat gud-marker-acc string) string))
"Non-nil to assume the MIPS/OSF dbx conventions (argument `-emacs').")
(defun gud-mipsdbx-massage-args (file args)
- (cons "-emacs" (cons file args)))
+ (cons "-emacs" args))
;; This is just like the gdb one except for the regexps since we need to cope
;; with an optional breakpoint number in [] before the ^Z^Z
;; prod dbx into printing out the line number and file
;; name in a form we can grok as below
(process-send-string (get-buffer-process gud-comint-buffer)
- "printf \"\032\032%1d:\",(int)$curline;file\n"))
+ "printf \"\032\032%1d:\",(long)$curline;file\n"))
;; look for result of, say, "up" e.g.:
;; .pplot.pplot(0x800) ["src/pplot.f":261, 0x400c7c]
;; (this will also catch one of the lines printed by "where")
(or result "")))
(defun gud-dbx-find-file (f)
- (find-file-noselect f))
+ (save-excursion
+ (let ((buf (find-file-noselect f)))
+ (set-buffer buf)
+ (use-local-map (gud-new-keymap (current-local-map)))
+ (define-key (current-local-map) [menu-bar debug]
+ (cons "Gud" (gud-new-keymap gud-menu-map)))
+ (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
+ (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+ buf)))
;;;###autoload
(defun dbx (command-line)
">" "Down (numeric arg) stack frames.")
;; Make dbx give out the source location info that we need.
(process-send-string (get-buffer-process gud-comint-buffer)
- "printf \"\032\032%1d:\",$curline;file\n"))
+ "printf \"\032\032%1d:\",(long)$curline;file\n"))
(t
(gud-def gud-up "up %p" "<" "Up (numeric arg) stack frames.")
(gud-def gud-down "down %p" ">" "Down (numeric arg) stack frames.")
(while directories
(setq result (cons (car directories) (cons "-d" result)))
(setq directories (cdr directories)))
- (nreverse (cons file result)))
+ (nreverse result))
args))
(defun gud-xdb-file-name (f)
(or result "")))
(defun gud-xdb-find-file (f)
- (let ((realf (gud-xdb-file-name f)))
- (if realf (find-file-noselect realf))))
+ (save-excursion
+ (let ((realf (gud-xdb-file-name f)))
+ (if realf
+ (let ((buf (find-file-noselect realf)))
+ (set-buffer buf)
+ (use-local-map (gud-new-keymap (current-local-map)))
+ (define-key (current-local-map) [menu-bar debug]
+ (cons "Gud" (gud-new-keymap gud-menu-map)))
+ (local-set-key [menu-bar debug tbreak]
+ '("Temporary breakpoint" . gud-tbreak))
+ (local-set-key [menu-bar debug finish]
+ '("Finish function" . gud-finish))
+ (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
+ (local-set-key [menu-bar debug up] '("Up stack" . gud-up))
+ (local-set-key [menu-bar debug down] '("Down stack" . gud-down))
+ buf)
+ nil))))
;;;###autoload
(defun xdb (command-line)
(defvar gud-perldb-history nil)
(defun gud-perldb-massage-args (file args)
- (cons "-d" (cons file (cons "-emacs" args))))
+ (cons "-d" (cons "-emacs" 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
output))
(defun gud-perldb-find-file (f)
- (find-file-noselect f))
+ (save-excursion
+ (let ((buf (find-file-noselect f)))
+ (set-buffer buf)
+ (define-key (current-local-map) [menu-bar debug] (cons "Gud" (copy-keymap gud-menu-map)))
+ buf)))
;;;###autoload
(defun perldb (command-line)
(setq major-mode 'gud-mode)
(setq mode-name "Debugger")
(setq mode-line-process '(":%s"))
- (use-local-map (copy-keymap comint-mode-map))
+ (use-local-map (gud-new-keymap comint-mode-map))
(define-key (current-local-map) "\C-c\C-l" 'gud-refresh)
- ;; Keymap definitions for menu bar entries common to all debuggers
- ;; and slots for debugger-dependent ones. The menu should be made
- ;; to propagate to buffers found by gud-find-file.
(define-key (current-local-map) [menu-bar debug]
- (cons "Gud" (make-sparse-keymap "Gud")))
- (define-key (current-local-map) [menu-bar debug refresh]
- '("Refresh" . gud-refresh))
- (define-key (current-local-map) [menu-bar debug remove]
- '("Remove breakpoint" . gud-remove))
- (define-key (current-local-map) [menu-bar debug tbreak] ; gdb, sdb and xdb
- nil)
- (define-key (current-local-map) [menu-bar debug break]
- '("Set breakpoint" . gud-break))
- (define-key (current-local-map) [menu-bar debug up] ; gdb, dbx, and xdb
- nil)
- (define-key (current-local-map) [menu-bar debug down] ; gdb, dbx, and xdb
- nil)
- (define-key (current-local-map) [menu-bar debug print]
- '("Print expression" . gud-print)) ; though not in the source
- ; buffer until it gets a menu...
- (define-key (current-local-map) [menu-bar debug finish] ; gdb or xdb
- nil)
- (define-key (current-local-map) [menu-bar debug stepi]
- '("Step instruction" . gud-stepi))
- (define-key (current-local-map) [menu-bar debug step]
- '("Step line" . gud-step))
- (define-key (current-local-map) [menu-bar debug next]
- '("Next line" . gud-next))
- (define-key (current-local-map) [menu-bar debug cont]
- '("Continue" . gud-cont))
+ (cons "Gud" (gud-new-keymap gud-menu-map)))
(make-local-variable 'gud-last-frame)
(setq gud-last-frame nil)
(make-local-variable 'comint-prompt-regexp)
(defun gud-common-init (command-line massage-args marker-filter find-file)
(let* ((words (gud-chop-words command-line))
(program (car words))
+ ;; Extract the file name from WORDS
+ ;; and put t in its place.
+ ;; Later on we will put the modified file name arg back there.
(file-word (let ((w (cdr words)))
(while (and w (= ?- (aref (car w) 0)))
(setq w (cdr w)))
- (car w)))
+ (prog1 (car w)
+ (setcar w t))))
(file-subst
(and file-word (substitute-in-file-name file-word)))
- (args (delq file-word (cdr words)))
+ (args (cdr words))
;; If a directory was specified, expand the file name.
;; Otherwise, don't expand it, so GDB can use the PATH.
;; A file name without directory is literally valid
(setq default-directory (file-name-directory file)))
(or (bolp) (newline))
(insert "Current directory is " default-directory "\n")
+ ;; Put the substituted and expanded file name back in its place.
+ (let ((w args))
+ (while (and w (not (eq (car w) t)))
+ (setq w (cdr w)))
+ (setcar w file))
(apply 'make-comint (concat "gud-" filepart) program nil
- (if file-word (funcall massage-args file args))))
+ (if file-word (funcall massage-args file args) args)))
;; Since comint clobbered the mode, we don't set it until now.
(gud-mode)
- (make-local-variable 'gud-massage-args)
- (setq gud-massage-args massage-args)
(make-local-variable 'gud-marker-filter)
(setq gud-marker-filter marker-filter)
(make-local-variable 'gud-find-file)