diff options
| author | Roland McGrath | 1993-07-15 01:55:13 +0000 |
|---|---|---|
| committer | Roland McGrath | 1993-07-15 01:55:13 +0000 |
| commit | a223b10d5e64e6a358a486407946571892f560b8 (patch) | |
| tree | 8dfa573a99c0a34bb91067c6963c4643d81f6245 | |
| parent | 215aa4f9c9c61bb85f5b49d62667165a012097f0 (diff) | |
| download | emacs-a223b10d5e64e6a358a486407946571892f560b8.tar.gz emacs-a223b10d5e64e6a358a486407946571892f560b8.zip | |
(gud-debugger-startup): Replaced with gud-massage-args.
(gud-{gdb,sdb,xdb}-debugger-startup): Replaced with gud-*-massage-args.
(gdb, sdb, xdb): Argument is command line, not args for it. Remove
debugger name from prompt and put it in the default input instead.
Overload gud-massage-args instead of gud-debugger-startup.
(gud-chop-words): New function; subr for gud-common-init.
(gud-common-init): Argument is command line, not args for it.
Rewritten to use gud-chop-words instead of temp buffer and kludge involving
read. Find the program name as the first word of the command line.
Use make-comint and gud-massage-args in place of gud-debugger-startup.
Expand the file name before passing it to gud-massage-args.
| -rw-r--r-- | lisp/gud.el | 153 |
1 files changed, 78 insertions, 75 deletions
diff --git a/lisp/gud.el b/lisp/gud.el index 890dcbc6bd7..9d7ccdb8b00 100644 --- a/lisp/gud.el +++ b/lisp/gud.el | |||
| @@ -57,7 +57,7 @@ This association list has elements of the form | |||
| 57 | (function (lambda (p) (fset (car p) (symbol-function (cdr p))))) | 57 | (function (lambda (p) (fset (car p) (symbol-function (cdr p))))) |
| 58 | gud-overload-alist)) | 58 | gud-overload-alist)) |
| 59 | 59 | ||
| 60 | (defun gud-debugger-startup (file args) | 60 | (defun gud-massage-args (file args) |
| 61 | (error "GUD not properly entered.")) | 61 | (error "GUD not properly entered.")) |
| 62 | 62 | ||
| 63 | (defun gud-marker-filter (str) | 63 | (defun gud-marker-filter (str) |
| @@ -128,12 +128,12 @@ we're in the GUD buffer)." | |||
| 128 | ;; | 128 | ;; |
| 129 | ;;<name> | 129 | ;;<name> |
| 130 | ;; comint-prompt-regexp | 130 | ;; comint-prompt-regexp |
| 131 | ;; gud-<name>-debugger-startup | 131 | ;; gud-<name>-massage-args |
| 132 | ;; gud-<name>-marker-filter | 132 | ;; gud-<name>-marker-filter |
| 133 | ;; gud-<name>-find-file | 133 | ;; gud-<name>-find-file |
| 134 | ;; | 134 | ;; |
| 135 | ;; The job of the startup-command method is to fire up a copy of the debugger, | 135 | ;; The job of the massage-args method is to modify the given list of |
| 136 | ;; given a list of debugger arguments. | 136 | ;; debugger arguments before running the debugger. |
| 137 | ;; | 137 | ;; |
| 138 | ;; The job of the marker-filter method is to detect file/line markers in | 138 | ;; The job of the marker-filter method is to detect file/line markers in |
| 139 | ;; strings and set the global gud-last-frame to indicate what display | 139 | ;; strings and set the global gud-last-frame to indicate what display |
| @@ -152,8 +152,8 @@ we're in the GUD buffer)." | |||
| 152 | ;;; History of argument lists passed to gdb. | 152 | ;;; History of argument lists passed to gdb. |
| 153 | (defvar gud-gdb-history nil) | 153 | (defvar gud-gdb-history nil) |
| 154 | 154 | ||
| 155 | (defun gud-gdb-debugger-startup (file args) | 155 | (defun gud-gdb-massage-args (file args) |
| 156 | (apply 'make-comint (concat "gud-" file) "gdb" nil "-fullname" args)) | 156 | (cons "-fullname" (cons file args))) |
| 157 | 157 | ||
| 158 | (defun gud-gdb-marker-filter (string) | 158 | (defun gud-gdb-marker-filter (string) |
| 159 | (if (string-match "\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n" string) | 159 | (if (string-match "\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n" string) |
| @@ -175,23 +175,23 @@ we're in the GUD buffer)." | |||
| 175 | (find-file-noselect f)) | 175 | (find-file-noselect f)) |
| 176 | 176 | ||
| 177 | ;;;###autoload | 177 | ;;;###autoload |
| 178 | (defun gdb (args) | 178 | (defun gdb (command-line) |
| 179 | "Run gdb on program FILE in buffer *gud-FILE*. | 179 | "Run gdb on program FILE in buffer *gud-FILE*. |
| 180 | The directory containing FILE becomes the initial working directory | 180 | The directory containing FILE becomes the initial working directory |
| 181 | and source-file directory for your debugger." | 181 | and source-file directory for your debugger." |
| 182 | (interactive | 182 | (interactive |
| 183 | (list (read-from-minibuffer "Run gdb (like this): gdb " | 183 | (list (read-from-minibuffer "Run gdb (like this): " |
| 184 | (if (consp gud-gdb-history) | 184 | (if (consp gud-gdb-history) |
| 185 | (car gud-gdb-history) | 185 | (car gud-gdb-history) |
| 186 | "") | 186 | "gdb ") |
| 187 | nil nil | 187 | nil nil |
| 188 | '(gud-gdb-history . 1)))) | 188 | '(gud-gdb-history . 1)))) |
| 189 | (gud-overload-functions '((gud-debugger-startup . gud-gdb-debugger-startup) | 189 | (gud-overload-functions '((gud-massage-args . gud-gdb-massage-args) |
| 190 | (gud-marker-filter . gud-gdb-marker-filter) | 190 | (gud-marker-filter . gud-gdb-marker-filter) |
| 191 | (gud-find-file . gud-gdb-find-file) | 191 | (gud-find-file . gud-gdb-find-file) |
| 192 | )) | 192 | )) |
| 193 | 193 | ||
| 194 | (gud-common-init args) | 194 | (gud-common-init command-line) |
| 195 | 195 | ||
| 196 | (gud-def gud-break "break %f:%l" "\C-b" "Set breakpoint at current line.") | 196 | (gud-def gud-break "break %f:%l" "\C-b" "Set breakpoint at current line.") |
| 197 | (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.") | 197 | (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.") |
| @@ -221,8 +221,8 @@ and source-file directory for your debugger." | |||
| 221 | 221 | ||
| 222 | (defvar gud-sdb-lastfile nil) | 222 | (defvar gud-sdb-lastfile nil) |
| 223 | 223 | ||
| 224 | (defun gud-sdb-debugger-startup (file args) | 224 | (defun gud-sdb-massage-args (file args) |
| 225 | (apply 'make-comint (concat "gud-" file) "sdb" nil args)) | 225 | (cons file args)) |
| 226 | 226 | ||
| 227 | (defun gud-sdb-marker-filter (string) | 227 | (defun gud-sdb-marker-filter (string) |
| 228 | (cond | 228 | (cond |
| @@ -255,26 +255,26 @@ and source-file directory for your debugger." | |||
| 255 | (find-file-noselect f))) | 255 | (find-file-noselect f))) |
| 256 | 256 | ||
| 257 | ;;;###autoload | 257 | ;;;###autoload |
| 258 | (defun sdb (args) | 258 | (defun sdb (command-line) |
| 259 | "Run sdb on program FILE in buffer *gud-FILE*. | 259 | "Run sdb on program FILE in buffer *gud-FILE*. |
| 260 | The directory containing FILE becomes the initial working directory | 260 | The directory containing FILE becomes the initial working directory |
| 261 | and source-file directory for your debugger." | 261 | and source-file directory for your debugger." |
| 262 | (interactive | 262 | (interactive |
| 263 | (list (read-from-minibuffer "Run sdb (like this): sdb " | 263 | (list (read-from-minibuffer "Run sdb (like this): " |
| 264 | (if (consp gud-sdb-history) | 264 | (if (consp gud-sdb-history) |
| 265 | (car gud-sdb-history) | 265 | (car gud-sdb-history) |
| 266 | "") | 266 | "sdb ") |
| 267 | nil nil | 267 | nil nil |
| 268 | '(gud-sdb-history . 1)))) | 268 | '(gud-sdb-history . 1)))) |
| 269 | (if (and gud-sdb-needs-tags | 269 | (if (and gud-sdb-needs-tags |
| 270 | (not (and (boundp 'tags-file-name) (file-exists-p tags-file-name)))) | 270 | (not (and (boundp 'tags-file-name) (file-exists-p tags-file-name)))) |
| 271 | (error "The sdb support requires a valid tags table to work.")) | 271 | (error "The sdb support requires a valid tags table to work.")) |
| 272 | (gud-overload-functions '((gud-debugger-startup . gud-sdb-debugger-startup) | 272 | (gud-overload-functions '((gud-massage-args . gud-sdb-massage-args) |
| 273 | (gud-marker-filter . gud-sdb-marker-filter) | 273 | (gud-marker-filter . gud-sdb-marker-filter) |
| 274 | (gud-find-file . gud-sdb-find-file) | 274 | (gud-find-file . gud-sdb-find-file) |
| 275 | )) | 275 | )) |
| 276 | 276 | ||
| 277 | (gud-common-init args) | 277 | (gud-common-init command-line) |
| 278 | 278 | ||
| 279 | (gud-def gud-break "%l b" "\C-b" "Set breakpoint at current line.") | 279 | (gud-def gud-break "%l b" "\C-b" "Set breakpoint at current line.") |
| 280 | (gud-def gud-tbreak "%l c" "\C-t" "Set temporary breakpoint at current line.") | 280 | (gud-def gud-tbreak "%l c" "\C-t" "Set temporary breakpoint at current line.") |
| @@ -295,8 +295,8 @@ and source-file directory for your debugger." | |||
| 295 | ;;; History of argument lists passed to dbx. | 295 | ;;; History of argument lists passed to dbx. |
| 296 | (defvar gud-dbx-history nil) | 296 | (defvar gud-dbx-history nil) |
| 297 | 297 | ||
| 298 | (defun gud-dbx-debugger-startup (file args) | 298 | (defun gud-dbx-massage-args (file args) |
| 299 | (apply 'make-comint (concat "gud-" file) "dbx" nil args)) | 299 | (cons file args)) |
| 300 | 300 | ||
| 301 | (defun gud-dbx-marker-filter (string) | 301 | (defun gud-dbx-marker-filter (string) |
| 302 | (if (string-match | 302 | (if (string-match |
| @@ -312,23 +312,23 @@ and source-file directory for your debugger." | |||
| 312 | (find-file-noselect f)) | 312 | (find-file-noselect f)) |
| 313 | 313 | ||
| 314 | ;;;###autoload | 314 | ;;;###autoload |
| 315 | (defun dbx (args) | 315 | (defun dbx (command-line) |
| 316 | "Run dbx on program FILE in buffer *gud-FILE*. | 316 | "Run dbx on program FILE in buffer *gud-FILE*. |
| 317 | The directory containing FILE becomes the initial working directory | 317 | The directory containing FILE becomes the initial working directory |
| 318 | and source-file directory for your debugger." | 318 | and source-file directory for your debugger." |
| 319 | (interactive | 319 | (interactive |
| 320 | (list (read-from-minibuffer "Run dbx (like this): dbx " | 320 | (list (read-from-minibuffer "Run dbx (like this): " |
| 321 | (if (consp gud-dbx-history) | 321 | (if (consp gud-dbx-history) |
| 322 | (car gud-dbx-history) | 322 | (car gud-dbx-history) |
| 323 | "") | 323 | "dbx ") |
| 324 | nil nil | 324 | nil nil |
| 325 | '(gud-dbx-history . 1)))) | 325 | '(gud-dbx-history . 1)))) |
| 326 | (gud-overload-functions '((gud-debugger-startup . gud-dbx-debugger-startup) | 326 | (gud-overload-functions '((gud-massage-args . gud-dbx-massage-args) |
| 327 | (gud-marker-filter . gud-dbx-marker-filter) | 327 | (gud-marker-filter . gud-dbx-marker-filter) |
| 328 | (gud-find-file . gud-dbx-find-file) | 328 | (gud-find-file . gud-dbx-find-file) |
| 329 | )) | 329 | )) |
| 330 | 330 | ||
| 331 | (gud-common-init args) | 331 | (gud-common-init command-line) |
| 332 | 332 | ||
| 333 | (gud-def gud-break "stop at \"%f\":%l" | 333 | (gud-def gud-break "stop at \"%f\":%l" |
| 334 | "\C-b" "Set breakpoint at current line.") | 334 | "\C-b" "Set breakpoint at current line.") |
| @@ -359,15 +359,14 @@ will be known to xdb. | |||
| 359 | The file names should be absolute, or relative to the directory | 359 | The file names should be absolute, or relative to the directory |
| 360 | containing the executable being debugged.") | 360 | containing the executable being debugged.") |
| 361 | 361 | ||
| 362 | (defun gud-xdb-debugger-startup (file args) | 362 | (defun gud-xdb-massage-args (file args) |
| 363 | (apply 'make-comint (concat "gud-" file) "xdb" nil | 363 | (nconc (let ((directories gud-xdb-directories) |
| 364 | (append (let ((directories gud-xdb-directories) | 364 | (result nil)) |
| 365 | (result nil)) | 365 | (while directories |
| 366 | (while directories | 366 | (setq result (cons (car directories) (cons "-d" result))) |
| 367 | (setq result (cons (car directories) (cons "-d" result))) | 367 | (setq directories (cdr directories))) |
| 368 | (setq directories (cdr directories))) | 368 | (nreverse (cons file result))) |
| 369 | (nreverse result)) | 369 | args)) |
| 370 | args))) | ||
| 371 | 370 | ||
| 372 | (defun gud-xdb-file-name (f) | 371 | (defun gud-xdb-file-name (f) |
| 373 | "Transform a relative pathname to a full pathname in xdb mode" | 372 | "Transform a relative pathname to a full pathname in xdb mode" |
| @@ -410,7 +409,7 @@ containing the executable being debugged.") | |||
| 410 | (if realf (find-file-noselect realf)))) | 409 | (if realf (find-file-noselect realf)))) |
| 411 | 410 | ||
| 412 | ;;;###autoload | 411 | ;;;###autoload |
| 413 | (defun xdb (args) | 412 | (defun xdb (command-line) |
| 414 | "Run xdb on program FILE in buffer *gud-FILE*. | 413 | "Run xdb on program FILE in buffer *gud-FILE*. |
| 415 | The directory containing FILE becomes the initial working directory | 414 | The directory containing FILE becomes the initial working directory |
| 416 | and source-file directory for your debugger. | 415 | and source-file directory for your debugger. |
| @@ -418,17 +417,17 @@ and source-file directory for your debugger. | |||
| 418 | You can set the variable 'gud-xdb-directories' to a list of program source | 417 | You can set the variable 'gud-xdb-directories' to a list of program source |
| 419 | directories if your program contains sources from more than one directory." | 418 | directories if your program contains sources from more than one directory." |
| 420 | (interactive | 419 | (interactive |
| 421 | (list (read-from-minibuffer "Run xdb (like this): xdb " | 420 | (list (read-from-minibuffer "Run xdb (like this): " |
| 422 | (if (consp gud-xdb-history) | 421 | (if (consp gud-xdb-history) |
| 423 | (car gud-xdb-history) | 422 | (car gud-xdb-history) |
| 424 | "") | 423 | "xdb ") |
| 425 | nil nil | 424 | nil nil |
| 426 | '(gud-xdb-history . 1)))) | 425 | '(gud-xdb-history . 1)))) |
| 427 | (gud-overload-functions '((gud-debugger-startup . gud-xdb-debugger-startup) | 426 | (gud-overload-functions '((gud-massage-args . gud-xdb-massage-args) |
| 428 | (gud-marker-filter . gud-xdb-marker-filter) | 427 | (gud-marker-filter . gud-xdb-marker-filter) |
| 429 | (gud-find-file . gud-xdb-find-file))) | 428 | (gud-find-file . gud-xdb-find-file))) |
| 430 | 429 | ||
| 431 | (gud-common-init args) | 430 | (gud-common-init command-line) |
| 432 | 431 | ||
| 433 | (gud-def gud-break "b %f:%l" "\C-b" "Set breakpoint at current line.") | 432 | (gud-def gud-break "b %f:%l" "\C-b" "Set breakpoint at current line.") |
| 434 | (gud-def gud-tbreak "b %f:%l\\t" "\C-t" | 433 | (gud-def gud-tbreak "b %f:%l\\t" "\C-t" |
| @@ -563,37 +562,41 @@ comint mode, which see." | |||
| 563 | 562 | ||
| 564 | (defvar gud-comint-buffer nil) | 563 | (defvar gud-comint-buffer nil) |
| 565 | 564 | ||
| 566 | (defun gud-common-init (args) | 565 | ;; Chop STRING into words separated by SPC or TAB and return a list of them. |
| 567 | ;; Perform initializations common to all debuggers | 566 | (defun gud-chop-words (string) |
| 568 | ;; There *must* be a cleaner way to lex the arglist... | 567 | (let ((i 0) (beg 0) |
| 569 | (let (file i) | 568 | (len (length string)) |
| 570 | (if (string= args "") | 569 | (words nil)) |
| 571 | (setq args nil) | 570 | (while (< i len) |
| 572 | (save-excursion | 571 | (if (memq (aref string i) '(?\t ? )) |
| 573 | (set-buffer (get-buffer-create "*gud-scratch*")) | 572 | (progn |
| 574 | (erase-buffer) | 573 | (setq words (cons (substring string beg i) words) |
| 575 | (insert args) | 574 | beg (1+ i)) |
| 576 | (goto-char (point-max)) | 575 | (while (and (< beg len) (memq (aref string beg) '(?\t ? ))) |
| 577 | (insert "\")") | 576 | (setq beg (1+ beg))) |
| 578 | (goto-char (point-min)) | 577 | (setq i (1+ beg))) |
| 579 | (insert "(\"") | 578 | (setq i (1+ i)))) |
| 580 | (while (re-search-forward " +" nil t) | 579 | (if (< beg len) |
| 581 | (replace-match "\" \"" nil nil)) | 580 | (setq words (cons (substring string beg) words))) |
| 582 | (goto-char (point-min)) | 581 | (nreverse words))) |
| 583 | (while (re-search-forward "\"\"" nil t) | 582 | |
| 584 | (replace-match "" nil nil)) | 583 | ;; Perform initializations common to all debuggers. |
| 585 | (setq args (read (buffer-string))) | 584 | (defun gud-common-init (command-line) |
| 586 | (kill-buffer (current-buffer)))) | 585 | (let* ((words (gud-chop-words command-line)) |
| 587 | (setq i (1- (length args))) | 586 | (program (car words)) |
| 588 | (while (and (>= i 0) (not (= (aref (nth i args) 0) ?-))) | 587 | (file-word (let ((w (cdr words))) |
| 589 | (setq file (nth i args)) (setq i (1- i))) | 588 | (while (and w (= ?- (aref (car w) 0))) |
| 590 | (let* ((path (expand-file-name file)) | 589 | (setq w (cdr w))) |
| 591 | (filepart (file-name-nondirectory path))) | 590 | (car w))) |
| 591 | (args (delq file-word (cdr words))) | ||
| 592 | (file (expand-file-name file-word)) | ||
| 593 | (filepart (file-name-nondirectory file))) | ||
| 592 | (switch-to-buffer (concat "*gud-" filepart "*")) | 594 | (switch-to-buffer (concat "*gud-" filepart "*")) |
| 593 | (setq default-directory (file-name-directory path)) | 595 | (setq default-directory (file-name-directory file)) |
| 594 | (or (bolp) (newline)) | 596 | (or (bolp) (newline)) |
| 595 | (insert "Current directory is " default-directory "\n") | 597 | (insert "Current directory is " default-directory "\n") |
| 596 | (gud-debugger-startup filepart args))) | 598 | (apply 'make-comint (concat "gud-" filepart) program nil |
| 599 | (gud-massage-args file args))) | ||
| 597 | (gud-mode) | 600 | (gud-mode) |
| 598 | (set-process-filter (get-buffer-process (current-buffer)) 'gud-filter) | 601 | (set-process-filter (get-buffer-process (current-buffer)) 'gud-filter) |
| 599 | (set-process-sentinel (get-buffer-process (current-buffer)) 'gud-sentinel) | 602 | (set-process-sentinel (get-buffer-process (current-buffer)) 'gud-sentinel) |