summaryrefslogtreecommitdiff
path: root/lisp/gud.el
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1997-06-01 23:50:47 +0000
committerRichard M. Stallman <rms@gnu.org>1997-06-01 23:50:47 +0000
commit34c8b6731d4d209187b8f039ab2a23119a7e4b39 (patch)
tree2dac9b3e42a461116f9909497152181db228e733 /lisp/gud.el
parente72a4cff081f2e6f6d466ea1a7002c86f1067982 (diff)
downloademacs-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.el54
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)))