diff lisp/vm/vm-misc.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents 05472e90ae02
children c0c698873ce1
line wrap: on
line diff
--- a/lisp/vm/vm-misc.el	Mon Aug 13 09:00:04 2007 +0200
+++ b/lisp/vm/vm-misc.el	Mon Aug 13 09:02:59 2007 +0200
@@ -1,5 +1,5 @@
 ;;; Miscellaneous functions for VM
-;;; Copyright (C) 1989-1997 Kyle E. Jones
+;;; Copyright (C) 1989, 1990, 1991, 1993, 1994 Kyle E. Jones
 ;;;
 ;;; This program is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -70,20 +70,21 @@
 		      (if (or (null (string-match "^[\t\f\n\r ]+$" s))
 			      (not (string= s "")))
 			  (setq list (cons s list)))
-		      (skip-chars-forward ",\t\f\n\r ")
+		      (forward-char 1)
+		      (skip-chars-forward "\t\f\n\r ")
 		      (setq start (point)))
 		     ((= char ?\")
+		      (forward-char 1)
 		      (re-search-forward "[^\\]\"" nil 0))
 		     ((= char ?\()
 		      (let ((parens 1))
 			(forward-char 1)
 			(while (and (not (eobp)) (not (zerop parens)))
-			  (re-search-forward "[()]" nil 0)
-			  (cond ((or (eobp)
-				     (= (char-after (- (point) 2)) ?\\)))
+			  (re-search-forward "[^\\][()]" nil 0)
+			  (cond ((eobp))
 				((= (preceding-char) ?\()
 				 (setq parens (1+ parens)))
-				(t
+				((= (preceding-char) ?\))
 				 (setq parens (1- parens)))))))))
 	     (setq s (buffer-substring start (point)))
 	     (if (and (null (string-match "^[\t\f\n\r ]+$" s))
@@ -92,86 +93,6 @@
 	     (nreverse list)) ; jwz: fixed order
 	(and work-buffer (kill-buffer work-buffer)))))))
 
