Mercurial > emacs
comparison lisp/progmodes/gdb-ui.el @ 83473:428d132b4028
Merged from
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-73
Merge from erc--emacs--0
* emacs@sv.gnu.org/emacs--devo--0--patch-74
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-75
Make ERC comply with the new copyright year guidelines.
* emacs@sv.gnu.org/emacs--devo--0--patch-76
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-77
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-78
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-79
(rcirc-format-response-string): Fix small bugs
* emacs@sv.gnu.org/emacs--devo--0--patch-80
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-81
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-82
Fix compiler error in erc-dcc.el.
* emacs@sv.gnu.org/emacs--devo--0--patch-83
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-84
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-85
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-86
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-87
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-88
Merge from erc--emacs--0
* emacs@sv.gnu.org/emacs--devo--0--patch-89
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-90
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-513
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Thu, 16 Feb 2006 16:18:54 +0000 |
parents | b98066f4aa10 57fa3643220b |
children | d08a7ef0cb8a |
comparison
equal
deleted
inserted
replaced
83472:b8bd59a73456 | 83473:428d132b4028 |
---|---|
183 (3 font-lock-type-face)) | 183 (3 font-lock-type-face)) |
184 ) | 184 ) |
185 "Font lock keywords used in `gdb-local-mode'.") | 185 "Font lock keywords used in `gdb-local-mode'.") |
186 | 186 |
187 ;; Variables for GDB 6.4+ | 187 ;; Variables for GDB 6.4+ |
188 | |
189 (defvar gdb-register-names nil "List of register names.") | 188 (defvar gdb-register-names nil "List of register names.") |
190 (defvar gdb-changed-registers nil | 189 (defvar gdb-changed-registers nil |
191 "List of changed register numbers (strings).") | 190 "List of changed register numbers (strings).") |
192 | 191 |
193 ;;;###autoload | 192 ;;;###autoload |
201 it starts with two windows: one displaying the GUD buffer and the | 200 it starts with two windows: one displaying the GUD buffer and the |
202 other with the source file with the main routine of the inferior. | 201 other with the source file with the main routine of the inferior. |
203 | 202 |
204 If `gdb-many-windows' is t, regardless of the value of | 203 If `gdb-many-windows' is t, regardless of the value of |
205 `gdb-show-main', the layout below will appear unless | 204 `gdb-show-main', the layout below will appear unless |
206 `gdb-use-inferior-io-buffer' is nil when the source buffer | 205 `gdb-use-separate-io-buffer' is nil when the source buffer |
207 occupies the full width of the frame. Keybindings are given in | 206 occupies the full width of the frame. Keybindings are given in |
208 relevant buffer. | 207 relevant buffer. |
209 | 208 |
210 Watch expressions appear in the speedbar/slowbar. | 209 Watch expressions appear in the speedbar/slowbar. |
211 | 210 |
279 Also display the main routine in the disassembly buffer if present." | 278 Also display the main routine in the disassembly buffer if present." |
280 :type 'boolean | 279 :type 'boolean |
281 :group 'gud | 280 :group 'gud |
282 :version "22.1") | 281 :version "22.1") |
283 | 282 |
284 (defcustom gdb-use-inferior-io-buffer nil | 283 (defcustom gdb-use-separate-io-buffer nil |
285 "Non-nil means display output from the inferior in a separate buffer." | 284 "Non-nil means display output from the inferior in a separate buffer." |
286 :type 'boolean | 285 :type 'boolean |
287 :group 'gud | 286 :group 'gud |
288 :version "22.1") | 287 :version "22.1") |
289 | 288 |
290 (defun gdb-use-inferior-io-buffer (arg) | 289 (defun gdb-use-separate-io-buffer (arg) |
291 "Toggle separate IO for inferior. | 290 "Toggle separate IO for inferior. |
292 With arg, use separate IO iff arg is positive." | 291 With arg, use separate IO iff arg is positive." |
293 (interactive "P") | 292 (interactive "P") |
294 (setq gdb-use-inferior-io-buffer | 293 (setq gdb-use-separate-io-buffer |
295 (if (null arg) | 294 (if (null arg) |
296 (not gdb-use-inferior-io-buffer) | 295 (not gdb-use-separate-io-buffer) |
297 (> (prefix-numeric-value arg) 0))) | 296 (> (prefix-numeric-value arg) 0))) |
298 (message (format "Separate inferior IO %sabled" | 297 (message (format "Separate inferior IO %sabled" |
299 (if gdb-use-inferior-io-buffer "en" "dis"))) | 298 (if gdb-use-separate-io-buffer "en" "dis"))) |
300 (if (and gud-comint-buffer | 299 (if (and gud-comint-buffer |
301 (buffer-name gud-comint-buffer)) | 300 (buffer-name gud-comint-buffer)) |
302 (condition-case nil | 301 (condition-case nil |
303 (if gdb-use-inferior-io-buffer | 302 (if gdb-use-separate-io-buffer |
304 (gdb-restore-windows) | 303 (gdb-restore-windows) |
305 (kill-buffer (gdb-inferior-io-name))) | 304 (kill-buffer (gdb-inferior-io-name))) |
306 (error nil)))) | 305 (error nil)))) |
307 | 306 |
308 (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") | 307 (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") |
460 gdb-macro-info nil | 459 gdb-macro-info nil |
461 gdb-buffer-fringe-width (car (window-fringes))) | 460 gdb-buffer-fringe-width (car (window-fringes))) |
462 | 461 |
463 (setq gdb-buffer-type 'gdba) | 462 (setq gdb-buffer-type 'gdba) |
464 | 463 |
465 (if gdb-use-inferior-io-buffer (gdb-clear-inferior-io)) | 464 (if gdb-use-separate-io-buffer (gdb-clear-inferior-io)) |
466 | 465 |
467 ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4) | 466 ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4) |
468 (setq gdb-version nil) | 467 (setq gdb-version nil) |
469 (gdb-enqueue-input (list "server interpreter mi -stack-info-frame\n" | 468 (gdb-enqueue-input (list "server interpreter mi -stack-info-frame\n" |
470 'gdb-get-version))) | 469 'gdb-get-version))) |
569 (dolist (var gdb-var-list) | 568 (dolist (var gdb-var-list) |
570 (if (string-equal expr (car var)) (throw 'already-watched nil))) | 569 (if (string-equal expr (car var)) (throw 'already-watched nil))) |
571 (set-text-properties 0 (length expr) nil expr) | 570 (set-text-properties 0 (length expr) nil expr) |
572 (gdb-enqueue-input | 571 (gdb-enqueue-input |
573 (list | 572 (list |
574 (if (eq gud-minor-mode 'gdba) | 573 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
575 (concat "server interpreter mi \"-var-create - * " expr "\"\n") | 574 (concat "server interpreter mi \"-var-create - * " expr "\"\n") |
576 (concat"-var-create - * " expr "\n")) | 575 (concat"-var-create - * " expr "\n")) |
577 `(lambda () (gdb-var-create-handler ,expr)))))))) | 576 `(lambda () (gdb-var-create-handler ,expr)))))))) |
578 | 577 |
579 (defconst gdb-var-create-regexp | 578 (defconst gdb-var-create-regexp |
592 (unless (string-equal | 591 (unless (string-equal |
593 speedbar-initial-expansion-list-name "GUD") | 592 speedbar-initial-expansion-list-name "GUD") |
594 (speedbar-change-initial-expansion-list "GUD")) | 593 (speedbar-change-initial-expansion-list "GUD")) |
595 (gdb-enqueue-input | 594 (gdb-enqueue-input |
596 (list | 595 (list |
597 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) | 596 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
598 'gdba) | |
599 (concat "server interpreter mi \"-var-evaluate-expression " | 597 (concat "server interpreter mi \"-var-evaluate-expression " |
600 (nth 1 var) "\"\n") | 598 (nth 1 var) "\"\n") |
601 (concat "-var-evaluate-expression " (nth 1 var) "\n")) | 599 (concat "-var-evaluate-expression " (nth 1 var) "\n")) |
602 `(lambda () (gdb-var-evaluate-expression-handler | 600 `(lambda () (gdb-var-evaluate-expression-handler |
603 ,(nth 1 var) nil)))) | 601 ,(nth 1 var) nil)))) |
741 "Expand the node the user clicked on. | 739 "Expand the node the user clicked on. |
742 TEXT is the text of the button we clicked on, a + or - item. | 740 TEXT is the text of the button we clicked on, a + or - item. |
743 TOKEN is data related to this node. | 741 TOKEN is data related to this node. |
744 INDENT is the current indentation depth." | 742 INDENT is the current indentation depth." |
745 (cond ((string-match "+" text) ;expand this node | 743 (cond ((string-match "+" text) ;expand this node |
746 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 744 (if (and |
747 (if (string-equal gdb-version "pre-6.4") | 745 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
748 (gdb-var-list-children token) | 746 (string-equal gdb-version "pre-6.4")) |
749 (gdb-var-list-children-1 token)) | 747 (gdb-var-list-children token) |
750 (progn | 748 (gdb-var-list-children-1 token))) |
751 (gdbmi-var-update) | |
752 (gdbmi-var-list-children token)))) | |
753 ((string-match "-" text) ;contract this node | 749 ((string-match "-" text) ;contract this node |
754 (dolist (var gdb-var-list) | 750 (dolist (var gdb-var-list) |
755 (if (string-match (concat token "\\.") (nth 1 var)) | 751 (if (string-match (concat token "\\.") (nth 1 var)) |
756 (setq gdb-var-list (delq var gdb-var-list)))) | 752 (setq gdb-var-list (delq var gdb-var-list)))) |
757 (setq gdb-var-changed t) | 753 (setq gdb-var-changed t) |
854 (defun gdb-inferior-io-name () | 850 (defun gdb-inferior-io-name () |
855 (concat "*input/output of " | 851 (concat "*input/output of " |
856 (gdb-get-target-string) | 852 (gdb-get-target-string) |
857 "*")) | 853 "*")) |
858 | 854 |
859 (defun gdb-display-inferior-io-buffer () | 855 (defun gdb-display-separate-io-buffer () |
860 "Display IO of inferior in a separate window." | 856 "Display IO of inferior in a separate window." |
861 (interactive) | 857 (interactive) |
862 (if gdb-use-inferior-io-buffer | 858 (if gdb-use-separate-io-buffer |
863 (gdb-display-buffer | 859 (gdb-display-buffer |
864 (gdb-get-create-buffer 'gdb-inferior-io)))) | 860 (gdb-get-create-buffer 'gdb-inferior-io)))) |
865 | 861 |
866 (defconst gdb-frame-parameters | 862 (defconst gdb-frame-parameters |
867 '((height . 14) (width . 80) | 863 '((height . 14) (width . 80) |
868 (unsplittable . t) | 864 (unsplittable . t) |
869 (tool-bar-lines . nil) | 865 (tool-bar-lines . nil) |
870 (menu-bar-lines . nil) | 866 (menu-bar-lines . nil) |
871 (minibuffer . nil))) | 867 (minibuffer . nil))) |
872 | 868 |
873 (defun gdb-frame-inferior-io-buffer () | 869 (defun gdb-frame-separate-io-buffer () |
874 "Display IO of inferior in a new frame." | 870 "Display IO of inferior in a new frame." |
875 (interactive) | 871 (interactive) |
876 (if gdb-use-inferior-io-buffer | 872 (if gdb-use-separate-io-buffer |
877 (let ((special-display-regexps (append special-display-regexps '(".*"))) | 873 (let ((special-display-regexps (append special-display-regexps '(".*"))) |
878 (special-display-frame-alist gdb-frame-parameters)) | 874 (special-display-frame-alist gdb-frame-parameters)) |
879 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io))))) | 875 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io))))) |
880 | 876 |
881 (defvar gdb-inferior-io-mode-map | 877 (defvar gdb-inferior-io-mode-map |
882 (let ((map (make-sparse-keymap))) | 878 (let ((map (make-sparse-keymap))) |
883 (define-key map "\C-c\C-c" 'gdb-inferior-io-interrupt) | 879 (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt) |
884 (define-key map "\C-c\C-z" 'gdb-inferior-io-stop) | 880 (define-key map "\C-c\C-z" 'gdb-separate-io-stop) |
885 (define-key map "\C-c\C-\\" 'gdb-inferior-io-quit) | 881 (define-key map "\C-c\C-\\" 'gdb-separate-io-quit) |
886 (define-key map "\C-c\C-d" 'gdb-inferior-io-eof) | 882 (define-key map "\C-c\C-d" 'gdb-separate-io-eof) |
887 (define-key map "\C-d" 'gdb-inferior-io-eof) | 883 (define-key map "\C-d" 'gdb-separate-io-eof) |
888 map)) | 884 map)) |
889 | 885 |
890 (define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O" | 886 (define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O" |
891 "Major mode for gdb inferior-io." | 887 "Major mode for gdb inferior-io." |
892 :syntax-table nil :abbrev-table nil | 888 :syntax-table nil :abbrev-table nil |
903 (with-current-buffer (process-buffer proc) | 899 (with-current-buffer (process-buffer proc) |
904 (setq proc (get-buffer-process gud-comint-buffer)) | 900 (setq proc (get-buffer-process gud-comint-buffer)) |
905 (process-send-string proc string) | 901 (process-send-string proc string) |
906 (process-send-string proc "\n"))) | 902 (process-send-string proc "\n"))) |
907 | 903 |
908 (defun gdb-inferior-io-interrupt () | 904 (defun gdb-separate-io-interrupt () |
909 "Interrupt the program being debugged." | 905 "Interrupt the program being debugged." |
910 (interactive) | 906 (interactive) |
911 (interrupt-process | 907 (interrupt-process |
912 (get-buffer-process gud-comint-buffer) comint-ptyp)) | 908 (get-buffer-process gud-comint-buffer) comint-ptyp)) |
913 | 909 |
914 (defun gdb-inferior-io-quit () | 910 (defun gdb-separate-io-quit () |
915 "Send quit signal to the program being debugged." | 911 "Send quit signal to the program being debugged." |
916 (interactive) | 912 (interactive) |
917 (quit-process | 913 (quit-process |
918 (get-buffer-process gud-comint-buffer) comint-ptyp)) | 914 (get-buffer-process gud-comint-buffer) comint-ptyp)) |
919 | 915 |
920 (defun gdb-inferior-io-stop () | 916 (defun gdb-separate-io-stop () |
921 "Stop the program being debugged." | 917 "Stop the program being debugged." |
922 (interactive) | 918 (interactive) |
923 (stop-process | 919 (stop-process |
924 (get-buffer-process gud-comint-buffer) comint-ptyp)) | 920 (get-buffer-process gud-comint-buffer) comint-ptyp)) |
925 | 921 |
926 (defun gdb-inferior-io-eof () | 922 (defun gdb-separate-io-eof () |
927 "Send end-of-file to the program being debugged." | 923 "Send end-of-file to the program being debugged." |
928 (interactive) | 924 (interactive) |
929 (process-send-eof | 925 (process-send-eof |
930 (get-buffer-process gud-comint-buffer))) | 926 (get-buffer-process gud-comint-buffer))) |
931 | 927 |
1117 (let ((sink gdb-output-sink)) | 1113 (let ((sink gdb-output-sink)) |
1118 (cond | 1114 (cond |
1119 ((eq sink 'user) | 1115 ((eq sink 'user) |
1120 (progn | 1116 (progn |
1121 (setq gud-running t) | 1117 (setq gud-running t) |
1122 (if gdb-use-inferior-io-buffer | 1118 (if gdb-use-separate-io-buffer |
1123 (setq gdb-output-sink 'inferior)))) | 1119 (setq gdb-output-sink 'inferior)))) |
1124 (t | 1120 (t |
1125 (gdb-resync) | 1121 (gdb-resync) |
1126 (error "Unexpected `starting' annotation"))))) | 1122 (error "Unexpected `starting' annotation"))))) |
1127 | 1123 |
1128 (defun gdb-stopping (ignored) | 1124 (defun gdb-stopping (ignored) |
1129 "An annotation handler for `breakpoint' and other annotations. | 1125 "An annotation handler for `breakpoint' and other annotations. |
1130 They say that I/O for the subprocess is now GDB, not the program | 1126 They say that I/O for the subprocess is now GDB, not the program |
1131 being debugged." | 1127 being debugged." |
1132 (if gdb-use-inferior-io-buffer | 1128 (if gdb-use-separate-io-buffer |
1133 (let ((sink gdb-output-sink)) | 1129 (let ((sink gdb-output-sink)) |
1134 (cond | 1130 (cond |
1135 ((eq sink 'inferior) | 1131 ((eq sink 'inferior) |
1136 (setq gdb-output-sink 'user)) | 1132 (setq gdb-output-sink 'user)) |
1137 (t | 1133 (t |
1193 ;; so gdb-frame-address is updated. | 1189 ;; so gdb-frame-address is updated. |
1194 ;; (gdb-invalidate-assembler) | 1190 ;; (gdb-invalidate-assembler) |
1195 | 1191 |
1196 (if (string-equal gdb-version "pre-6.4") | 1192 (if (string-equal gdb-version "pre-6.4") |
1197 (gdb-invalidate-registers) | 1193 (gdb-invalidate-registers) |
1198 (if (gdb-get-buffer 'gdb-registers-buffer) (gdb-get-changed-registers)) | 1194 (gdb-get-changed-registers) |
1199 (gdb-invalidate-registers-1)) | 1195 (gdb-invalidate-registers-1)) |
1200 | 1196 |
1201 (gdb-invalidate-memory) | 1197 (gdb-invalidate-memory) |
1202 (if (string-equal gdb-version "pre-6.4") | 1198 (if (string-equal gdb-version "pre-6.4") |
1203 (gdb-invalidate-locals) | 1199 (gdb-invalidate-locals) |
1496 (defun gdb-info-breakpoints-custom () | 1492 (defun gdb-info-breakpoints-custom () |
1497 (let ((flag) (bptno)) | 1493 (let ((flag) (bptno)) |
1498 ;; Remove all breakpoint-icons in source buffers but not assembler buffer. | 1494 ;; Remove all breakpoint-icons in source buffers but not assembler buffer. |
1499 (dolist (buffer (buffer-list)) | 1495 (dolist (buffer (buffer-list)) |
1500 (with-current-buffer buffer | 1496 (with-current-buffer buffer |
1501 (if (and (eq gud-minor-mode 'gdba) | 1497 (if (and (memq gud-minor-mode '(gdba gdbmi)) |
1502 (not (string-match "\\`\\*.+\\*\\'" (buffer-name)))) | 1498 (not (string-match "\\`\\*.+\\*\\'" (buffer-name)))) |
1503 (gdb-remove-breakpoint-icons (point-min) (point-max))))) | 1499 (gdb-remove-breakpoint-icons (point-min) (point-max))))) |
1504 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer) | 1500 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer) |
1505 (save-excursion | 1501 (save-excursion |
1506 (goto-char (point-min)) | 1502 (goto-char (point-min)) |
1631 (display-buffer (gdb-get-create-buffer 'gdb-breakpoints-buffer)))) | 1627 (display-buffer (gdb-get-create-buffer 'gdb-breakpoints-buffer)))) |
1632 | 1628 |
1633 (defvar gdb-breakpoints-mode-map | 1629 (defvar gdb-breakpoints-mode-map |
1634 (let ((map (make-sparse-keymap)) | 1630 (let ((map (make-sparse-keymap)) |
1635 (menu (make-sparse-keymap "Breakpoints"))) | 1631 (menu (make-sparse-keymap "Breakpoints"))) |
1636 (define-key menu [quit] '("Quit" . kill-this-buffer)) | 1632 (define-key menu [quit] '("Quit" . gdb-delete-frame-or-window)) |
1637 (define-key menu [goto] '("Goto" . gdb-goto-breakpoint)) | 1633 (define-key menu [goto] '("Goto" . gdb-goto-breakpoint)) |
1638 (define-key menu [delete] '("Delete" . gdb-delete-breakpoint)) | 1634 (define-key menu [delete] '("Delete" . gdb-delete-breakpoint)) |
1639 (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint)) | 1635 (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint)) |
1640 (suppress-keymap map) | 1636 (suppress-keymap map) |
1641 (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu)) | 1637 (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu)) |
1666 (run-mode-hooks 'gdb-breakpoints-mode-hook) | 1662 (run-mode-hooks 'gdb-breakpoints-mode-hook) |
1667 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 1663 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
1668 'gdb-invalidate-breakpoints | 1664 'gdb-invalidate-breakpoints |
1669 'gdbmi-invalidate-breakpoints)) | 1665 'gdbmi-invalidate-breakpoints)) |
1670 | 1666 |
1667 (defconst gdb-breakpoint-regexp | |
1668 "\\([0-9]+\\).*?\\(?:point\\|catch\\s-+\\S-+\\)\\s-+\\S-+\\s-+\\(.\\)\\s-+") | |
1669 | |
1671 (defun gdb-toggle-breakpoint () | 1670 (defun gdb-toggle-breakpoint () |
1672 "Enable/disable breakpoint at current line." | 1671 "Enable/disable breakpoint at current line." |
1673 (interactive) | 1672 (interactive) |
1674 (save-excursion | 1673 (save-excursion |
1675 (beginning-of-line 1) | 1674 (beginning-of-line 1) |
1676 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 1675 (if (looking-at gdb-breakpoint-regexp) |
1677 (looking-at "\\([0-9]+\\).*?point\\s-+\\S-+\\s-+\\(.\\)\\s-+") | |
1678 (looking-at | |
1679 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+\\(.\\)\\s-+\\S-+\\s-+\\S-+:[0-9]+")) | |
1680 (gdb-enqueue-input | 1676 (gdb-enqueue-input |
1681 (list | 1677 (list |
1682 (concat gdb-server-prefix | 1678 (concat gdb-server-prefix |
1683 (if (eq ?y (char-after (match-beginning 2))) | 1679 (if (eq ?y (char-after (match-beginning 2))) |
1684 "disable " | 1680 "disable " |
1688 | 1684 |
1689 (defun gdb-delete-breakpoint () | 1685 (defun gdb-delete-breakpoint () |
1690 "Delete the breakpoint at current line." | 1686 "Delete the breakpoint at current line." |
1691 (interactive) | 1687 (interactive) |
1692 (beginning-of-line 1) | 1688 (beginning-of-line 1) |
1693 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 1689 (if (looking-at gdb-breakpoint-regexp) |
1694 (looking-at "\\([0-9]+\\).*?point\\s-+\\S-+\\s-+\\(.\\)") | |
1695 (looking-at | |
1696 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+\\s-+\\S-+\\s-+\\S-+:[0-9]+")) | |
1697 (gdb-enqueue-input | 1690 (gdb-enqueue-input |
1698 (list | 1691 (list |
1699 (concat gdb-server-prefix "delete " (match-string 1) "\n") 'ignore)) | 1692 (concat gdb-server-prefix "delete " (match-string 1) "\n") 'ignore)) |
1700 (error "Not recognized as break/watchpoint line"))) | 1693 (error "Not recognized as break/watchpoint line"))) |
1701 | 1694 |
1706 ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer. | 1699 ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer. |
1707 (let ((window (get-buffer-window gud-comint-buffer))) | 1700 (let ((window (get-buffer-window gud-comint-buffer))) |
1708 (if window (save-selected-window (select-window window)))) | 1701 (if window (save-selected-window (select-window window)))) |
1709 (save-excursion | 1702 (save-excursion |
1710 (beginning-of-line 1) | 1703 (beginning-of-line 1) |
1711 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 1704 (if (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)") |
1712 (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)") | |
1713 (looking-at | |
1714 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+.\\s-+\\S-+\\s-+\ | |
1715 \\(\\S-+\\):\\([0-9]+\\)")) | |
1716 (let ((bptno (match-string 1)) | 1705 (let ((bptno (match-string 1)) |
1717 (file (match-string 2)) | 1706 (file (match-string 2)) |
1718 (line (match-string 3))) | 1707 (line (match-string 3))) |
1719 (save-selected-window | 1708 (save-selected-window |
1720 (let* ((buf (find-file-noselect | 1709 (let* ((buf (find-file-noselect |
1722 (cdr (assoc bptno gdb-location-alist))))) | 1711 (cdr (assoc bptno gdb-location-alist))))) |
1723 (window (display-buffer buf))) | 1712 (window (display-buffer buf))) |
1724 (with-current-buffer buf | 1713 (with-current-buffer buf |
1725 (goto-line (string-to-number line)) | 1714 (goto-line (string-to-number line)) |
1726 (set-window-point window (point)))))) | 1715 (set-window-point window (point)))))) |
1727 (error "Not recognized as break/watchpoint line")))) | 1716 (error "No location specified.")))) |
1728 | 1717 |
1729 | 1718 |
1730 ;; Frames buffer. This displays a perpetually correct bactracktrace | 1719 ;; Frames buffer. This displays a perpetually correct bactracktrace |
1731 ;; (from the command `where'). | 1720 ;; (from the command `where'). |
1732 ;; | 1721 ;; |
2414 (setq buffer-read-only t) | 2403 (setq buffer-read-only t) |
2415 (use-local-map gdb-locals-mode-map) | 2404 (use-local-map gdb-locals-mode-map) |
2416 (set (make-local-variable 'font-lock-defaults) | 2405 (set (make-local-variable 'font-lock-defaults) |
2417 '(gdb-locals-font-lock-keywords)) | 2406 '(gdb-locals-font-lock-keywords)) |
2418 (run-mode-hooks 'gdb-locals-mode-hook) | 2407 (run-mode-hooks 'gdb-locals-mode-hook) |
2419 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) | 2408 (if (and (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
2420 (if (string-equal gdb-version "pre-6.4") | 2409 (string-equal gdb-version "pre-6.4")) |
2421 'gdb-invalidate-locals | 2410 'gdb-invalidate-locals |
2422 'gdb-invalidate-locals-1) | 2411 'gdb-invalidate-locals-1)) |
2423 'gdbmi-invalidate-locals)) | |
2424 | 2412 |
2425 (defun gdb-locals-buffer-name () | 2413 (defun gdb-locals-buffer-name () |
2426 (with-current-buffer gud-comint-buffer | 2414 (with-current-buffer gud-comint-buffer |
2427 (concat "*locals of " (gdb-get-target-string) "*"))) | 2415 (concat "*locals of " (gdb-get-target-string) "*"))) |
2428 | 2416 |
2476 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) | 2464 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) |
2477 (define-key menu [disassembly] | 2465 (define-key menu [disassembly] |
2478 '("Disassembly" . gdb-display-assembler-buffer)) | 2466 '("Disassembly" . gdb-display-assembler-buffer)) |
2479 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) | 2467 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) |
2480 (define-key menu [inferior] | 2468 (define-key menu [inferior] |
2481 '(menu-item "Inferior IO" gdb-display-inferior-io-buffer | 2469 '(menu-item "Inferior IO" gdb-display-separate-io-buffer |
2482 :enable gdb-use-inferior-io-buffer)) | 2470 :enable gdb-use-separate-io-buffer)) |
2483 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) | 2471 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) |
2484 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) | 2472 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) |
2485 (define-key menu [breakpoints] | 2473 (define-key menu [breakpoints] |
2486 '("Breakpoints" . gdb-display-breakpoints-buffer))) | 2474 '("Breakpoints" . gdb-display-breakpoints-buffer))) |
2487 | 2475 |
2493 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) | 2481 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) |
2494 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer)) | 2482 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer)) |
2495 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) | 2483 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) |
2496 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) | 2484 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) |
2497 (define-key menu [inferior] | 2485 (define-key menu [inferior] |
2498 '(menu-item "Inferior IO" gdb-frame-inferior-io-buffer | 2486 '(menu-item "Inferior IO" gdb-frame-separate-io-buffer |
2499 :enable gdb-use-inferior-io-buffer)) | 2487 :enable gdb-use-separate-io-buffer)) |
2500 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) | 2488 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) |
2501 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)) | 2489 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)) |
2502 (define-key menu [breakpoints] | 2490 (define-key menu [breakpoints] |
2503 '("Breakpoints" . gdb-frame-breakpoints-buffer))) | 2491 '("Breakpoints" . gdb-frame-breakpoints-buffer))) |
2504 | 2492 |
2505 (let ((menu (make-sparse-keymap "GDB-UI/MI"))) | 2493 (let ((menu (make-sparse-keymap "GDB-UI/MI"))) |
2506 (define-key gud-menu-map [ui] | 2494 (define-key gud-menu-map [ui] |
2507 `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI") | 2495 `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI") |
2508 ,menu :visible (memq gud-minor-mode '(gdbmi gdba)))) | 2496 ,menu :visible (memq gud-minor-mode '(gdbmi gdba)))) |
2509 (define-key menu [gdb-use-inferior-io] | 2497 (define-key menu [gdb-use-separate-io] |
2510 '(menu-item "Separate inferior IO" gdb-use-inferior-io-buffer | 2498 '(menu-item "Separate inferior IO" gdb-use-separate-io-buffer |
2511 :visible (eq gud-minor-mode 'gdba) | 2499 :visible (eq gud-minor-mode 'gdba) |
2512 :help "Toggle separate IO for inferior." | 2500 :help "Toggle separate IO for inferior." |
2513 :button (:toggle . gdb-use-inferior-io-buffer))) | 2501 :button (:toggle . gdb-use-separate-io-buffer))) |
2514 (define-key menu [gdb-many-windows] | 2502 (define-key menu [gdb-many-windows] |
2515 '(menu-item "Display Other Windows" gdb-many-windows | 2503 '(menu-item "Display Other Windows" gdb-many-windows |
2516 :help "Toggle display of locals, stack and breakpoint information" | 2504 :help "Toggle display of locals, stack and breakpoint information" |
2517 :button (:toggle . gdb-many-windows))) | 2505 :button (:toggle . gdb-many-windows))) |
2518 (define-key menu [gdb-restore-windows] | 2506 (define-key menu [gdb-restore-windows] |
2554 (other-window 1) | 2542 (other-window 1) |
2555 (switch-to-buffer | 2543 (switch-to-buffer |
2556 (if gud-last-last-frame | 2544 (if gud-last-last-frame |
2557 (gud-find-file (car gud-last-last-frame)) | 2545 (gud-find-file (car gud-last-last-frame)) |
2558 (gud-find-file gdb-main-file))) | 2546 (gud-find-file gdb-main-file))) |
2559 (when gdb-use-inferior-io-buffer | 2547 (when gdb-use-separate-io-buffer |
2560 (split-window-horizontally) | 2548 (split-window-horizontally) |
2561 (other-window 1) | 2549 (other-window 1) |
2562 (gdb-set-window-buffer | 2550 (gdb-set-window-buffer |
2563 (gdb-get-create-buffer 'gdb-inferior-io))) | 2551 (gdb-get-create-buffer 'gdb-inferior-io))) |
2564 (other-window 1) | 2552 (other-window 1) |
2682 "Set up buffer for debugging if file is part of the source code | 2670 "Set up buffer for debugging if file is part of the source code |
2683 of the current session." | 2671 of the current session." |
2684 (if (and (buffer-name gud-comint-buffer) | 2672 (if (and (buffer-name gud-comint-buffer) |
2685 ;; in case gud or gdb-ui is just loaded | 2673 ;; in case gud or gdb-ui is just loaded |
2686 gud-comint-buffer | 2674 gud-comint-buffer |
2687 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) | 2675 (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer) |
2688 'gdba)) | 2676 '(gdba gdbmi))) |
2689 (if (member buffer-file-name gdb-source-file-list) | 2677 (if (member buffer-file-name gdb-source-file-list) |
2690 (with-current-buffer (find-buffer-visiting buffer-file-name) | 2678 (with-current-buffer (find-buffer-visiting buffer-file-name) |
2691 (set (make-local-variable 'gud-minor-mode) 'gdba) | 2679 (set (make-local-variable 'gud-minor-mode) |
2680 (buffer-local-value 'gud-minor-mode gud-comint-buffer)) | |
2692 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))) | 2681 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))) |
2693 | 2682 |
2694 ;;from put-image | 2683 ;;from put-image |
2695 (defun gdb-put-string (putstring pos &optional dprop &rest sprops) | 2684 (defun gdb-put-string (putstring pos &optional dprop &rest sprops) |
2696 "Put string PUTSTRING in front of POS in the current buffer. | 2685 "Put string PUTSTRING in front of POS in the current buffer. |
2965 (setq gdb-frame-address (match-string 1)))) | 2954 (setq gdb-frame-address (match-string 1)))) |
2966 (goto-char (point-min)) | 2955 (goto-char (point-min)) |
2967 (if (re-search-forward " source language \\(\\S-*\\)\." nil t) | 2956 (if (re-search-forward " source language \\(\\S-*\\)\." nil t) |
2968 (setq gdb-current-language (match-string 1))) | 2957 (setq gdb-current-language (match-string 1))) |
2969 (gdb-invalidate-assembler)) | 2958 (gdb-invalidate-assembler)) |
2959 | |
2970 | 2960 |
2971 | |
2972 ;; For debugging Emacs only (assumes that usual stack buffer already exists). | |
2973 (defun gdb-xbacktrace () | |
2974 "Generate a full lisp level backtrace with arguments." | |
2975 (interactive) | |
2976 (setq my-frames nil) | |
2977 (with-current-buffer (get-buffer-create "xbacktrace") | |
2978 (erase-buffer)) | |
2979 (let (frame-number gdb-frame-number) | |
2980 (with-current-buffer (gdb-get-buffer 'gdb-stack-buffer) | |
2981 (save-excursion | |
2982 (goto-char (point-min)) | |
2983 (while (search-forward "in Ffuncall " nil t) | |
2984 (goto-char (line-beginning-position)) | |
2985 (looking-at "^#\\([0-9]+\\)") | |
2986 (push (match-string-no-properties 1) my-frames) | |
2987 (forward-line 1)))) | |
2988 (dolist (frame my-frames) | |
2989 (gdb-enqueue-input (list (concat "server frame " frame "\n") | |
2990 'ignore)) | |
2991 ; (gdb-enqueue-input (list "server ppargs\n" 'gdb-get-arguments)) | |
2992 (gud-basic-call "server ppargs") | |
2993 ) | |
2994 (gdb-enqueue-input (list (concat "server frame " frame-number "\n") | |
2995 'ignore)))) | |
2996 | |
2997 (defun gdb-get-arguments () | |
2998 (with-current-buffer "xbacktrace" | |
2999 (insert-buffer-substring (gdb-get-buffer 'gdb-partial-output-buffer)))) | |
3000 | |
3001 ;; Code specific to GDB 6.4 | 2961 ;; Code specific to GDB 6.4 |
3002 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"") | 2962 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"") |
3003 | 2963 |
3004 (defun gdb-set-gud-minor-mode-existing-buffers-1 () | 2964 (defun gdb-set-gud-minor-mode-existing-buffers-1 () |
3005 "Create list of source files for current GDB session." | 2965 "Create list of source files for current GDB session. |
2966 If buffers already exist for any of these files, gud-minor-mode | |
2967 is set in them." | |
3006 (goto-char (point-min)) | 2968 (goto-char (point-min)) |
3007 (while (re-search-forward gdb-source-file-regexp-1 nil t) | 2969 (while (re-search-forward gdb-source-file-regexp-1 nil t) |
3008 (push (match-string 1) gdb-source-file-list)) | 2970 (push (match-string 1) gdb-source-file-list)) |
3009 (dolist (buffer (buffer-list)) | 2971 (dolist (buffer (buffer-list)) |
3010 (with-current-buffer buffer | 2972 (with-current-buffer buffer |
3011 (when (member buffer-file-name gdb-source-file-list) | 2973 (when (member buffer-file-name gdb-source-file-list) |
3012 (set (make-local-variable 'gud-minor-mode) 'gdba) | 2974 (set (make-local-variable 'gud-minor-mode) |
2975 (buffer-local-value 'gud-minor-mode gud-comint-buffer)) | |
3013 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 2976 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
3014 (when gud-tooltip-mode | 2977 (when gud-tooltip-mode |
3015 (make-local-variable 'gdb-define-alist) | 2978 (make-local-variable 'gdb-define-alist) |
3016 (gdb-create-define-alist) | 2979 (gdb-create-define-alist) |
3017 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))))) | 2980 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))))) |
3018 | 2981 |
3019 ; Uses "-var-list-children --all-values". Needs GDB 6.1 onwards. | 2982 ; Uses "-var-list-children --all-values". Needs GDB 6.1 onwards. |
3020 (defun gdb-var-list-children-1 (varnum) | 2983 (defun gdb-var-list-children-1 (varnum) |
3021 (gdb-enqueue-input | 2984 (gdb-enqueue-input |
3022 (list (concat "server interpreter mi \"-var-update " varnum "\"\n") | 2985 (list |
3023 'ignore)) | 2986 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
3024 (gdb-enqueue-input | 2987 (concat "server interpreter mi \"-var-list-children --all-values " |
3025 (list (concat "server interpreter mi \"-var-list-children --all-values " | 2988 varnum "\"\n") |
3026 varnum "\"\n") | 2989 (concat "-var-list-children --all-values " varnum "\n")) |
3027 `(lambda () (gdb-var-list-children-handler-1 ,varnum))))) | 2990 `(lambda () (gdb-var-list-children-handler-1 ,varnum))))) |
3028 | 2991 |
3029 (defconst gdb-var-list-children-regexp-1 | 2992 (defconst gdb-var-list-children-regexp-1 |
3030 "name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\ | 2993 "name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\ |
3031 value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}") | 2994 value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}") |
3032 | 2995 |
3057 (defun gdb-var-update-1 () | 3020 (defun gdb-var-update-1 () |
3058 (if (not (member 'gdb-var-update gdb-pending-triggers)) | 3021 (if (not (member 'gdb-var-update gdb-pending-triggers)) |
3059 (progn | 3022 (progn |
3060 (gdb-enqueue-input | 3023 (gdb-enqueue-input |
3061 (list | 3024 (list |
3062 (if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)) | 3025 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
3063 "server interpreter mi \"-var-update --all-values *\"\n" | 3026 "server interpreter mi \"-var-update --all-values *\"\n" |
3064 "-var-update --all-values *\n") | 3027 "-var-update --all-values *\n") |
3065 'gdb-var-update-handler-1)) | 3028 'gdb-var-update-handler-1)) |
3066 (push 'gdb-var-update gdb-pending-triggers)))) | 3029 (push 'gdb-var-update gdb-pending-triggers)))) |
3067 | 3030 |
3068 (defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),") | 3031 (defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),") |
3069 | 3032 |
3070 (defun gdb-var-update-handler-1 () | 3033 (defun gdb-var-update-handler-1 () |
3096 'gdb-registers-buffer-name | 3059 'gdb-registers-buffer-name |
3097 'gdb-registers-mode) | 3060 'gdb-registers-mode) |
3098 | 3061 |
3099 (def-gdb-auto-update-trigger gdb-invalidate-registers-1 | 3062 (def-gdb-auto-update-trigger gdb-invalidate-registers-1 |
3100 (gdb-get-buffer 'gdb-registers-buffer) | 3063 (gdb-get-buffer 'gdb-registers-buffer) |
3101 (if (eq gud-minor-mode 'gdba) | 3064 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
3102 "server interpreter mi \"-data-list-register-values x\"\n" | 3065 "server interpreter mi \"-data-list-register-values x\"\n" |
3103 "-data-list-register-values x\n") | 3066 "-data-list-register-values x\n") |
3104 gdb-data-list-register-values-handler) | 3067 gdb-data-list-register-values-handler) |
3105 | 3068 |
3106 (defconst gdb-data-list-register-values-regexp | 3069 (defconst gdb-data-list-register-values-regexp |
3155 mouse-face highlight)))) | 3118 mouse-face highlight)))) |
3156 (forward-line 1)))))) | 3119 (forward-line 1)))))) |
3157 | 3120 |
3158 ;; Needs GDB 6.4 onwards (used to fail with no stack). | 3121 ;; Needs GDB 6.4 onwards (used to fail with no stack). |
3159 (defun gdb-get-changed-registers () | 3122 (defun gdb-get-changed-registers () |
3160 (if (not (member 'gdb-get-changed-registers gdb-pending-triggers)) | 3123 (if (and (gdb-get-buffer 'gdb-registers-buffer) |
3124 (not (member 'gdb-get-changed-registers gdb-pending-triggers))) | |
3161 (progn | 3125 (progn |
3162 (gdb-enqueue-input | 3126 (gdb-enqueue-input |
3163 (list | 3127 (list |
3164 (if (eq gud-minor-mode 'gdba) | 3128 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
3165 "server interpreter mi -data-list-changed-registers\n" | 3129 "server interpreter mi -data-list-changed-registers\n" |
3166 "-data-list-changed-registers\n") | 3130 "-data-list-changed-registers\n") |
3167 'gdb-get-changed-registers-handler)) | 3131 'gdb-get-changed-registers-handler)) |
3168 (push 'gdb-get-changed-registers gdb-pending-triggers)))) | 3132 (push 'gdb-get-changed-registers gdb-pending-triggers)))) |
3169 | 3133 |
3170 (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"") | 3134 (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"") |
3171 | 3135 |
3172 (defun gdb-get-changed-registers-handler () | 3136 (defun gdb-get-changed-registers-handler () |
3185 'gdb-locals-buffer-name | 3149 'gdb-locals-buffer-name |
3186 'gdb-locals-mode) | 3150 'gdb-locals-mode) |
3187 | 3151 |
3188 (def-gdb-auto-update-trigger gdb-invalidate-locals-1 | 3152 (def-gdb-auto-update-trigger gdb-invalidate-locals-1 |
3189 (gdb-get-buffer 'gdb-locals-buffer) | 3153 (gdb-get-buffer 'gdb-locals-buffer) |
3190 "server interpreter mi -\"stack-list-locals --simple-values\"\n" | 3154 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) |
3155 "server interpreter mi -\"stack-list-locals --simple-values\"\n" | |
3156 "-stack-list-locals --simple-values\n") | |
3191 gdb-stack-list-locals-handler) | 3157 gdb-stack-list-locals-handler) |
3192 | 3158 |
3193 (defconst gdb-stack-list-locals-regexp | 3159 (defconst gdb-stack-list-locals-regexp |
3194 "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"") | 3160 "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"") |
3195 | 3161 |