SRFI-19: Minor refactor of leap second table lookups.
authorMark H Weaver <mhw@netris.org>
Tue, 23 Oct 2018 00:19:39 +0000 (20:19 -0400)
committerMark H Weaver <mhw@netris.org>
Wed, 24 Oct 2018 05:14:26 +0000 (01:14 -0400)
* module/srfi/srfi-19.scm (leap-second-delta): Replace with ...
(utc->tai): ... this.
(leap-second-neg-delta): Replace with ...
(tai->utc): ... this.
(current-time-tai, priv:time-tai->time-utc!, priv:time-utc->time-tai!)
(time-tai->julian-day, time-monotonic->julian-day): Adapt accordingly.

module/srfi/srfi-19.scm

index 5ab5d89f2a97ed1735b7f96b2437a8416684a139..46de91a7ecc76e622bdebe07d02dc5347b682134 100644 (file)
   (set! leap-second-table (read-tai-utc-data filename)))
 
 
-(define (leap-second-delta utc-seconds)
-  (letrec ((lsd (lambda (table)
-                  (cond ((>= utc-seconds (caar table))
-                         (cdar table))
-                        (else (lsd (cdr table)))))))
-    (if (< utc-seconds  (* (- 1972 1970) 365 sid)) 0
-        (lsd  leap-second-table))))
-
-;; going from tai seconds to utc seconds ...
-(define (leap-second-neg-delta tai-seconds)
-  (letrec ((lsd (lambda (table)
-                  (cond ((null? table) 0)
-                        ((>= tai-seconds (+ (caar table) (cdar table)))
-                         (cdar table))
-                        (else (lsd (cdr table)))))) )
-    (if (< tai-seconds  (* (- 1972 1970) 365 sid)) 0
-        (lsd  leap-second-table))))
+(define (utc->tai utc-seconds)
+  (let loop ((table leap-second-table))
+    (cond ((null? table)
+           utc-seconds)
+          ((>= utc-seconds (caar table))
+           (+ utc-seconds (cdar table)))
+          (else
+           (loop (cdr table))))))
+
+(define (tai->utc tai-seconds)
+  (let loop ((table leap-second-table))
+    (cond ((null? table)
+           tai-seconds)
+          ((>= tai-seconds (+ (caar table) (cdar table)))
+           (- tai-seconds (cdar table)))
+          (else
+           (loop (cdr table))))))
 
 
 ;;; the TIME structure; creates the accessors, too.
          (usec (cdr tod)))
     (make-time time-tai
                (* usec 1000)
-               (+ (car tod) (leap-second-delta sec)))))
+               (utc->tai sec))))
 
 ;;(define (current-time-ms-time time-type proc)
 ;;  (let ((current-ms (proc)))
       (time-error caller 'incompatible-time-types time-in))
   (set-time-type! time-out time-utc)
   (set-time-nanosecond! time-out (time-nanosecond time-in))
-  (set-time-second!     time-out (- (time-second time-in)
-                                    (leap-second-neg-delta
-                                     (time-second time-in))))
+  (set-time-second!     time-out (tai->utc (time-second time-in)))
   time-out)
 
 (define (time-tai->time-utc time-in)
       (time-error caller 'incompatible-time-types time-in))
   (set-time-type! time-out time-tai)
   (set-time-nanosecond! time-out (time-nanosecond time-in))
-  (set-time-second!     time-out (+ (time-second time-in)
-                                    (leap-second-delta
-                                     (time-second time-in))))
+  (set-time-second!     time-out (utc->tai (time-second time-in)))
   time-out)
 
 (define (time-utc->time-tai time-in)
 (define (time-tai->julian-day time)
   (if (not (eq? (time-type time) time-tai))
       (time-error 'time-tai->julian-day 'incompatible-time-types  time))
-  (+ (/ (+ (- (time-second time)
-              (leap-second-neg-delta (time-second time)))
+  (+ (/ (+ (tai->utc (time-second time))
            (/ (time-nanosecond time) nano))
         sid)
      tai-epoch-in-jd))
 (define (time-monotonic->julian-day time)
   (if (not (eq? (time-type time) time-monotonic))
       (time-error 'time-monotonic->julian-day 'incompatible-time-types  time))
-  (+ (/ (+ (- (time-second time)
-              (leap-second-neg-delta (time-second time)))
+  (+ (/ (+ (tai->utc (time-second time))
            (/ (time-nanosecond time) nano))
         sid)
      tai-epoch-in-jd))