changeset 4419:e7348af6762b

(indent-c-exp): Don't document ENDPOS. (c-indent-region): Rewrite to use indent-c-exp on one sexp at a time, then use c-indent-line on the next line, etc.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 07:44:36 +0000
parents fdbbde0d4f24
children 8113d9ba472e
files lisp/progmodes/c-mode.el
diffstat 1 files changed, 32 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/c-mode.el	Mon Aug 02 07:43:59 1993 +0000
+++ b/lisp/progmodes/c-mode.el	Mon Aug 02 07:44:36 1993 +0000
@@ -957,10 +957,10 @@
   (beginning-of-defun)
   (backward-paragraph))
 
+;; Idea of ENDPOS is, indent each line, stopping when
+;; ENDPOS is encountered.  But it's too much of a pain to make that work.
 (defun indent-c-exp (&optional endpos)
-  "Indent each line of the C grouping following point.
-If optional arg ENDPOS is given, indent each line, stopping when
-ENDPOS is encountered."
+  "Indent each line of the C grouping following point."
   (interactive)
   (let* ((indent-stack (list nil))
 	 (opoint (point))  ;; May be altered below.
@@ -1184,10 +1184,35 @@
 (defun c-indent-region (start end)
   (save-excursion
     (goto-char start)
-    (let ((endmark (copy-marker end)))
-      (and (bolp) (not (eolp))
-	   (c-indent-line))
-      (indent-c-exp endmark)
+    (let ((endmark (copy-marker end))
+	  (c-tab-always-indent t))
+      (while (and (bolp) (not (eolp)))
+	;; Indent one line as with TAB.
+	(let ((shift-amt (c-indent-line))
+	      nextline sexpend)
+	  (save-excursion
+	    ;; Find beginning of following line.
+	    (save-excursion
+	      (forward-line 1) (setq nextline (point)))
+	    ;; Find first beginning-of-sexp for sexp extending past this line.
+	    (beginning-of-line)
+	    (while (< (point) nextline)
+	      (condition-case nil
+		  (progn
+		    (forward-sexp 1)
+		    (setq sexpend (point-marker)))
+		(error (setq sexpend nil)
+		       (goto-char nextline)))
+	      (skip-chars-forward " \t\n")))
+	  ;; If that sexp ends within the region,
+	  ;; indent it all at once, fast.
+	  (if (and sexpend (> sexpend nextline) (<= sexpend endmark))
+	      (progn
+		(indent-c-exp)
+		(goto-char sexpend)))
+	  ;; Move to following line and try again.
+	  (and sexpend (set-marker sexpend nil))
+	  (forward-line 1)))
       (set-marker endmark nil))))
 
 (defun set-c-style (style &optional global)