changeset 20913:c7ee864ae985

(c-point): In XEmacs, use scan-lists + buffer-syntactic-context-depth. (c-emacs-features): Added autoload cookie.
author Richard M. Stallman <rms@gnu.org>
date Tue, 17 Feb 1998 07:06:17 +0000
parents a0748eef9a76
children 8f189ffad604
files lisp/progmodes/cc-defs.el
diffstat 1 files changed, 47 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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