changeset 10763:d5a22f90865d

(sort-regexp-fields-next-record): New subroutine. If the first search does not advance point and finds an empty match, skip one char and search again. (sort-regexp-fields): Use that subroutine. Bind sort-regexp-fields-regexp, for sort-regexp-fields-next-record. (sort-regexp-fields-regexp): Declared. (sort-regexp-record-end): Declared.
author Richard M. Stallman <rms@gnu.org>
date Wed, 15 Feb 1995 22:21:25 +0000
parents 6ca3a749bebc
children a3e635f3501e
files lisp/sort.el
diffstat 1 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/sort.el	Wed Feb 15 19:11:32 1995 +0000
+++ b/lisp/sort.el	Wed Feb 15 22:21:25 1995 +0000
@@ -347,6 +347,25 @@
     ;; even if moving backwards.
     (skip-chars-backward "^ \t\n")))
 
+(defvar sort-regexp-fields-regexp)
+(defvar sort-regexp-record-end)
+
+;; Move to the beginning of the next match for record-regexp,
+;; and set sort-regexp-record-end to the end of that match.
+;; If the next match is empty and does not advance point,
+;; skip one character and try again.
+(defun sort-regexp-fields-next-record ()
+  (let ((oldpos (point)))
+    (and (re-search-forward sort-regexp-fields-regexp nil 'move)
+	 (setq sort-regexp-record-end (match-end 0))
+	 (if (= sort-regexp-record-end oldpos)
+	     (progn
+	       (forward-char 1)
+	       (re-search-forward sort-regexp-fields-regexp nil 'move)
+	       (setq sort-regexp-record-end (match-end 0)))
+	   t)
+	 (goto-char (match-beginning 0)))))
+
 ;;;###autoload
 (defun sort-regexp-fields (reverse record-regexp key-regexp beg end)
   "Sort the region lexicographically as specified by RECORD-REGEXP and KEY.
@@ -378,15 +397,13 @@
     (save-restriction
       (narrow-to-region beg end)
       (goto-char (point-min))
-      (let (sort-regexp-record-end) ;isn't dynamic scoping wonderful?
-	(re-search-forward record-regexp)
+      (let (sort-regexp-record-end
+	    (sort-regexp-fields-regexp record-regexp))
+	(re-search-forward sort-regexp-fields-regexp)
 	(setq sort-regexp-record-end (point))
 	(goto-char (match-beginning 0))
 	(sort-subr reverse
-		   (function (lambda ()
-			       (and (re-search-forward record-regexp nil 'move)
-				    (setq sort-regexp-record-end (match-end 0))
-				    (goto-char (match-beginning 0)))))
+		   'sort-regexp-fields-next-record
 		   (function (lambda ()
 			       (goto-char sort-regexp-record-end)))
 		   (function (lambda ()