a6a3158f3d6d8db36ea7bad7047e35a80975212a
[lcore.git] / ltimevalstuff.pas
1 { Copyright (C) 2005 Bas Steendijk and Peter Green\r
2   For conditions of distribution and use, see copyright notice in zlib_license.txt\r
3   which is included in the package\r
4   ----------------------------------------------------------------------------- }\r
5 \r
6 unit ltimevalstuff;\r
7 interface\r
8
9 {$ifdef win32}
10   type
11     ttimeval = record
12       tv_sec : longint; 
13       tv_usec : longint; 
14     end;
15 {$else}
16   {$ifdef ver1_0}
17     uses linux;
18   {$else}
19     uses baseunix,unix,unixutil;
20   {$endif}
21 {$endif}
22                                 
23 \r
24 procedure tv_add(var tv:ttimeval;msec:integer);\r
25 function tv_compare(const tv1,tv2:ttimeval):boolean;\r
26 procedure tv_substract(var tv:ttimeval;const tv2:ttimeval);\r
27 procedure msectotimeval(var tv:ttimeval;msec:integer);\r
28
29 //tv_invalidtimebig will always compare as greater than any valid timeval\r
30 //unfortunately unixstuff.inc hasn't worked it's magic yet so we
31 //have to ifdef this manually.\r
32 const\r
33   {$ifdef ver1_0}
34     tv_invalidtimebig : ttimeval = (sec:maxlongint;usec:maxlongint);\r
35   {$else}
36     tv_invalidtimebig : ttimeval = (tv_sec:maxlongint;tv_usec:maxlongint);\r
37   {$endif}
38 implementation\r
39
40 {$i unixstuff.inc}
41 \r
42 {add nn msec to tv}\r
43 procedure tv_add(var tv:ttimeval;msec:integer);\r
44 begin\r
45   inc(tv.tv_usec,msec*1000);\r
46   inc(tv.tv_sec,tv.tv_usec div 1000000);\r
47   tv.tv_usec := tv.tv_usec mod 1000000;\r
48 end;\r
49 \r
50 {tv1 >= tv2}\r
51 function tv_compare(const tv1,tv2:ttimeval):boolean;\r
52 begin\r
53   if tv1.tv_sec = tv2.tv_sec then begin\r
54     result := tv1.tv_usec >= tv2.tv_usec;\r
55   end else result := tv1.tv_sec > tv2.tv_sec;\r
56 end;\r
57 \r
58 procedure tv_substract(var tv:ttimeval;const tv2:ttimeval);\r
59 begin\r
60   dec(tv.tv_usec,tv2.tv_usec);\r
61   if tv.tv_usec < 0 then begin\r
62     inc(tv.tv_usec,1000000);\r
63     dec(tv.tv_sec)\r
64   end;\r
65   dec(tv.tv_sec,tv2.tv_sec);\r
66 end;\r
67 \r
68 procedure msectotimeval(var tv:ttimeval;msec:integer);\r
69 begin\r
70   tv.tv_sec := msec div 1000;\r
71   tv.tv_usec := (msec mod 1000)*1000;\r
72 end;\r
73 \r
74 end.