;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
;;;; *************************************************************************
;;;; FILE IDENTIFICATION
;;;;
;;;; Name:          gettime
;;;; Purpose:       UFFI Example file to get time, use C structures
;;;; Programmer:    Kevin M. Rosenberg
;;;; Date Started:  Feb 2002
;;;;
;;;; This file, part of UFFI, is Copyright (c) 2002-2010 by Kevin M. Rosenberg
;;;;
;;;; *************************************************************************

(in-package :cl-user)

(uffi:def-foreign-type time-t :unsigned-long)

(uffi:def-struct tm
    (sec :int)
  (min :int)
  (hour :int)
  (mday :int)
  (mon :int)
  (year :int)
  (wday :int)
  (yday :int)
  (isdst :int))

(uffi:def-function ("time" c-time)
    ((time (* time-t)))
  :returning time-t)

(uffi:def-function ("localtime" c-localtime)
    ((time (* time-t)))
  :returning (* tm))

(uffi:def-type time-t :unsigned-long)
(uffi:def-type tm-pointer (* tm))

(defun gettime ()
   "Returns the local time"
   (uffi:with-foreign-object (time 'time-t)
;;     (declare (type time-t time))
     (c-time time)
     (let ((tm-ptr (the tm-pointer (c-localtime time))))
       (declare (type tm-pointer tm-ptr))
       (let ((time-string (format nil "~2d/~2,'0d/~d ~2d:~2,'0d:~2,'0d"
                                  (1+ (uffi:get-slot-value tm-ptr 'tm 'mon))
                                  (uffi:get-slot-value tm-ptr 'tm 'mday)
                                  (+ 1900 (uffi:get-slot-value tm-ptr 'tm 'year))
                                  (uffi:get-slot-value tm-ptr 'tm 'hour)
                                  (uffi:get-slot-value tm-ptr 'tm 'min)
                                  (uffi:get-slot-value tm-ptr 'tm 'sec)
                                  )))
         time-string))))




#+examples-uffi
(format t "~&~A" (gettime))

#+test-uffi
(progn
  (let ((time (gettime)))
    (util.test:test (stringp time) t :fail-info "Time is not a string")
    (util.test:test (plusp (parse-integer time :junk-allowed t))
                    t
                    :fail-info "time string does not start with a number")))


