cl-rw

Layered streams for Common Lisp
git clone https://logand.com/git/cl-rw.git/
Log | Files | Refs

commit cf177446e9bca4c62fa76a27ad803b454f83d818
parent 03c9ce8bbd88b44f10c05975a24159a6fb6beaf0
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sun, 27 Oct 2013 20:02:44 +0100

rfc822 time first try

Diffstat:
Mcalendar.lisp | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+), 0 deletions(-)

diff --git a/calendar.lisp b/calendar.lisp @@ -162,3 +162,80 @@ ;;(collect 15 (week-generator 2012 1)) ;;(collect 15 (week-generator 2012 12)) + +(defvar *weekdays* '((#\M #\o #\n) + (#\T #\u #\e) + (#\W #\e #\d) + (#\T #\h #\u) + (#\F #\r #\i) + (#\S #\a #\t) + (#\S #\u #\n))) + +(defvar *months* '((#\J #\a #\n) + (#\F #\e #\b) + (#\M #\a #\r) + (#\A #\p #\r) + (#\M #\a #\y) + (#\J #\u #\n) + (#\J #\u #\l) + (#\A #\u #\g) + (#\S #\e #\p) + (#\O #\c #\t) + (#\N #\o #\v) + (#\D #\e #\c))) + +(defun decode-rfc822-time (string) ;; TODO complete spec http://asg.web.cmu.edu/rfc/rfc822.html + (let ((r (rw:peek-reader (rw:reader string)))) + (values (progn + (rw:skip r) + (position (rw:till r '(#\,)) *weekdays* :test #'equal)) + (progn + (assert (eql #\, (rw:next r))) + (rw:skip r) + (rw:next-z0 r)) + (progn + (rw:skip r) + (1+ (position (rw:till r '(#\space)) *months* :test #'equal))) + (progn + (rw:skip r) + (rw:next-z0 r)) + (progn + (rw:skip r) + (rw:next-z0 r)) + (progn + (assert (eql #\: (rw:next r))) + (rw:next-z0 r)) + (progn + (assert (eql #\: (rw:next r))) + (rw:next-z0 r)) + (progn + (rw:skip r) + (ecase (rw:next r) + (#\+ (rw:next-z0 r)) + (#\- (- (rw:next-z0 r)))))))) + +;;(decode-rfc822-time "Tue, 22 Oct 2013 17:57:25 +0200") + +(defun encode-rfc822-time (wd d m y hh mm ss tz) + (format nil "~{~a~}, ~2,'0d ~{~a~} ~4,'0d ~2,'0d:~2,'0d:~2,'0d ~a~4,'0d" + (nth wd *weekdays*) d (nth (1- m) *months*) y hh mm ss + (if (plusp tz) #\+ #\-) (abs tz))) + +;;(encode-rfc822-time 3 24 10 2013 23 0 3 200) + +(defun rfc822-time-to-universal-time (string) + (multiple-value-bind (wd d m y hh mm ss tz) (decode-rfc822-time string) + (declare (ignore wd)) + (encode-universal-time ss mm hh d m y (/ (- tz) 100)))) + +;;(decode-universal-time (rfc822-time-to-universal-time "Tue, 22 Oct 2013 17:57:25 +0200")) +;;(decode-universal-time (rfc822-time-to-universal-time "Sun, 27 Oct 2013 17:57:25 +0100")) + +(defun universal-time-to-rfc822-time (x) + (multiple-value-bind (ss mm hh d m y wd dst tz) (decode-universal-time x) + (encode-rfc822-time wd d m y hh mm ss (* 100 (- (if dst (1- tz) tz)))))) + +;;(universal-time-to-rfc822-time (rfc822-time-to-universal-time "Tue, 22 Oct 2013 17:57:25 +0200")) +;;(universal-time-to-rfc822-time (rfc822-time-to-universal-time "Sun, 27 Oct 2013 17:57:25 +0100")) +;;(universal-time-to-rfc822-time (get-universal-time)) +;;(decode-universal-time (get-universal-time))