2008-06-30 Tetsurou Okazaki <okazaki@be.to>
[elisp/wanderlust.git] / elmo / elmo-date.el
index 822dfef..7a4fe4c 100644 (file)
 (require 'path-util)
 (require 'timezone)
 (require 'elmo-vars)
+(eval-when-compile (require 'cl))
 
 (defmacro elmo-match-substring (pos string from)
   "Substring of POSth matched string of STRING."
-  (` (substring (, string)
-               (+ (match-beginning (, pos)) (, from))
-               (match-end (, pos)))))
+  `(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)))))
+  `(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)))))
+  `(buffer-substring-no-properties
+    (match-beginning ,pos) (match-end ,pos)))
 
 ;; from subr.el
 (defun elmo-replace-in-string (str regexp newtext &optional literal)
@@ -115,7 +116,7 @@ Otherwise treat \\ in NEWTEXT string as special:
             (timezone-fix-time (current-time-string) (current-time-zone)
                                nil)))
          (number
-          (string-to-int
+          (string-to-number
            (if (match-beginning 1)
                (elmo-match-string 1 description)
              "0")))
@@ -202,14 +203,14 @@ Otherwise treat \\ in NEWTEXT string as special:
 
 (defmacro elmo-date-make-sortable-string (datevec)
   "Make a sortable string from DATEVEC."
-  (` (timezone-make-sortable-date
-      (aref (, datevec) 0)
-      (aref (, datevec) 1)
-      (aref (, datevec) 2)
-      (timezone-make-time-string
-       (aref (, datevec) 3)
-       (aref (, datevec) 4)
-       (aref (, datevec) 5)))))
+  `(timezone-make-sortable-date
+    (aref ,datevec 0)
+    (aref ,datevec 1)
+    (aref ,datevec 2)
+    (timezone-make-time-string
+     (aref ,datevec 3)
+     (aref ,datevec 4)
+     (aref ,datevec 5))))
 
 (defsubst elmo-datevec-to-time (datevec)
   (encode-time (aref datevec 5) (aref datevec 4) (aref datevec 3)
@@ -224,7 +225,7 @@ Otherwise treat \\ in NEWTEXT string as special:
   (let ((system-time-locale "C"))
     (format-time-string "%a, %d %b %Y %T %z" time)))
 
-(defun elmo-time< (lhs rhs)
+(defun elmo-time-less-p (lhs rhs)
   (while (and (car lhs) (car rhs))
     (cond ((< (car lhs) (car rhs))
           (setq lhs nil))
@@ -235,6 +236,55 @@ Otherwise treat \\ in NEWTEXT string as special:
           (setq rhs nil))))
   (not (null rhs)))
 
+(defalias 'elmo-time< 'elmo-time-less-p)
+
+(defun elmo-time-to-days (time)
+  (let ((date (decode-time time)))
+    (timezone-absolute-from-gregorian
+     (nth 4 date) (nth 3 date) (nth 5 date))))
+
+;; from timezone-fix-time in `timezone.el'
+(defun elmo-time-to-datevec (time &optional timezone)
+  (when time
+    (let* ((date   (decode-time time))
+          (year   (nth 5 date))
+          (month  (nth 4 date))
+          (day    (nth 3 date))
+          (hour   (nth 2 date))
+          (minute (nth 1 date))
+          (second (nth 0 date))
+          (local  (nth 8 date))
+          (timezone
+           (or timezone
+               (timezone-time-zone-from-absolute
+                (timezone-absolute-from-gregorian month day year)
+                (+ second (* 60 (+ minute (* 60 hour)))))))
+          (diff   (- (timezone-zone-to-minute timezone) (/ local 60)))
+          (minute (+ minute diff))
+          (hour-fix (floor minute 60)))
+      (setq hour (+ hour hour-fix))
+      (setq minute (- minute (* 60 hour-fix)))
+      ;; HOUR may be larger than 24 or smaller than 0.
+      (cond ((<= 24 hour)                      ;24 -> 00
+            (setq hour (- hour 24))
+            (setq day  (1+ day))
+            (when (< (timezone-last-day-of-month month year) day)
+              (setq month (1+ month))
+              (setq day 1)
+              (when (< 12 month)
+                (setq month 1)
+                (setq year (1+ year)))))
+           ((> 0 hour)
+            (setq hour (+ hour 24))
+            (setq day  (1- day))
+            (when (> 1 day)
+              (setq month (1- month))
+              (when (> 1 month)
+                (setq month 12)
+                (setq year (1- year)))
+              (setq day (timezone-last-day-of-month month year)))))
+      (vector year month day hour minute second timezone))))
+
 (require 'product)
 (product-provide (provide 'elmo-date) (require 'elmo-version))