vixie-time: Refactor 'parse-vixie-time'

* src/mcron/vixie-time.scm (parse-vixie-time): Use 'match' to avoid
complex 'car' and 'cdr' usage.
This commit is contained in:
Mathieu Lirzin 2018-04-08 16:00:25 +02:00
commit cf3146b3c5
No known key found for this signature in database
GPG key ID: 0ADEE10094604D37

View file

@ -307,73 +307,68 @@ accounted for."
((< (length tokens) 5) ((< (length tokens) 5)
(throw 'mcron-error 9 (throw 'mcron-error 9
"Not enough fields in Vixie-style time specification"))) "Not enough fields in Vixie-style time specification")))
(let ((time-spec-list (match (map-in-order
(map-in-order (lambda (x) (vector (λ (x)
(let* ((n (vector-ref x 0)) (vector
(tok (list-ref tokens n))) (let* ((n (vector-ref x 0))
(cond (tok (list-ref tokens n)))
((and (= n 4) (cond
(string=? tok "*") ((and (= n 4)
(not (string=? (string=? tok "*")
(list-ref tokens 2) "*"))) (not (string=?
'()) (list-ref tokens 2) "*")))
((and (= n 2) '())
(string=? tok "*") ((and (= n 2)
(not (string=? (string=? tok "*")
(list-ref tokens 4) "*"))) (not (string=?
'()) (list-ref tokens 4) "*")))
(else '())
(parse-vixie-element (else
tok (parse-vixie-element
(vector-ref x 1) tok
(vector-ref x 2))))) ; [0] (vector-ref x 1)
(vector-ref x 3) (vector-ref x 2))))) ; [0]
(vector-ref x 4))) (vector-ref x 3)
;; token range-top+1 getter setter (vector-ref x 4)))
`( #( 0 0 60 ,tm:min ,set-tm:min ) ;; token range-top+1 getter setter
#( 1 0 24 ,tm:hour ,set-tm:hour ) `( #( 0 0 60 ,tm:min ,set-tm:min )
#( 2 1 32 ,tm:mday ,set-tm:mday ) #( 1 0 24 ,tm:hour ,set-tm:hour )
#( 3 0 12 ,tm:mon ,set-tm:mon ) #( 2 1 32 ,tm:mday ,set-tm:mday )
#( 4 0 7 ,tm:wday ,set-tm:wday ))))) ;; [1] #( 3 0 12 ,tm:mon ,set-tm:mon )
#( 4 0 7 ,tm:wday ,set-tm:wday ))) ;; [1]
((and time-spec-list (min hour day month wday))
(vector-set! wday
0
(map (lambda (time-spec)
(if (eqv? time-spec 7) 0 time-spec))
(vector-ref wday 0))) ;; [2]
(vector-set! (car (last-pair time-spec-list)) (vector-set! day
0 0
(map (lambda (time-spec) (remove (lambda (d) (eqv? d 0))
(if (eqv? time-spec 7) 0 time-spec)) (vector-ref day 0))) ;; [2.1]
(vector-ref (car (last-pair time-spec-list)) 0))) ;; [2]
(vector-set! (caddr time-spec-list) (λ (current-time) ;; [3]
0 (let ((time (localtime current-time))) ;; [4]
(remove (lambda (day) (eqv? day 0)) (unless (member (tm:mon time) (time-spec:list month))
(vector-ref (caddr time-spec-list) 0))) ;; [2.1] (nudge-month! time (cdddr time-spec-list))
(set-tm:mday time 0))
(when (or (eqv? (tm:mday time) 0)
(lambda (current-time) ;; [3] (not (member (tm:mday time)
(let ((time (localtime current-time))) ;; [4] (interpolate-weekdays
(time-spec:list day)
(if (not (member (tm:mon time) (time-spec:list wday)
(time-spec:list (cadddr time-spec-list)))) (tm:mon time)
(begin (tm:year time)))))
(nudge-month! time (cdddr time-spec-list)) (nudge-day! (pk time) (pk (cddr time-spec-list)))
(set-tm:mday time 0))) (set-tm:hour time -1))
(if (or (eqv? (tm:mday time) 0) (unless (member (tm:hour time)
(not (member (tm:mday time) (time-spec:list hour))
(interpolate-weekdays (nudge-hour! time (cdr time-spec-list))
(time-spec:list (caddr time-spec-list)) (set-tm:min time -1)) ;; [5]
(time-spec:list (caddr (cddr time-spec-list)))
(tm:mon time) (set-tm:sec time 0)
(tm:year time))))) (nudge-min! time time-spec-list) ;; [6]
(begin (first (mktime time)))))))) ;; [7]
(nudge-day! time (cddr time-spec-list))
(set-tm:hour time -1)))
(if (not (member (tm:hour time)
(time-spec:list (cadr time-spec-list))))
(begin
(nudge-hour! time (cdr time-spec-list))
(set-tm:min time -1))) ;; [5]
(set-tm:sec time 0)
(nudge-min! time time-spec-list) ;; [6]
(car (mktime time))))))) ;; [7]