177 lines
6.2 KiB
EmacsLisp
177 lines
6.2 KiB
EmacsLisp
;;; bashdb.el --- Grand Unified Debugger mode for running bashdb
|
|
;; Copyright (C) 2000, 2001 Masatake YAMATO
|
|
|
|
;; Author: Masatake YAMATO <jet@gyve.org>
|
|
|
|
;; This program is free software; you can redistribute it and/or modify it
|
|
;; under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation; either version 2 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; This program is distributed in the hope that it will be useful, but
|
|
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with this program; if not, write to the Free Software Foundation,
|
|
;; Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
;; Commentary:
|
|
;; This program may run on Emacs 21.0.91 and XEmacs 21.1.
|
|
;;
|
|
;; Put
|
|
;; (autoload 'bashdb "bashdb" "Run bashdb" t nil)
|
|
;; to your .emacs.
|
|
;; M-x bashdb
|
|
;; Run bashdb (like this): bashdb target.sh
|
|
;;
|
|
;; About bashdb:
|
|
;; You can get bashdb from
|
|
;; http://www.oranda.demon.co.uk/development.html
|
|
;;
|
|
;; bashdb.el is based on perldb in gud.el in XEmacs 21.1.
|
|
|
|
;; Revision:
|
|
;; $Revision: 1.6 $
|
|
;; $Log: bashdb.el,v $
|
|
;; Revision 1.6 2001/01/06 12:18:06 masata-y
|
|
;; Write note about XEmacs.
|
|
;;
|
|
;;
|
|
|
|
|
|
;;; Code:
|
|
(require 'gud)
|
|
|
|
;; User customizable variable
|
|
(defcustom gud-bashdb-command-name "bashdb"
|
|
"File name for executing Bashdb."
|
|
:type 'string
|
|
:group 'gud)
|
|
|
|
;; History of argument lists passed to bashdb.
|
|
(defvar gud-bashdb-history nil)
|
|
|
|
(defun gud-bashdb-massage-args (file args)
|
|
(if xemacsp
|
|
(cons (file-name-nondirectory file) args)
|
|
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.
|
|
(if xemacsp
|
|
(defvar gud-bashdb-marker-acc ""))
|
|
(defun gud-bashdb-marker-acc ()
|
|
(if xemacsp
|
|
gud-bashdb-marker-acc
|
|
gud-marker-acc))
|
|
(defun gud-bashdb-marker-acc-quote ()
|
|
(if xemacsp
|
|
'gud-bashdb-marker-acc
|
|
'gud-marker-acc))
|
|
|
|
(defun gud-bashdb-marker-filter (string)
|
|
(save-match-data
|
|
(set (gud-bashdb-marker-acc-quote)
|
|
(concat (gud-bashdb-marker-acc) string))
|
|
(let ((output ""))
|
|
;; Process all the complete markers in this chunk.
|
|
(while (string-match "^\\([^:\n]+\\):\\([0-9]+\\)[ *]*>.*\n"
|
|
(gud-bashdb-marker-acc))
|
|
(setq
|
|
;; Extract the frame position from the marker.
|
|
gud-last-frame (cons
|
|
(substring (gud-bashdb-marker-acc)
|
|
(match-beginning 1)
|
|
(match-end 1))
|
|
(string-to-int
|
|
(substring (gud-bashdb-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-bashdb-marker-acc) 0 (match-beginning 0))))
|
|
;; Set the accumulator to the remaining text.
|
|
(set
|
|
(gud-bashdb-marker-acc-quote) (substring
|
|
(gud-bashdb-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-bashdb-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 "^\\([^:\n]+\\):\\([0-9]+\\)[ *]*>" (gud-bashdb-marker-acc))
|
|
(progn
|
|
;; Everything before the potential marker start can be output.
|
|
(setq output (concat output (substring (gud-bashdb-marker-acc)
|
|
0 (match-beginning 0))))
|
|
;; Everything after, we save, to combine with later input.
|
|
(set (gud-bashdb-marker-acc-quote)
|
|
(substring (gud-bashdb-marker-acc) (match-beginning 0))))
|
|
|
|
(setq output (concat output (gud-bashdb-marker-acc)))
|
|
(set (gud-bashdb-marker-acc-quote) ""))
|
|
|
|
output)))
|
|
|
|
(defun gud-bashdb-find-file (f)
|
|
(find-file-noselect f))
|
|
|
|
;;;###autoload
|
|
(defun bashdb (command-line)
|
|
"Run bashdb on program FILE in buffer *gud-FILE*.
|
|
The directory containing FILE becomes the initial working directory
|
|
and source-file directory for your debugger."
|
|
(interactive
|
|
(if xemacsp
|
|
(list (read-from-minibuffer "Run bashdb (like this): "
|
|
(if (consp gud-bashdb-history)
|
|
(car gud-bashdb-history)
|
|
(format "%s " gud-bashdb-command-name))
|
|
nil nil
|
|
'(gud-bashdb-history . 1)))
|
|
(list (gud-query-cmdline 'bashdb))
|
|
))
|
|
|
|
(if xemacsp
|
|
(progn
|
|
(gud-overload-functions '((gud-massage-args . gud-bashdb-massage-args)
|
|
(gud-marker-filter . gud-bashdb-marker-filter)
|
|
(gud-find-file . gud-bashdb-find-file)))
|
|
(gud-common-init command-line gud-bashdb-command-name))
|
|
(gud-common-init command-line 'gud-bashdb-massage-args
|
|
'gud-bashdb-marker-filter 'gud-bashdb-find-file)
|
|
(set (make-local-variable 'gud-minor-mode) 'bashdb))
|
|
|
|
;; Unsupported commands
|
|
;; condition foo set break condition to foo
|
|
;; condition clear break condition
|
|
;; display EXP evaluate and display EXP for each debug step
|
|
;; display show a list of display expressions
|
|
;; undisplay N remove display expression N
|
|
;; ! string passes string to a shell
|
|
;; quit quit
|
|
|
|
(gud-def gud-break "break %l" "\C-b" "Set breakpoint at current line.")
|
|
(gud-def gud-list-break "break" "b" "List breakpoints & break condition.")
|
|
(gud-def gud-remove "delete %l" "\C-d" "Remove breakpoint at current line")
|
|
(gud-def gud-remove-all "delete" "d" "Clear all breakpoints")
|
|
(gud-def gud-cont "continue" "\C-r" "Continue with display.")
|
|
(gud-def gud-next "next" "\C-n" "Step one line (skip functions).")
|
|
(gud-def gud-print "print %e" "\C-p" "Evaluate bash expression at point.")
|
|
(gud-def gud-help "help" "h" "Show all commands.")
|
|
(gud-def gud-trace "trace" "t" "Toggle execution trace on/off")
|
|
|
|
(setq comint-prompt-regexp "^bashdb> ")
|
|
(setq paragraph-start comint-prompt-regexp)
|
|
(run-hooks 'bashdb-mode-hook))
|
|
|
|
(provide 'bashdb)
|
|
;; bashdb.el ends here
|