From rstrandh at common-lisp.net Thu Feb 15 14:27:18 2007 From: rstrandh at common-lisp.net (rstrandh) Date: Thu, 15 Feb 2007 09:27:18 -0500 (EST) Subject: [stamp-cvs] CVS stamp Message-ID: <20070215142718.88EB48304A@common-lisp.net> Update of /project/stamp/cvsroot/stamp In directory clnet:/tmp/cvs-serv28250 Modified Files: mel-extra.lisp Log Message: Mel-base uses declarations of `simple-base-string' that it probably shouldn't. Recent versions of SBCL don't seem to return simple base string in some contexts where mel-base wants them. Fix this temporarily by redefining the offending mel-base functions. --- /project/stamp/cvsroot/stamp/mel-extra.lisp 2007/01/04 06:13:08 1.1 +++ /project/stamp/cvsroot/stamp/mel-extra.lisp 2007/02/15 14:27:18 1.2 @@ -11,3 +11,50 @@ while c do (write-char c sink) finally (return (mel.folders.maildir::unique-message-name sink)))))) +(in-package :mel.folders.maildir) + +(declaim (inline uidify)) +(defun uidify (file) + (let ((uid-end (position #\: file :from-end t))) + (if uid-end + (subseq file 0 uid-end) + file))) + +(defun find-message-file (folder uid) + (let ((uid (uidify uid))) + (declare (type string uid)) + (let ((cell (gethash uid (uid-cache folder)))) + (when cell + (case (car cell) + (:new (mel.filesystem:append-name (new-mail folder) (cdr cell))) + (:cur (mel.filesystem:append-name (current-mail folder) (cdr cell)))))))) + +(defmethod map-messages (fn (folder maildir-folder)) + (declare (optimize (speed 0) (safety 3))) + (or (and (folder-recent-p folder) + (slot-boundp folder 'selected-messages) + (selected-messages folder) + (progn (map nil fn (selected-messages folder)) (selected-messages folder))) + (setf (selected-messages folder) + (let ((messages nil)) + (flet ((push-message (file) + (let ((message (find-message folder file :if-does-not-exist :create))) + (push message messages) + message))) + (declare #-(or sbcl cmu)(dynamic-extent #'push-message)) + (let ((uid-cache (uid-cache folder))) + + (mel.filesystem:map-directory + (lambda (file) + (setf (gethash file uid-cache) (cons :new file)) + (funcall fn (push-message file))) + (namestring (truename (new-mail folder)))) + + (mel.filesystem:map-directory + (lambda (file) + (let ((uid (uidify file))) + (setf (gethash uid uid-cache) (cons :cur file)) + (funcall fn (push-message file)))) + (namestring (truename (current-mail folder)))))) + + (nreverse messages)))))