[go: up one dir, main page]

File: lookup-tables.lisp

package info (click to toggle)
cl-local-time 1.1.6-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 188 kB
  • ctags: 203
  • sloc: lisp: 1,374; sh: 89; makefile: 75
file content (60 lines) | stat: -rw-r--r-- 1,866 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
;;; -*- Mode: Lisp; speed-hacked-p: t -*-
;;; $Id: lookup-tables.lisp,v 1.4 2001/11/12 19:48:20 jesse Exp $
;;;
;;; Copyright (c) 2000, 2001 onShore Development, Inc.
;;;
;;; Local time to Gregorian time date conversion table.

(in-package :local-time)

(defvar *lt-conversion-table* nil)

(defun build-conversion-tables ()
  (declare (optimize (speed 1)
                     (safety 3)))
  (flet ((ymdw-to-lt-entry (year month day dow)
           (let ((elt 0))
             (declare (type fixnum elt))
             (setf (ldb (byte 10  0) elt) year
                   (ldb (byte  4 10) elt) month
                   (ldb (byte  5 14) elt) day
                   (ldb (byte  3 19) elt) dow)
             elt)))
    (let ((table (make-array *days-per-lt-cycle*
                             :element-type 'fixnum))
          (year 0)
          (month 3)
          (day 1)
          (dow 3))
      (declare (type fixnum year month day dow))
      (let ((dim (days-in-month month year :careful nil)))
        (declare (type fixnum dim))
        (dotimes (index *days-per-lt-cycle*)
          (setf (aref table index)
                (ymdw-to-lt-entry year month day dow))
          (incf day)
          (when (< dim day)
            (setf day 1)
            (incf month)
            (when (< 12 month)
              (setf month 1)
              (incf year))
            (setf dim (days-in-month month year :careful nil)))
          (incf dow)
          (when (= dow 7)
            (setq dow 0))))
      (setf *lt-conversion-table* table)))
    t)

(eval-when (:load-toplevel)
  (build-conversion-tables))

(defun lt-entry-to-ymdw (elt)
  (declare (type fixnum elt))
  (values (ldb (byte 10 0) elt)
          (ldb (byte 4 10) elt)
          (ldb (byte 5 14) elt)
          (ldb (byte 3 19) elt)))
           
(defun lt-entry (index)
  (aref *lt-conversion-table* index))