From d5436a295ebecaee604c27d007c4566d067ed975 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 17 Feb 1998 07:06:17 +0000 Subject: [PATCH] (c-point): In XEmacs, use scan-lists + buffer-syntactic-context-depth. (c-emacs-features): Added autoload cookie. --- lisp/progmodes/cc-defs.el | 56 ++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index fcd7b408a17..c7b62b8cb79 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -1,6 +1,6 @@ ;;; cc-defs.el --- definitions for CC Mode -;; Copyright (C) 1985,87,92,93,94,95,96,97 Free Software Foundation, Inc. +;; Copyright (C) 1985,87,92,93,94,95,96,97,98 Free Software Foundation, Inc. ;; Authors: 1992-1997 Barry A. Warsaw ;; 1987 Dave Detlefs and Stewart Clamen @@ -29,6 +29,7 @@ ;; Figure out what features this Emacs has +;;;###autoload (defconst c-emacs-features (let ((infodock-p (boundp 'infodock-version)) (comments @@ -90,14 +91,6 @@ Infodock (based on XEmacs) has an additional symbol on this list: (cond ((eq position 'bol) (beginning-of-line)) ((eq position 'eol) (end-of-line)) - ((eq position 'bod) - (beginning-of-defun) - ;; if defun-prompt-regexp is non-nil, b-o-d won't leave us at - ;; the open brace. - (and defun-prompt-regexp - (looking-at defun-prompt-regexp) - (goto-char (match-end 0))) - ) ((eq position 'boi) (back-to-indentation)) ((eq position 'bonl) (forward-line 1)) ((eq position 'bopl) (forward-line -1)) @@ -107,6 +100,51 @@ Infodock (based on XEmacs) has an additional symbol on this list: ((eq position 'ionl) (forward-line 1) (back-to-indentation)) + ((eq position 'bod) + (if (and (fboundp 'buffer-syntactic-context-depth) + c-enable-xemacs-performance-kludge-p) + ;; XEmacs only. This can improve the performance of + ;; c-parse-state to between 3 and 60 times faster when + ;; braces are hung. It can cause c-parse-state to be + ;; slightly slower when braces are not hung, but general + ;; editing appears to be still about as fast. + (let (pos) + (while (not pos) + (save-restriction + (widen) + (setq pos (scan-lists (point) -1 + (buffer-syntactic-context-depth) + nil t))) + (cond + ((bobp) (setq pos (point-min))) + ((not pos) + (let ((distance (skip-chars-backward "^{"))) + ;; unbalanced parenthesis, while illegal C code, + ;; shouldn't cause an infloop! See unbal.c + (when (zerop distance) + ;; Punt! + (beginning-of-defun) + (setq pos (point))))) + ((= pos 0)) + ((not (eq (char-after pos) ?{)) + (goto-char pos) + (setq pos nil)) + )) + (goto-char pos)) + ;; Emacs, which doesn't have buffer-syntactic-context-depth + ;; + ;; NOTE: This should be the only explicit use of + ;; beginning-of-defun in CC Mode. Eventually something better + ;; than b-o-d will be available and this should be the only + ;; place the code needs to change. Everything else should use + ;; (goto-char (c-point 'bod)) + (beginning-of-defun) + ;; if defun-prompt-regexp is non-nil, b-o-d won't leave us at + ;; the open brace. + (and defun-prompt-regexp + (looking-at defun-prompt-regexp) + (goto-char (match-end 0))) + )) (t (error "unknown buffer position requested: %s" position)) ) (prog1 -- 2.39.2