* elmo-split.el (elmo-split): Fixed logic.
[elisp/wanderlust.git] / elmo / elmo-date.el
index 1a7a5cb..ea2f0e5 100644 (file)
@@ -1,6 +1,6 @@
-;;; elmo-date.el -- Date processing module for ELMO.
+;;; elmo-date.el --- Date processing module for ELMO.
 
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
 ;;
 
 ;;; Commentary:
-;; 
+;;
 
 ;;; Code:
-;; 
+;;
 
 
 (require 'path-util)
-(if (module-installed-p 'timezone)
-    (require 'timezone))
+(require 'timezone)
 (require 'elmo-vars)
 
+(defmacro elmo-match-substring (pos string from)
+  "Substring of POSth matched string of STRING."
+  (` (substring (, string)
+               (+ (match-beginning (, pos)) (, from))
+               (match-end (, pos)))))
+
+(defmacro elmo-match-string (pos string)
+  "Substring POSth matched STRING."
+  (` (substring (, string) (match-beginning (, pos)) (match-end (, pos)))))
+
+(defmacro elmo-match-buffer (pos)
+  "Substring POSth matched from the current buffer."
+  (` (buffer-substring-no-properties
+      (match-beginning (, pos)) (match-end (, pos)))))
+
+;; from subr.el
+(defun elmo-replace-in-string (str regexp newtext &optional literal)
+  "Replace all matches in STR for REGEXP with NEWTEXT string.
+And returns the new string.
+Optional LITERAL non-nil means do a literal replacement.
+Otherwise treat \\ in NEWTEXT string as special:
+  \\& means substitute original matched text,
+  \\N means substitute match for \(...\) number N,
+  \\\\ means insert one \\."
+  (let ((rtn-str "")
+       (start 0)
+       (special)
+       match prev-start)
+    (while (setq match (string-match regexp str start))
+      (setq prev-start start
+           start (match-end 0)
+           rtn-str
+           (concat
+            rtn-str
+            (substring str prev-start match)
+            (cond (literal newtext)
+                  (t (mapconcat
+                      (function
+                       (lambda (c)
+                         (if special
+                             (progn
+                               (setq special nil)
+                               (cond ((eq c ?\\) "\\")
+                                     ((eq c ?&)
+                                      (elmo-match-string 0 str))
+                                     ((and (>= c ?0) (<= c ?9))
+                                      (if (> c (+ ?0 (length
+                                                      (match-data))))
+                                          ;; Invalid match num
+                                          (error "Invalid match num: %c" c)
+                                        (setq c (- c ?0))
+                                        (elmo-match-string c str)))
+                                     (t (char-to-string c))))
+                           (if (eq c ?\\) (progn (setq special t) nil)
+                             (char-to-string c)))))
+                      newtext ""))))))
+    (concat rtn-str (substring str start))))
+
 (defvar elmo-date-descriptions
   '((yesterday . [0 0 1])
     (lastweek  . [0 0 7])
 (defun elmo-date-get-datevec (description)
   (cond
    ((not elmo-date-match)
-    (error "date match is not available"))
+    (error "Date match is not available"))
    ((string-match "^[ \t]*\\([0-9]+\\)?[ \t]*\\([a-zA-Z]+\\)$" description)
     (let ((today
           (save-match-data
          (error "%s is not supported yet" suffix)))))
    ((string-match "[0-9]+-[A-Za-z]+-[0-9]+" description)
     (timezone-fix-time
-     (concat (elmo-replace-in-string description "-" " ") " 0:00")
-     nil nil))))
+     (concat (elmo-replace-in-string description "-" " ") " 0:0")
+     (current-time-zone) nil))
+   ((string-match "\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)" description)
+    (vector (string-to-number (match-string 1 description))
+           (string-to-number (match-string 2 description))
+           (string-to-number (match-string 3 description))
+           0 0 0
+           (current-time-zone)))))
 
 (defun elmo-datevec-substitute (datevec1 datevec2)
   (if (/= (aref datevec2 2) 0)
     (setq p 1)
     (while (< p month)
       (setq days (+ days (timezone-last-day-of-month p year)))
-      (setq p (+ p 1))
-      )
+      (setq p (+ p 1)))
     (setq days (+ days mday))
     (aref wday (% days 7))))
 
       (aref (, datevec) 0)
       (aref (, datevec) 1)
       (aref (, datevec) 2)
-      (aref (, datevec) 3))))
+      (timezone-make-time-string
+       (aref (, datevec) 3)
+       (aref (, datevec) 4)
+       (aref (, datevec) 5)))))
 
 (require 'product)
 (product-provide (provide 'elmo-date) (require 'elmo-version))