Remove old CVS $Id$ keyword
[uffi.git] / tests / time.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          time.lisp
6 ;;;; Purpose:       UFFI test file, time, use C structures
7 ;;;; Author:        Kevin M. Rosenberg
8 ;;;; Date Started:  Feb 2002
9 ;;;;
10 ;;;; This file, part of UFFI, is Copyright (c) 2002-2010 by Kevin M. Rosenberg
11 ;;;;
12 ;;;; *************************************************************************
13
14 (in-package #:uffi-tests)
15
16 (uffi:def-foreign-type time-t :unsigned-long)
17
18 (uffi:def-struct tm
19     (sec :int)
20   (min :int)
21   (hour :int)
22   (mday :int)
23   (mon :int)
24   (year :int)
25   (wday :int)
26   (yday :int)
27   (isdst :int)
28   ;; gmoffset present on SusE SLES9
29   (gmoffset :long))
30
31 (uffi:def-function ("time" c-time)
32     ((time (* time-t)))
33   :returning time-t)
34
35 (uffi:def-function "gmtime"
36     ((time (* time-t)))
37   :returning (:struct-pointer tm))
38
39 (uffi:def-function "asctime"
40     ((time (:struct-pointer tm)))
41   :returning :cstring)
42
43 (uffi:def-type time-t :unsigned-long)
44 (uffi:def-type tm-pointer (:struct-pointer tm))
45
46 (deftest :time.1
47    (uffi:with-foreign-object (time 'time-t)
48      (setf (uffi:deref-pointer time :unsigned-long) 7381)
49      (uffi:deref-pointer time :unsigned-long))
50   7381)
51
52 (deftest :time.2
53   (uffi:with-foreign-object (time 'time-t)
54     (setf (uffi:deref-pointer time :unsigned-long) 7381)
55     (let ((tm-ptr (the tm-pointer (gmtime time))))
56       (values (1+ (uffi:get-slot-value tm-ptr 'tm 'mon))
57               (uffi:get-slot-value tm-ptr 'tm 'mday)
58               (+ 1900 (uffi:get-slot-value tm-ptr 'tm 'year))
59               (uffi:get-slot-value tm-ptr 'tm 'hour)
60               (uffi:get-slot-value tm-ptr 'tm 'min)
61               (uffi:get-slot-value tm-ptr 'tm 'sec)
62               )))
63   1 1 1970 2 3 1)
64
65
66 (uffi:def-struct timeval
67     (secs :long)
68   (usecs :long))
69
70 (uffi:def-struct timezone
71     (minutes-west :int)
72   (dsttime :int))
73
74 (uffi:def-function ("gettimeofday" c-gettimeofday)
75     ((tv (* timeval))
76      (tz (* timezone)))
77   :returning :int)
78
79 (defun get-utime ()
80   (uffi:with-foreign-object (tv 'timeval)
81     (let ((res (c-gettimeofday tv (uffi:make-null-pointer 'timezone))))
82       (values
83        (+ (* 1000000 (uffi:get-slot-value tv 'timeval 'secs))
84           (uffi:get-slot-value tv 'timeval 'usecs))
85        res))))
86
87 (deftest :timeofday.1
88     (multiple-value-bind (t1 res1) (get-utime)
89       (multiple-value-bind (t2 res2) (get-utime)
90         (and (or (= t2 t1) (> t2 t1))
91              (> t1 1000000000)
92              (> t2 1000000000)
93              (zerop res1)
94              (zerop res2))))
95   t)
96
97 (defun posix-time-to-asctime (secs)
98   "Converts number of seconds elapsed since 00:00:00 on January 1, 1970, Coordinated Universal Time (UTC)"
99   (string-right-trim
100    '(#\newline #\return)
101    (uffi:convert-from-cstring
102     (uffi:with-foreign-object (time 'time-t)
103       (setf (uffi:deref-pointer time :unsigned-long) secs)
104       (asctime (gmtime time))))))
105
106 (deftest :time.3
107     (posix-time-to-asctime 0)
108   "Thu Jan  1 00:00:00 1970")