-(defun vm-parse-structured-header (string &optional sepchar keep-quotes)
-  (if (null string)
-      ()
-    (let ((work-buffer nil))
-      (save-excursion
-       (unwind-protect
-	   (let ((list nil)
-		 (nonspecials "^\"\\( \t\n\r\f")
-		 start s char sp+sepchar)
-	     (if sepchar
-		 (setq nonspecials (concat nonspecials (list sepchar))
-		       sp+sepchar (concat "\t\f\n\r " (list sepchar))))
-	     (setq work-buffer (generate-new-buffer "*vm-work*"))
-	     (buffer-disable-undo work-buffer)
-	     (set-buffer work-buffer)
-	     (insert string)
-	     (goto-char (point-min))
-	     (skip-chars-forward "\t\f\n\r ")
-	     (setq start (point))
-	     (while (not (eobp))
-	       (skip-chars-forward nonspecials)
-	       (setq char (following-char))
-	       (cond ((looking-at "[ \t\n\r\f]")
-		      (delete-char 1))
-		     ((= char ?\\)
-		      (forward-char 1)
-		      (if (not (eobp))
-			  (forward-char 1)))
-		     ((and sepchar (= char sepchar))
-		      (setq s (buffer-substring start (point)))
-		      (if (or (null (string-match "^[\t\f\n\r ]+$" s))
-			      (not (string= s "")))
-			  (setq list (cons s list)))
-		      (skip-chars-forward sp+sepchar)
-		      (setq start (point)))
-		     ((looking-at " \t\n\r\f")
-		      (skip-chars-forward " \t\n\r\f"))
-		     ((= char ?\")
-		      (let ((done nil))
-			(if keep-quotes
-			    (forward-char 1)
-			  (delete-char 1))
-			(while (not done)
-			  (if (null (re-search-forward "[\\\"]" nil t))
-			      (setq done t)
-			    (setq char (char-after (1- (point))))
-			    (cond ((char-equal char ?\\)
-				   (delete-char -1)
-				   (if (eobp)
-				       (setq done t)
-				     (forward-char 1)))
-				  (t (if (not keep-quotes)
-					 (delete-char -1))
-				     (setq done t)))))))
-		     ((= char ?\()
-		      (let ((done nil)
-			    (pos (point))
-			    (parens 1))
-			(forward-char 1)
-			(while (not done)
-			  (if (null (re-search-forward "[\\()]" nil t))
-			      (setq done t)
-			    (setq char (char-after (1- (point))))
-			    (cond ((char-equal char ?\\)
-				   (if (eobp)
-				       (setq done t)
-				     (forward-char 1)))
-				  ((char-equal char ?\()
-				   (setq parens (1+ parens)))
-				  (t
-				   (setq parens (1- parens)
-					 done (zerop parens))))))
-			(delete-region pos (point))))))
-	     (setq s (buffer-substring start (point)))
-	     (if (and (null (string-match "^[\t\f\n\r ]+$" s))
-		      (not (string= s "")))
-		 (setq list (cons s list)))
-	     (nreverse list))
-	(and work-buffer (kill-buffer work-buffer)))))))
-
 (defun vm-write-string (where string)
   (if (bufferp where)
       (vm-save-buffer-excursion
@@ -184,12 +105,6 @@
 	    (setq temp-buffer (generate-new-buffer "*vm-work*"))
 	    (set-buffer temp-buffer)
 	    (insert string)
-	    ;; correct for VM's uses of this function---
-	    ;; writing out message separators
-	    (setq buffer-file-type nil)
-	    ;; Tell XEmacs/MULE to pick the correct newline conversion.
-	    (and vm-xemacs-mule-p
-		 (set-file-coding-system 'no-conversion nil))
 	    (write-region (point-min) (point-max) where t 'quiet))
 	(and temp-buffer (kill-buffer temp-buffer))))))
 
@@ -217,13 +132,6 @@
 	   (vm-set-su-end-of (car mp) nil)
 	   (setq mp (cdr mp))))))
 
-(defun vm-check-for-killed-presentation ()
-  (and (bufferp vm-presentation-buffer-handle)
-       (null (buffer-name vm-presentation-buffer-handle))
-       (progn
-	 (setq vm-presentation-buffer-handle nil
-	       vm-presentation-buffer nil))))
-
 (defun vm-check-for-killed-folder ()
   (and (bufferp vm-mail-buffer) (null (buffer-name vm-mail-buffer))
        (setq vm-mail-buffer nil)))
@@ -232,8 +140,8 @@
   '(while vm-folder-read-only
      (signal 'folder-read-only (list (current-buffer)))))
 
-(put 'folder-read-only 'error-conditions '(folder-read-only error))
-(put 'folder-read-only 'error-message "Folder is read-only")
+;; XEmacs change
+(define-error 'folder-read-only "Folder is read-only")
 
 (defmacro vm-error-if-virtual-folder ()
   '(and (eq major-mode 'vm-virtual-mode)
@@ -298,10 +206,10 @@
 			      (make-list (- length vlength) fill)))
       vector )))
 
-(defun vm-obarray-to-string-list (blobarray)
+(defun vm-obarray-to-string-list (obarray)
   (let ((list nil))
     (mapatoms (function (lambda (s) (setq list (cons (symbol-name s) list))))
-	      blobarray)
+	      obarray)
     list ))
 
 (defun vm-mapcar (function &rest lists)
@@ -330,15 +238,6 @@
 	(setq prev p p (cdr p))))
     list ))
 
