*** empty log message ***
[gnus] / lisp / gnus-range.el
index 28d72c8..2ce1106 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-range.el --- range and sequence functions for Gnus
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
 ;; Keywords: news
 
 (defun gnus-copy-sequence (list)
   "Do a complete, total copy of a list."
-  (if (and (consp list) (not (consp (cdr list))))
-      (cons (car list) (cdr list))
-    (mapcar (lambda (elem) (if (consp elem)
-                              (if (consp (cdr elem))
-                                  (gnus-copy-sequence elem)
-                                (cons (car elem) (cdr elem)))
-                            elem))
-           list)))
+  (let (out)
+    (while (consp list)
+      (if (consp (car list))
+         (push (gnus-copy-sequence (pop list)) out)
+       (push (pop list) out)))
+    (if list
+       (nconc (nreverse out) list)
+      (nreverse out))))
 
 (defun gnus-set-difference (list1 list2)
   "Return a list of elements of LIST1 that do not appear in LIST2."
@@ -73,8 +73,8 @@ Both lists have to be sorted over <."
 (defun gnus-intersection (list1 list2)
   (let ((result nil))
     (while list2
-      (if (memq (car list2) list1)
-         (setq result (cons (car list2) result)))
+      (when (memq (car list2) list1)
+       (setq result (cons (car list2) result)))
       (setq list2 (cdr list2)))
     result))
 
@@ -128,7 +128,8 @@ ranges."
                (t                      ;End of one sequence
                 (setq result
                       (cons (if (= first last) first
-                              (cons first last)) result))
+                              (cons first last))
+                            result))
                 (setq first (car numbers))
                 (setq last  (car numbers))))
          (setq numbers (cdr numbers)))
@@ -156,8 +157,8 @@ these ranges."
      (t
       (while ranges
        (if (atom (car ranges))
-           (if (numberp (car ranges))
-               (setq result (cons (car ranges) result)))
+           (when (numberp (car ranges))
+             (setq result (cons (car ranges) result)))
          (setq first (caar ranges))
          (setq last  (cdar ranges))
          (while (<= first last)
@@ -172,8 +173,8 @@ Note: LIST has to be sorted over `<'."
   (if (not ranges)
       (gnus-compress-sequence list t)
     (setq list (copy-sequence list))
-    (or (listp (cdr ranges))
-       (setq ranges (list ranges)))
+    (unless (listp (cdr ranges))
+      (setq ranges (list ranges)))
     (let ((out ranges)
          ilist lowest highest temp)
       (while (and ranges list)
@@ -182,47 +183,42 @@ Note: LIST has to be sorted over `<'."
                         (caar ranges)))
        (while (and list (cdr list) (< (cadr list) lowest))
          (setq list (cdr list)))
-       (if (< (car ilist) lowest)
-           (progn
-             (setq temp list)
-             (setq list (cdr list))
-             (setcdr temp nil)
-             (setq out (nconc (gnus-compress-sequence ilist t) out))))
+       (when (< (car ilist) lowest)
+         (setq temp list)
+         (setq list (cdr list))
+         (setcdr temp nil)
+         (setq out (nconc (gnus-compress-sequence ilist t) out)))
        (setq highest (or (and (atom (car ranges)) (car ranges))
                          (cdar ranges)))
        (while (and list (<= (car list) highest))
          (setq list (cdr list)))
        (setq ranges (cdr ranges)))
-      (if list
-         (setq out (nconc (gnus-compress-sequence list t) out)))
+      (when list
+       (setq out (nconc (gnus-compress-sequence list t) out)))
       (setq out (sort out (lambda (r1 r2)
                            (< (or (and (atom r1) r1) (car r1))
                               (or (and (atom r2) r2) (car r2))))))
       (setq ranges out)
       (while ranges
        (if (atom (car ranges))
-           (if (cdr ranges)
-               (if (atom (cadr ranges))
-                   (if (= (1+ (car ranges)) (cadr ranges))
-                       (progn
-                         (setcar ranges (cons (car ranges)
-                                              (cadr ranges)))
-                         (setcdr ranges (cddr ranges))))
-                 (if (= (1+ (car ranges)) (caadr ranges))
-                     (progn
-                       (setcar (cadr ranges) (car ranges))
-                       (setcar ranges (cadr ranges))
-                       (setcdr ranges (cddr ranges))))))
-         (if (cdr ranges)
+           (when (cdr ranges)
              (if (atom (cadr ranges))
-                 (if (= (1+ (cdar ranges)) (cadr ranges))
-                     (progn
-                       (setcdr (car ranges) (cadr ranges))
-                       (setcdr ranges (cddr ranges))))
-               (if (= (1+ (cdar ranges)) (caadr ranges))
-                   (progn
-                     (setcdr (car ranges) (cdadr ranges))
-                     (setcdr ranges (cddr ranges)))))))
+                 (when (= (1+ (car ranges)) (cadr ranges))
+                   (setcar ranges (cons (car ranges)
+                                        (cadr ranges)))
+                   (setcdr ranges (cddr ranges)))
+               (when (= (1+ (car ranges)) (caadr ranges))
+                 (setcar (cadr ranges) (car ranges))
+                 (setcar ranges (cadr ranges))
+                 (setcdr ranges (cddr ranges)))))
+         (when (cdr ranges)
+           (if (atom (cadr ranges))
+               (when (= (1+ (cdar ranges)) (cadr ranges))
+                 (setcdr (car ranges) (cadr ranges))
+                 (setcdr ranges (cddr ranges)))
+             (when (= (1+ (cdar ranges)) (caadr ranges))
+               (setcdr (car ranges) (cdadr ranges))
+               (setcdr ranges (cddr ranges))))))
        (setq ranges (cdr ranges)))
       out)))
 
@@ -244,11 +240,11 @@ Note: LIST has to be sorted over `<'."
                      (>= number (car ranges))
                    (>= number (caar ranges)))
                  not-stop)
-       (if (if (numberp (car ranges))
-               (= number (car ranges))
-             (and (>= number (caar ranges))
-                  (<= number (cdar ranges))))
-           (setq not-stop nil))
+       (when (if (numberp (car ranges))
+                 (= number (car ranges))
+               (and (>= number (caar ranges))
+                    (<= number (cdar ranges))))
+         (setq not-stop nil))
        (setq ranges (cdr ranges)))
       (not not-stop))))
 
@@ -265,6 +261,21 @@ Note: LIST has to be sorted over `<'."
              sublist nil)))
     sublistp))
 
+(defun gnus-range-add (range1 range2)
+  "Add RANGE2 to RANGE1 destructively."
+  (cond
+   ;; If either are nil, then the job is quite easy.
+   ((or (null range1) (null range2))
+    (or range1 range2))
+   (t
+    ;; I don't like thinking.
+    (gnus-compress-sequence
+     (sort
+      (nconc
+       (gnus-uncompress-range range1)
+       (gnus-uncompress-range range2))
+      '<)))))
+
 (provide 'gnus-range)
 
 ;;; gnus-range.el ends here