From d4183bf9c5abd3dfe26e57685121664a461d822b Mon Sep 17 00:00:00 2001 From: teranisi Date: Mon, 11 Jun 2001 02:16:51 +0000 Subject: [PATCH] * elmo-util.el (elmo-file-field-primitive-condition-match): New inline function (Don't fetch file content if "first" or "last"). (elmo-file-field-condition-match): Use elmo-file-field-primitive-condition-match. * elmo-localdir.el (elmo-folder-search): Speed up simple "last" and "first". --- elmo/ChangeLog | 8 ++++++++ elmo/elmo-localdir.el | 47 +++++++++++++++++++++++++++++++++-------------- elmo/elmo-util.el | 49 ++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 83 insertions(+), 21 deletions(-) diff --git a/elmo/ChangeLog b/elmo/ChangeLog index ecb60a0..fbab6e5 100644 --- a/elmo/ChangeLog +++ b/elmo/ChangeLog @@ -1,5 +1,13 @@ 2001-06-11 Yuuichi Teranishi + * elmo-util.el (elmo-file-field-primitive-condition-match): + New inline function (Don't fetch file content if "first" or "last"). + (elmo-file-field-condition-match): Use + elmo-file-field-primitive-condition-match. + + * elmo-localdir.el (elmo-folder-search): Speed up simple "last" and + "first". + * elmo-pop3.el (elmo-pop3-process-filter): Don't use floor nor float. (elmo-message-fetch-plugged): Fixed. diff --git a/elmo/elmo-localdir.el b/elmo/elmo-localdir.el index 2c16914..9ccc48e 100644 --- a/elmo/elmo-localdir.el +++ b/elmo/elmo-localdir.el @@ -319,25 +319,44 @@ (expand-file-name (int-to-string number) (elmo-localdir-folder-directory-internal folder)) condition number number-list)) - + (luna-define-method elmo-folder-search ((folder elmo-localdir-folder) condition &optional numbers) (let* ((msgs (or numbers (elmo-folder-list-messages folder))) (num (length msgs)) (i 0) - number-list case-fold-search ret-val) - (setq number-list msgs) - (while msgs - (if (elmo-localdir-field-condition-match folder condition - (car msgs) number-list) - (setq ret-val (cons (car msgs) ret-val))) - (when (> num elmo-display-progress-threshold) - (setq i (1+ i)) - (elmo-display-progress - 'elmo-localdir-search "Searching..." - (/ (* i 100) num))) - (setq msgs (cdr msgs))) - (nreverse ret-val))) + last cur number-list case-fold-search ret-val) + (cond + ;; short cut. + ((and (vectorp condition) + (string= (elmo-filter-key condition) "last")) + (nthcdr (max (- (length msgs) + (string-to-int (elmo-filter-value condition))) + 0) + msgs)) + ((and (vectorp condition) + (string= (elmo-filter-key condition) "first")) + (let ((rest (nthcdr (string-to-int (elmo-filter-value condition) ) + msgs))) + (mapcar '(lambda (x) + (delete x msgs)) rest)) + msgs) + (t + (setq number-list msgs) + (while msgs + (if (elmo-localdir-field-condition-match folder condition + (car msgs) number-list) + (setq ret-val (cons (car msgs) ret-val))) + (when (> num elmo-display-progress-threshold) + (setq i (1+ i)) + (setq cur (/ (* i 100) num)) + (unless (eq cur last) + (elmo-display-progress + 'elmo-localdir-search "Searching..." + cur) + (setq last cur))) + (setq msgs (cdr msgs))) + (nreverse ret-val))))) (luna-define-method elmo-folder-pack-numbers ((folder elmo-localdir-folder)) (let* ((dir (elmo-localdir-folder-directory-internal folder)) diff --git a/elmo/elmo-util.el b/elmo/elmo-util.el index 157b3d8..f2b0e57 100644 --- a/elmo/elmo-util.el +++ b/elmo/elmo-util.el @@ -896,13 +896,48 @@ Return value is a cons cell of (STRUCTURE . REST)" (elmo-buffer-field-condition-match (nth 2 condition) number number-list))))) -(defsubst elmo-file-field-condition-match (file condition number number-list) - (elmo-set-work-buf - (as-binary-input-file (insert-file-contents file)) - (elmo-set-buffer-multibyte default-enable-multibyte-characters) - ;; Should consider charset? - (decode-mime-charset-region (point-min)(point-max) elmo-mime-charset) - (elmo-buffer-field-condition-match condition number number-list))) +(defsubst elmo-file-field-primitive-condition-match (file + condition + number + number-list) + (let (result) + (goto-char (point-min)) + (cond + ((string= (elmo-filter-key condition) "last") + (setq result (<= (length (memq number number-list)) + (string-to-int (elmo-filter-value condition))))) + ((string= (elmo-filter-key condition) "first") + (setq result (< (- (length number-list) + (length (memq number number-list))) + (string-to-int (elmo-filter-value condition))))) + (t + (elmo-set-work-buf + (as-binary-input-file (insert-file-contents file)) + (elmo-set-buffer-multibyte default-enable-multibyte-characters) + ;; Should consider charset? + (decode-mime-charset-region (point-min)(point-max) elmo-mime-charset) + (setq result + (elmo-buffer-field-primitive-condition-match + condition number number-list))))) + (if (eq (elmo-filter-type condition) 'unmatch) + (setq result (not result))) + result)) + +(defun elmo-file-field-condition-match (file condition number number-list) + (cond + ((vectorp condition) + (elmo-file-field-primitive-condition-match + file condition number number-list)) + ((eq (car condition) 'and) + (and (elmo-file-field-condition-match + file (nth 1 condition) number number-list) + (elmo-file-field-condition-match + file (nth 2 condition) number number-list))) + ((eq (car condition) 'or) + (or (elmo-file-field-condition-match + file (nth 1 condition) number number-list) + (elmo-file-field-condition-match + file (nth 2 condition) number number-list))))) (defmacro elmo-get-hash-val (string hashtable) (let ((sym (list 'intern-soft string hashtable))) -- 1.7.10.4