# HG changeset patch # User Richard M. Stallman # Date 865209047 0 # Node ID 10b2526db6f0edf14f2e15c731047c20788ec055 # Parent ce2004da4ccd2715747391014146c15d50deed26 (gud-dgux-p, gud-dguxdbx-marker-filter): New functions. (dbx): Use them. diff -r ce2004da4ccd -r 10b2526db6f0 lisp/gud.el --- a/lisp/gud.el Sun Jun 01 23:49:06 1997 +0000 +++ b/lisp/gud.el Sun Jun 01 23:50:47 1997 +0000 @@ -731,6 +731,57 @@ (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 @@ (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)))