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