;;; Extra time functions missing from Chicken's posix unit
;; Implementation stolen from asctime and time->string in posix.scm.
;; Time-stamp: <2006-02-13 23:26:39 jim>

#>
#include <time.h>
static C_TLS struct tm C_tm;
# define C_mktime(v)        (memset(&C_tm, 0, sizeof(struct tm)), C_tm.tm_sec = C_unfix(C_block_item(v, 0)), C_tm.tm_min = C_unfix(C_block_item(v, 1)), C_tm.tm_hour = C_unfix(C_block_item(v, 2)), C_tm.tm_mday = C_unfix(C_block_item(v, 3)), C_tm.tm_mon = C_unfix(C_block_item(v, 4)), C_tm.tm_year = C_unfix(C_block_item(v, 5)), C_tm.tm_wday = C_unfix(C_block_item(v, 6)), C_tm.tm_yday = C_unfix(C_block_item(v, 7)), C_tm.tm_isdst = (C_block_item(v, 8) != C_SCHEME_FALSE), C_tm.tm_gmtoff = C_unfix(C_block_item(v, 9)), mktime(&C_tm) )
# define C_timegm(v)        (memset(&C_tm, 0, sizeof(struct tm)), C_tm.tm_sec = C_unfix(C_block_item(v, 0)), C_tm.tm_min = C_unfix(C_block_item(v, 1)), C_tm.tm_hour = C_unfix(C_block_item(v, 2)), C_tm.tm_mday = C_unfix(C_block_item(v, 3)), C_tm.tm_mon = C_unfix(C_block_item(v, 4)), C_tm.tm_year = C_unfix(C_block_item(v, 5)), C_tm.tm_wday = C_unfix(C_block_item(v, 6)), C_tm.tm_yday = C_unfix(C_block_item(v, 7)), C_tm.tm_isdst = (C_block_item(v, 8) != C_SCHEME_FALSE), C_tm.tm_gmtoff = C_unfix(C_block_item(v, 9)), timegm(&C_tm) )
<#

(define local-time->seconds
  (let ([mktime (foreign-lambda unsigned-integer "C_mktime" scheme-object)])
    (lambda (tm)
      (##sys#check-vector tm 'local-time->seconds)
      (when (fx< (##sys#size tm) 10) (##sys#error 'local-time->seconds "time vector too short" tm))
      (let ([sec (mktime tm)])
	(unless sec (##sys#error 'local-time->seconds "can not convert time vector to seconds" tm))
	sec) ) ) )

(define utc-time->seconds
  (let ([timegm (foreign-lambda unsigned-integer "C_timegm" scheme-object)])
    (lambda (tm)
      (##sys#check-vector tm 'utc-time->seconds)
      (when (fx< (##sys#size tm) 10) (##sys#error 'utc-time->seconds "time vector too short" tm))
      (let ([sec (timegm tm)])
	(unless sec (##sys#error 'utc-time->seconds "can not convert time vector to seconds" tm))
	sec) ) ) )