-(defun vm-delete-directory-file-names (list)
-  (vm-delete 'file-directory-p list))
-
-(defun vm-delete-backup-file-names (list)
-  (vm-delete 'backup-file-name-p list))
-
-(defun vm-delete-auto-save-file-names (list)
-  (vm-delete 'auto-save-file-name-p list))
-
 (defun vm-delete-duplicates (list &optional all hack-addresses)
   "Delete duplicate equivalent strings from the list.
 If ALL is t, then if there is more than one occurrence of a string in the list,
@@ -355,7 +254,6 @@
 	    (if hack-addresses
 		(nth 1 (funcall vm-chop-full-name-function (car list)))
 	      (car list))
-	    sym-string (or sym-string "-unparseable-garbage-")
 	    sym (intern sym-string hashtable))
       (if (boundp sym)
 	  (and all (setcar (symbol-value sym) nil))
@@ -394,11 +292,9 @@
       (set-buffer buffer)
       (vm-mapc 'set variables values))))
 
-(put 'folder-empty 'error-conditions '(folder-empty error))
-(put 'folder-empty 'error-message "Folder is empty")
-(put 'unrecognized-folder-type 'error-conditions
-     '(unrecognized-folder-type error))
-(put 'unrecognized-folder-type 'error-message "Unrecognized folder type")
+;; XEmacs change
+(define-error 'folder-empty  "Folder is empty")
+(define-error 'unrecognized-folder-type "Unrecognized folder type")
 
 (defun vm-error-if-folder-empty ()
   (while (null vm-message-list)
@@ -420,43 +316,40 @@
 	   return-value ))
 	((vectorp object) (apply 'vector (mapcar 'vm-copy object)))
 	((stringp object) (copy-sequence object))
-	((markerp object) (copy-marker object))
 	(t object)))
 
-(defun vm-multiple-frames-possible-p () 
-  (cond (vm-xemacs-p 
-	 (or (memq 'win (device-matching-specifier-tag-list))
-	     (featurep 'tty-frames)))
-        (vm-fsfemacs-19-p 
-         (fboundp 'make-frame))))
- 
-(defun vm-mouse-support-possible-p () 
-  (cond (vm-xemacs-p 
-         (featurep 'window-system)) 
-        (vm-fsfemacs-19-p 
-         (fboundp 'track-mouse))))
- 
-(defun vm-mouse-support-possible-here-p ()
-  (cond (vm-xemacs-p
-	 (memq 'win (device-matching-specifier-tag-list)))
-	(vm-fsfemacs-19-p
-	 (eq window-system 'x))))
+(defun vm-xemacs-p ()
+  (let ((case-fold-search nil))
+    (string-match "XEmacs" emacs-version)))
+
+(defun vm-fsfemacs-19-p ()
+  (and (string-match "^19" emacs-version)
+       (not (string-match "XEmacs\\|Lucid" emacs-version))))
+
+;; make-frame might be defined and still not work.  This would
+;; be true since the user could be running on a tty and using
+;; XEmacs 19.12, or using FSF Emacs 19.28 (or prior FSF Emacs versions).
+;;
+;; make-frame works on ttys in FSF Emacs 19.29, but other than
+;; looking at the version number I don't know a sane way to
+;; test for it without just running make-frame.  I'll just
+;; let it not work for now... someone will complain eventually
+;; and I'll think of something.
+(defun vm-multiple-frames-possible-p ()
+  (or (and (boundp 'window-system) (not (eq window-system nil)))
+      (and (fboundp 'device-type) (eq (device-type) 'x))))
+
+(defun vm-mouse-support-possible-p ()
+  (vm-multiple-frames-possible-p))
 
 (defun vm-menu-support-possible-p ()
-  (cond (vm-xemacs-p
-	 (featurep 'menubar))
-	(vm-fsfemacs-19-p
-	 (fboundp 'menu-bar-mode))))
- 
+  (or (and (boundp 'window-system) (eq window-system 'x))
+      (and (fboundp 'device-type) (eq (device-type) 'x))))
+
 (defun vm-toolbar-support-possible-p ()
-  (and vm-xemacs-p (featurep 'toolbar)))
-
-(defun vm-multiple-fonts-possible-p ()
-  (cond (vm-xemacs-p
-	 (eq (device-type) 'x))
-	(vm-fsfemacs-19-p
-	 (or (eq window-system 'x)
-	     (eq window-system 'win32)))))
+  (and (vm-xemacs-p)
+       (vm-multiple-frames-possible-p)
+       (featurep 'toolbar)))
 
 (defun vm-run-message-hook (message &optional hook-variable)
   (save-excursion
@@ -472,10 +365,9 @@
       (apply function args)
     (error nil)))
 
-(put 'beginning-of-folder 'error-conditions '(beginning-of-folder error))
-(put 'beginning-of-folder 'error-message "Beginning of folder")
-(put 'end-of-folder 'error-conditions '(end-of-folder error))
-(put 'end-of-folder 'error-message "End of folder")
+;; XEmacs change
+(define-error 'beginning-of-folder "Beginning of folder")
+(define-error 'end-of-folder "End of folder")
 
 (defun vm-trace (&rest args)
   (save-excursion
@@ -503,15 +395,13 @@
 	;; save this work so we won't have to do it again
 	(setq vm-sortable-date-alist
 	      (cons (cons string
-			  (condition-case nil
-			      (timezone-make-date-sortable
-			       (format "%s %s %s %s %s"
-				       (aref vect 1)
-				       (aref vect 2)
-				       (aref vect 3)
-				       (aref vect 4)
-				       (aref vect 5)))
-			    (error "1970010100:00:00")))
+			  (timezone-make-date-sortable
+			   (format "%s %s %s %s %s"
+				   (aref vect 1)
+				   (aref vect 2)
+				   (aref vect 3)
+				   (aref vect 4)
+				   (aref vect 5))))
 		    vm-sortable-date-alist))
 	;; return result
 	(cdr (car vm-sortable-date-alist)))))
@@ -567,8 +457,16 @@
 	   (get-file-buffer (file-truename file)))))
 
 (defun vm-set-region-face (start end face)
-  (let ((e (vm-make-extent start end)))
-    (vm-set-extent-property e 'face face)))
+  (cond ((fboundp 'make-overlay)
+	 (let ((o (make-overlay start end)))
+	   (overlay-put o 'face face)))
+	((fboundp 'make-extent)
+	 (let ((o (make-extent start end)))
+	   (set-extent-property o 'face face)))))
+
+(defun vm-unsaved-message (&rest args)
+  (let ((message-log-max nil))
+    (apply (function message) args)))
 
 (defun vm-default-buffer-substring-no-properties (beg end &optional buffer)
   (let ((s (if buffer
@@ -582,181 +480,9 @@
 (fset 'vm-buffer-substring-no-properties
   (cond ((fboundp 'buffer-substring-no-properties)
 	 (function buffer-substring-no-properties))
-	(vm-xemacs-p
+	((vm-xemacs-p)
 	 (function buffer-substring))
 	(t (function vm-default-buffer-substring-no-properties))))
 
 (defun vm-buffer-string-no-properties ()
   (vm-buffer-substring-no-properties (point-min) (point-max)))
-
-(defun vm-insert-region-from-buffer (buffer &optional start end)
-  (let ((target-buffer (current-buffer)))
-    (set-buffer buffer)
-    (save-restriction
-      (widen)
-      (or start (setq start (point-min)))
-      (or end (setq end (point-max)))
-      (set-buffer target-buffer)
-      (insert-buffer-substring buffer start end)
-      (set-buffer buffer))
-    (set-buffer target-buffer)))
-
-(if (not (fboundp 'vm-extent-property))
-    (if (fboundp 'overlay-get)
-	(fset 'vm-extent-property 'overlay-get)
-      (fset 'vm-extent-property 'extent-property)))
-
-(if (not (fboundp 'vm-set-extent-property))
-    (if (fboundp 'overlay-put)
-	(fset 'vm-set-extent-property 'overlay-put)
-      (fset 'vm-set-extent-property 'set-extent-property)))
-
-(if (not (fboundp 'vm-set-extent-endpoints))
-    (if (fboundp 'move-overlay)
-	(fset 'vm-set-extent-endpoints 'move-overlay)
-      (fset 'vm-set-extent-endpoints 'set-extent-endpoints)))
-
-(if (not (fboundp 'vm-make-extent))
-    (if (fboundp 'make-overlay)
-	(fset 'vm-make-extent 'make-overlay)
-      (fset 'vm-make-extent 'make-extent)))
-
-(if (not (fboundp 'vm-extent-end-position))
-    (if (fboundp 'overlay-end)
-	(fset 'vm-extent-end-position 'overlay-end)
-      (fset 'vm-extent-end-position 'extent-end-position)))
-
-(if (not (fboundp 'vm-extent-start-position))
-    (if (fboundp 'overlay-start)
-	(fset 'vm-extent-start-position 'overlay-start)
-      (fset 'vm-extent-start-position 'extent-start-position)))
-
-(if (not (fboundp 'vm-detach-extent))
-    (if (fboundp 'delete-overlay)
-	(fset 'vm-detach-extent 'delete-overlay)
-      (fset 'vm-detach-extent 'detach-extent)))
-
-(if (not (fboundp 'vm-extent-properties))
-    (if (fboundp 'overlay-properties)
-	(fset 'vm-extent-properties 'overlay-properties)
-      (fset 'vm-extent-properties 'extent-properties)))
-
-(defun vm-copy-extent (e)
-  (let ((props (vm-extent-properties e))
-	(ee (vm-make-extent (vm-extent-start-position e)
-			    (vm-extent-end-position e))))
-    (while props
-      (vm-set-extent-property ee (car props) (car (cdr props)))
-      (setq props (cdr (cdr props))))))
-
-(defun vm-make-tempfile-name ()
-  (let ((done nil) (pid (emacs-pid)) filename)
-    (while (not done)
-      (setq filename (format "%s/vm%d.%d" vm-temp-file-directory pid
-			     vm-tempfile-counter)
-	    vm-tempfile-counter (1+ vm-tempfile-counter)
-	    done (not (file-exists-p filename))))
-    filename ))
-
-(defun vm-insert-char (char &optional count ignored buffer)
-  (condition-case nil
-      (progn
-	(insert-char char count ignored buffer)
-	(fset 'vm-insert-char 'insert-char))
-    (wrong-number-of-arguments
-     (fset 'vm-insert-char 'vm-xemacs-compatible-insert-char)
-     (vm-insert-char char count ignored buffer))))
-
-(defun vm-xemacs-compatible-insert-char (char &optional count ignored buffer)
-  (if (and buffer (eq buffer (current-buffer)))
-      (insert-char char count)
-    (save-excursion
-      (set-buffer buffer)
-      (insert-char char count))))
-
-(defun vm-symbol-lists-intersect-p (list1 list2)
-  (catch 'done
-    (while list1
-      (and (memq (car list1) list2)
-	   (throw 'done t))
-      (setq list1 (cdr list1)))
-    nil ))
-
-(defun vm-set-buffer-variable (buffer var value)
-  (save-excursion
-    (set-buffer buffer)
-    (set var value)))
-
-(defun vm-buffer-variable-value (buffer var)
-  (save-excursion
-    (set-buffer buffer)
-    (symbol-value var)))
-
-(defsubst vm-with-string-as-temp-buffer (string function)
-  (let ((work-buffer nil))
-    (unwind-protect
-	(save-excursion
-	  (setq work-buffer (generate-new-buffer " *work*"))
-	  (set-buffer work-buffer)
-	  (insert string)
-	  (funcall function)
-	  (buffer-string))
-      (and work-buffer (kill-buffer work-buffer)))))
-
-(defmacro vm-with-virtual-selector-variables (&rest forms)
-  (append '(let ((any 'vm-vs-any)
-		 (and 'vm-vs-and)
-		 (or 'vm-vs-or)
-		 (not 'vm-vs-not)
-		 (header 'vm-vs-header)
-		 (label 'vm-vs-label)
-		 (text 'vm-vs-text)
-		 (recipient 'vm-vs-recipient)
-		 (author 'vm-vs-author)
-		 (subject 'vm-vs-subject)
-		 (sent-before 'vm-vs-sent-before)
-		 (sent-after 'vm-vs-sent-after)
-		 (more-chars-than 'vm-vs-more-chars-than)
-		 (less-chars-than 'vm-vs-less-chars-than)
-		 (more-lines-than 'vm-vs-more-lines-than)
-		 (less-lines-than 'vm-vs-less-lines-than)
-		 (new 'vm-vs-new)
-		 (unread 'vm-vs-unread)
-		 (read 'vm-vs-read)
-		 (deleted 'vm-vs-deleted)
-		 (replied 'vm-vs-replied)
-		 (forwarded 'vm-vs-forwarded)
-		 (filed 'vm-vs-filed)
-		 (written 'vm-vs-written)
-		 (edited 'vm-vs-edited)
-		 (marked 'vm-vs-marked)))
-	  forms))
-
-(defun vm-string-assoc (elt list)
-  (let ((case-fold-search t)
-	(found nil)
-	(elt (regexp-quote elt)))
-    (while (and list (not found))
-      (if (and (equal 0 (string-match elt (car (car list))))
-	       (= (match-end 0) (length (car (car list)))))
-	  (setq found t)
-	(setq list (cdr list))))
-    (car list)))
-
-(defun vm-string-member (elt list)
-  (let ((case-fold-search t)
-	(found nil)
-	(elt (regexp-quote elt)))
-    (while (and list (not found))
-      (if (and (equal 0 (string-match elt (car list)))
-	       (= (match-end 0) (length (car list))))
-	  (setq found t)
-	(setq list (cdr list))))
-    list))
-
-(defmacro vm-assert (expression)
-  (list 'or expression
-	(list 'progn
-	      (list 'setq 'debug-on-error t)
-	      (list 'error "assertion failed: %S"
-		    (list 'quote expression)))))