]> git.eshelyaron.com Git - emacs.git/commitdiff
(c-point): In XEmacs, use scan-lists + buffer-syntactic-context-depth.
authorRichard M. Stallman <rms@gnu.org>
Tue, 17 Feb 1998 07:06:17 +0000 (07:06 +0000)
committerRichard M. Stallman <rms@gnu.org>
Tue, 17 Feb 1998 07:06:17 +0000 (07:06 +0000)
(c-emacs-features): Added autoload cookie.

lisp/progmodes/cc-defs.el

index fcd7b408a17ea6ea9cafdb6a9a9654ca3328955e..c7b62b8cb7967caacedc90d7af4b79955b86c2ff 100644 (file)
@@ -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 @@
 
 \f
 ;; 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