# HG changeset patch # User Richard M. Stallman # Date 887699177 0 # Node ID c7ee864ae985047ef537fa4cfaf29f0e99e92b8a # Parent a0748eef9a76f41abd43046495b92ff4546dbc78 (c-point): In XEmacs, use scan-lists + buffer-syntactic-context-depth. (c-emacs-features): Added autoload cookie. diff -r a0748eef9a76 -r c7ee864ae985 lisp/progmodes/cc-defs.el --- a/lisp/progmodes/cc-defs.el Tue Feb 17 07:04:48 1998 +0000 +++ b/lisp/progmodes/cc-defs.el Tue Feb 17 07:06:17 1998 +0000 @@ -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 @@ (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 @@ ((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