xref: /onnv-gate/usr/src/lib/libast/common/features/tmx (revision 4887:feebf9260c2e)
1*4887Schinset	prototyped
2*4887Schinset	explicit
3*4887Schiniff	TMX
4*4887Schin
5*4887Schincat{
6*4887Schin	/*
7*4887Schin	 * AT&T Research
8*4887Schin	 *
9*4887Schin	 * high resolution Time_t support
10*4887Schin	 */
11*4887Schin
12*4887Schin	#include <tm.h>
13*4887Schin	#include <tv.h>
14*4887Schin}end
15*4887Schin
16*4887Schininc	FEATURE/common
17*4887Schin
18*4887Schinif ( _ast_int8_t ) {
19*4887Schin	#define TMX_MAXDATE	"2554-07-21+23:34:33.709551614 UTC"
20*4887Schin	#define TMX_MAXYEAR	2554
21*4887Schin	#define TMX_MAXSEC	((Time_t)18446744073)
22*4887Schin	#define TMX_MAXNSEC	709551614
23*4887Schin	#define TMX_RESOLUTION	1000000000
24*4887Schin
25*4887Schin	typedef uint64_t Time_t;
26*4887Schin	typedef uint64_t Tmxsec_t;
27*4887Schin	typedef uint32_t Tmxnsec_t;
28*4887Schin
29*4887Schin	#define tmxsec(t)	((Tmxsec_t)((t)/1000000000))
30*4887Schin	#define tmxnsec(t)	((Tmxnsec_t)((t)%1000000000))
31*4887Schin	#define tmxsns(s,n)	(((((Time_t)(s))*1000000000))+((Time_t)(n)))
32*4887Schin}
33*4887Schinelif ( _ast_flt8_t ) {
34*4887Schin	#define TMX_FLOAT	1
35*4887Schin	#define TMX_MAXDATE	"2106-02-07+06:28:15.999 UTC"
36*4887Schin	#define TMX_MAXYEAR	2106
37*4887Schin	#define TMX_MAXSEC	0xffffffffL
38*4887Schin	#define TMX_MAXNSEC	999000000L
39*4887Schin	#define TMX_RESOLUTION	1000
40*4887Schin
41*4887Schin	typedef _ast_flt8_t Time_t;
42*4887Schin	typedef uint32_t Tmxsec_t;
43*4887Schin	typedef uint32_t Tmxnsec_t;
44*4887Schin
45*4887Schin	#define tmxsec(t)	((Tmxsec_t)(t))
46*4887Schin	#define tmxnsec(t)	(((Tmxnsec_t)(((t)-((uint32_t)(t))+0.0000005)*1000L))*1000000L)
47*4887Schin	#define tmxsns(s,n)	(((Time_t)(s))+((((uint32_t)(n))/1000L)/1e6))
48*4887Schin}
49*4887Schinelse {
50*4887Schin	#define TMX_MAXDATE	"2106-02-07+06:28:14 UTC"
51*4887Schin	#define TMX_MAXYEAR	2106
52*4887Schin	#define TMX_MAXSEC	0xfffffffeL
53*4887Schin	#define TMX_MAXNSEC	0L
54*4887Schin	#define TMX_RESOLUTION	1
55*4887Schin
56*4887Schin	typedef uint32_t Time_t;
57*4887Schin	typedef uint32_t Tmxsec_t;
58*4887Schin	typedef uint32_t Tmxnsec_t;
59*4887Schin
60*4887Schin	#define tmxsec(t)	((Tmxsec_t)(t))
61*4887Schin	#define tmxnsec(t)	(0)
62*4887Schin	#define tmxsns(s,n)	((Time_t)(s))
63*4887Schin}
64*4887Schinendif
65*4887Schin
66*4887Schincat{
67*4887Schin	#define TMX_NOTIME	((Time_t)(-1))
68*4887Schin	#define TMX_NOW		tmxgettime()
69*4887Schin	#define TMX_MAXTIME	tmxsns(TMX_MAXSEC,TMX_MAXNSEC)
70*4887Schin
71*4887Schin	#define tmx2tv(t,v)	((v)->tv_nsec=tmxnsec(t),(v)->tv_sec=tmxsec(t))
72*4887Schin	#define tv2tmx(v)	tmxsns((v)->tv_sec,(v)->tv_nsec)
73*4887Schin
74*4887Schin	#define tmxclock(p)	tmxsns(((p)?*(p):time(NiL)),0)
75*4887Schin
76*4887Schin	#define tmxgetatime(s)	tmxsns((s)->st_atime,ST_ATIME_NSEC_GET(s))
77*4887Schin	#define tmxgetctime(s)	tmxsns((s)->st_ctime,ST_CTIME_NSEC_GET(s))
78*4887Schin	#define tmxgetmtime(s)	tmxsns((s)->st_mtime,ST_MTIME_NSEC_GET(s))
79*4887Schin
80*4887Schin	#define tmxsetatime(s,t) ((s)->st_atime=tmxsec(t),ST_ATIME_NSEC_SET(s,tmxnsec(t)))
81*4887Schin	#define tmxsetctime(s,t) ((s)->st_ctime=tmxsec(t),ST_CTIME_NSEC_SET(s,tmxnsec(t)))
82*4887Schin	#define tmxsetmtime(s,t) ((s)->st_mtime=tmxsec(t),ST_MTIME_NSEC_SET(s,tmxnsec(t)))
83*4887Schin
84*4887Schin	#if _BLD_ast && defined(__EXPORT__)
85*4887Schin	#define extern		__EXPORT__
86*4887Schin	#endif
87*4887Schin
88*4887Schin	extern Time_t		tmxdate(const char*, char**, Time_t);
89*4887Schin	extern char*		tmxfmt(char*, size_t, const char*, Time_t);
90*4887Schin	extern Time_t		tmxleap(Time_t);
91*4887Schin	extern Tm_t*		tmxmake(Time_t);
92*4887Schin	extern Time_t		tmxscan(const char*, char**, const char*, char**, Time_t, long);
93*4887Schin	extern int		tmxsleep(Time_t);
94*4887Schin	extern Time_t		tmxtime(Tm_t*, int);
95*4887Schin
96*4887Schin	extern Time_t		tmxgettime(void);
97*4887Schin	extern int		tmxsettime(Time_t);
98*4887Schin
99*4887Schin	extern int		tmxtouch(const char*, Time_t, Time_t, Time_t, int);
100*4887Schin
101*4887Schin	extern char*		fmttmx(const char*, Time_t);
102*4887Schin
103*4887Schin	#undef	extern
104*4887Schin}end
105