diff lisp/view.el @ 91040:14c4a6aac623

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 866-879) - Merge multi-tty branch - Update from CVS - Merge from emacs--rel--22 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-257
author Miles Bader <miles@gnu.org>
date Thu, 11 Oct 2007 16:14:00 +0000
parents 424b655804ca f8144f59d4b3
children 880960b70474
line wrap: on
line diff
--- a/lisp/view.el	Thu Oct 11 01:51:15 2007 +0000
+++ b/lisp/view.el	Thu Oct 11 16:14:00 2007 +0000
@@ -990,27 +990,27 @@
 	       times (if no "no " "") regexp)
       (sit-for 4))))
 
+;; This is the dumb approach, looking at each line.  The original
+;; version of this function looked like it might have been trying to
+;; do something clever, but not succeeding:
+;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2007-09/msg00073.html
 (defun view-search-no-match-lines (times regexp)
-  ;; Search for the TIMESt occurrence of line with no match for REGEXP.
-  (let ((back (and (< times 0) (setq times (- times)) -1))
-	n)
-    (while (> times 0)
-      (save-excursion (beginning-of-line (if back (- times) (1+ times)))
-		      (setq n (point)))
-      (setq times
-	    (cond
-	     ((< (count-lines (point) n) times) -1) ; Not enough lines.
-	     ((or (null (re-search-forward regexp nil t back))
-		  (if back (and (< (match-end 0) n)
-				(> (count-lines (match-end 0) n) 1))
-		    (and (< n (match-beginning 0))
-			 (> (count-lines n (match-beginning 0)) 1))))
-	      0)			; No match within lines.
-	     (back (count-lines (max n (match-beginning 0)) (match-end 0)))
-	     (t (count-lines (match-beginning 0) (min n (match-end 0))))))
-      (goto-char n))
-    (and (zerop times) (looking-at "^.*$"))))
-
+  "Search for the TIMESth occurrence of a line with no match for REGEXP.
+If such a line is found, return non-nil and set the match-data to that line.
+If TIMES is negative, search backwards."
+  (let ((step (if (>= times 0) 1
+                (setq times (- times))
+                -1)))
+    ;; Note that we do not check the current line.
+    (while (and (> times 0)
+                (zerop (forward-line step)))
+      ;; (forward-line 1) returns 0 on moving within the last line.
+      (if (eobp)
+          (setq times -1)
+        (or (re-search-forward regexp (line-end-position) t)
+            (setq times (1- times))))))
+  (and (zerop times)
+       (looking-at ".*")))
 
 (provide 'view)