diff options
author | Richard M. Stallman <rms@gnu.org> | 1997-06-01 23:50:47 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1997-06-01 23:50:47 +0000 |
commit | 34c8b6731d4d209187b8f039ab2a23119a7e4b39 (patch) | |
tree | 2dac9b3e42a461116f9909497152181db228e733 /lisp/gud.el | |
parent | e72a4cff081f2e6f6d466ea1a7002c86f1067982 (diff) | |
download | emacs-34c8b6731d4d209187b8f039ab2a23119a7e4b39.tar.gz |
(gud-dgux-p, gud-dguxdbx-marker-filter): New functions.
(dbx): Use them.
Diffstat (limited to 'lisp/gud.el')
-rw-r--r-- | lisp/gud.el | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lisp/gud.el b/lisp/gud.el index 02b955ef466..92920fee882 100644 --- a/lisp/gud.el +++ b/lisp/gud.el @@ -731,6 +731,57 @@ a better solution in 6.1 upwards.") (setq result (substring result 0 (match-beginning 0)))))) (or result ""))) +(defvar gud-dgux-p (string-match "-dgux" system-configuration) + "Non-nil means to assume the interface approriate for DG/UX dbx. +This was tested using R4.11.") + +;; There are a couple of differences between DG's dbx output and normal +;; dbx output which make it nontrivial to integrate this into the +;; standard dbx-marker-filter (mainly, there are a different number of +;; backreferences). The markers look like: +;; +;; (0) Stopped at line 10, routine main(argc=1, argv=0xeffff0e0), file t.c +;; +;; from breakpoints (the `(0)' there isn't constant, it's the breakpoint +;; number), and +;; +;; Stopped at line 13, routine main(argc=1, argv=0xeffff0e0), file t.c +;; +;; from signals and +;; +;; Frame 21, line 974, routine command_loop(), file keyboard.c +;; +;; from up/down/where. + +(defun gud-dguxdbx-marker-filter (string) + (setq gud-marker-acc (if gud-marker-acc + (concat gud-marker-acc string) + string)) + (let ((re (concat "^\\(\\(([0-9]+) \\)?Stopped at\\|Frame [0-9]+,\\)" + " line \\([0-9]+\\), routine .*, file \\([^ \t\n]+\\)")) + start) + ;; Process all complete markers in this chunk. + (while (string-match re gud-marker-acc start) + (setq gud-last-frame + (cons + (substring gud-marker-acc (match-beginning 4) (match-end 4)) + (string-to-int (substring gud-marker-acc + (match-beginning 3) (match-end 3)))) + start (match-end 0))) + + ;; Search for the last incomplete line in this chunk + (while (string-match "\n" gud-marker-acc start) + (setq start (match-end 0))) + + ;; If the incomplete line APPEARS to begin with another marker, keep it + ;; in the accumulator. Otherwise, clear the accumulator to avoid an + ;; unnecessary concat during the next call. + (setq gud-marker-acc + (if (string-match "Stopped\\|Frame" gud-marker-acc start) + (substring gud-marker-acc (match-beginning 0)) + nil))) + string) + (defun gud-dbx-find-file (f) (save-excursion (let ((realf (gud-dbx-file-name f))) @@ -763,6 +814,9 @@ and source-file directory for your debugger." (gud-irix-p (gud-common-init command-line 'gud-dbx-massage-args 'gud-irixdbx-marker-filter 'gud-dbx-find-file)) + (gud-dgux-p + (gud-common-init command-line 'gud-dbx-massage-args + 'gud-dguxdbx-marker-filter 'gud-dbx-find-file)) (t (gud-common-init command-line 'gud-dbx-massage-args 'gud-dbx-marker-filter 'gud-dbx-find-file))) |