;;; 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 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) ) ) )