changeset 17468:94face85736e

(font-lock-fontify-syntactically-region): Use new features of parse-partial-sexp instead of doing regexp search.
author Richard M. Stallman <rms@gnu.org>
date Tue, 15 Apr 1997 05:00:36 +0000
parents 98c47e7857f3
children 141077afaa74
files lisp/font-lock.el
diffstat 1 files changed, 26 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/font-lock.el	Tue Apr 15 04:58:34 1997 +0000
+++ b/lisp/font-lock.el	Tue Apr 15 05:00:36 1997 +0000
@@ -1027,14 +1027,8 @@
 (defun font-lock-fontify-syntactically-region (start end &optional loudly)
   "Put proper face on each string and comment between START and END.
 START should be at the beginning of a line."
-  (let ((synstart (cond (font-lock-comment-start-regexp
-			 (concat "\\s\"\\|" font-lock-comment-start-regexp))
-			(comment-start-skip
-			 (concat "\\s\"\\|" comment-start-skip))
-			(t
-			 "\\s\"")))
-	(cache (marker-position font-lock-cache-position))
-	state prev here beg)
+  (let (state prev here comment
+	      (cache (marker-position font-lock-cache-position)))
     (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
     (goto-char start)
     ;;
@@ -1058,73 +1052,33 @@
       (set-marker font-lock-cache-position start))
     ;;
     ;; If the region starts inside a string, show the extent of it.
-    (when (nth 3 state)
-      (setq here (point))
-      (while (and (re-search-forward "\\s\"" end 'move)
-		  ;; Verify the state so we don't get fooled by quoting.
-		  (nth 3 (parse-partial-sexp here (point) nil nil state))))
-      (put-text-property here (point) 'face font-lock-string-face)
-      (setq state (parse-partial-sexp here (point) nil nil state)))
-    ;;
-    ;; Likewise for a comment.
-    (when (or (nth 4 state) (nth 7 state))
-      (let ((comstart (cond (font-lock-comment-start-regexp
-			     font-lock-comment-start-regexp)
-			    (comment-start-skip
-			     (concat "\\s<\\|" comment-start-skip))
-			    (t
-			     "\\s<")))
-	    (count 1))
-	(setq here (point))
-	(condition-case nil
-	    (save-restriction
-	      (narrow-to-region (point-min) end)
-	      ;; Go back to the real start of the comment.
-	      (re-search-backward comstart)
-	      (forward-comment 1)
-	      ;; If there is more than one comment type, then the previous
-	      ;; comment start might not be the real comment start.
-	      ;; For example, in C++ code, `here' might be on a line following
-	      ;; a // comment that is actually within a /* */ comment.
-	      (while (<= (point) here)
-		(goto-char here)
-		(re-search-backward comstart nil nil (incf count))
-		(forward-comment 1))
-	      ;; Go back to the real end of the comment.
-	      (skip-chars-backward " \t"))
-	  (error (goto-char end)))
-	(put-text-property here (point) 'face font-lock-comment-face)
-	(setq state (parse-partial-sexp here (point) nil nil state))))
+    (when (or (nth 4 state) (nth 3 state))
+      (setq comment (nth 4 state) here (point))
+      (setq state (parse-partial-sexp (point) end
+				      nil nil state 'syntax-table))
+      (put-text-property here (point) 'face 
+			 (if comment 
+			     font-lock-comment-face
+			   font-lock-string-face)))
     ;;
     ;; Find each interesting place between here and `end'.
     (while (and (< (point) end)
-		(setq prev (point))
-		(re-search-forward synstart end t)
-		(setq state (parse-partial-sexp prev (point) nil nil state)))
-      (cond ((nth 3 state)
-	     ;;
-	     ;; Found a real string start.
-	     (setq here (point) beg (match-beginning 0))
-	     (condition-case nil
-		 (save-restriction
-		   (narrow-to-region (point-min) end)
-		   (goto-char (scan-sexps beg 1)))
-	       (error (goto-char end)))
-	     (put-text-property beg (point) 'face font-lock-string-face)
-	     (setq state (parse-partial-sexp here (point) nil nil state)))
-	    ((or (nth 4 state) (nth 7 state))
-	     ;;
-	     ;; Found a real comment start.
-	     (setq here (point) beg (or (match-end 1) (match-beginning 0)))
-	     (goto-char beg)
-	     (condition-case nil
-		 (save-restriction
-		   (narrow-to-region (point-min) end)
-		   (forward-comment 1)
-		   (skip-chars-backward " \t"))
-	       (error (goto-char end)))
-	     (put-text-property beg (point) 'face font-lock-comment-face)
-	     (setq state (parse-partial-sexp here (point) nil nil state)))))))
+		(progn
+		  (setq prev (point)
+			state (parse-partial-sexp (point) end
+						  nil nil state 'syntax-table))
+		  (or (nth 3 state) (nth 4 state))))
+      (setq here (nth 8 state) comment (nth 4 state))
+      (setq state (parse-partial-sexp (point) end 
+				      nil nil state 'syntax-table))
+      (put-text-property here (point) 'face 
+			 (if comment 
+			     font-lock-comment-face
+			   font-lock-string-face))
+      ;;
+      ;; Make sure `prev' is non-nil after the loop
+      ;; only if it was set on the very last iteration.
+      (setq prev nil))))
 
 ;;; End of Syntactic fontification functions.