[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: `timer-relative-time' loses a day at -1.
From: |
Ehud Karni |
Subject: |
Re: `timer-relative-time' loses a day at -1. |
Date: |
Mon, 14 May 2001 23:08:49 +0300 |
On Mon, 14 May 2001 14:20:04 -0400 (EDT), squash@math.ufl.edu (Jonathan LF
King) wrote:
>
> Hello. Executing the following snippet
>
> (defconst *SECS-IN-ONE-DAY* (* 24 60 60))
>
> (loop
> for days-from-now from 2 downto -3 do
> (print
> (format "days-from-now=%2d: %s"
> days-from-now
> (format-time-string
> "%02d%03b"
> (timer-relative-time (current-time)
> (* days-from-now *SECS-IN-ONE-DAY*) ) )
> ) ) )
>
> produces
>
> "days-from-now= 2: 16May"
>
> "days-from-now= 1: 15May"
>
> "days-from-now= 0: 14May"
>
> "days-from-now=-1: 14May"
>
> "days-from-now=-2: 13May"
>
> "days-from-now=-3: 12May"
> nil
The problem is with the `timer-relative-time' function in timer.el.
It does not handle negative values (seconds and microseconds) properly.
Here is my definition of `timer-relative-time' that fixes this problem.
(defun timer-relative-time (time secs &optional usecs)
"Advance TIME by SECS seconds and optionally USECS microseconds.
SECS may be a fraction."
(let ((high (car time))
(low (if (consp (cdr time)) (nth 1 time) (cdr time)))
(micro (if (numberp (car-safe (cdr-safe (cdr time))))
(nth 2 time)
0)))
;; Add
(if usecs (setq micro (+ micro usecs)))
(if (floatp secs)
(setq micro (+ micro (floor (* 1000000 (- secs (floor secs)))))))
(setq low (+ low (floor secs)))
;; Normalize
(setq low (+ low (/ micro 1000000)))
;; EK fix for negative numbers
(if (< micro 0)
(setq low (1- low)))
(setq micro (mod micro 1000000))
(setq high (+ high (/ low 65536)))
;; EK fix for negative numbers
(if (< low 0)
(setq high (1- high)))
(setq low (logand low 65535))
(list high low (and (/= micro 0) micro))))
Ehud.
--
Ehud Karni Mivtach - Simon Insurance /"\
Tel: +972-3-6212-757 Fax: +972-3-6292-544 \ / ASCII Ribbon Campaign
(USA) Fax and voice mail: 1-815-5509341 X Against HTML Mail
Better Safe Than Sorry / \
mailto:ehud@unix.simonwiesel.co.il http://www.simonwiesel.co.il