1 /*
2  * BEGIN illumos section
3  *   This is an unstable interface; changes may be made
4  *   without notice.
5  * END illumos section
6  */
7 /***********************************************************************
8 *                                                                      *
9 *               This software is part of the ast package               *
10 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
11 *                      and is licensed under the                       *
12 *                 Eclipse Public License, Version 1.0                  *
13 *                    by AT&T Intellectual Property                     *
14 *                                                                      *
15 *                A copy of the License is available at                 *
16 *          http://www.eclipse.org/org/documents/epl-v10.html           *
17 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
18 *                                                                      *
19 *              Information and Software Systems Research               *
20 *                            AT&T Research                             *
21 *                           Florham Park NJ                            *
22 *                                                                      *
23 *                 Glenn Fowler <gsf@research.att.com>                  *
24 *                  David Korn <dgk@research.att.com>                   *
25 *                   Phong Vo <kpv@research.att.com>                    *
26 *                                                                      *
27 ***********************************************************************/
28 #pragma prototyped
29 /*
30  * Glenn Fowler
31  * AT&T Research
32  *
33  * time conversion support definitions
34  */
35 
36 #ifndef _TM_H
37 #define _TM_H
38 
39 #define TM_VERSION	20070319L
40 
41 #include <ast.h>
42 #include <times.h>
43 
44 #undef	daylight
45 
46 #define tmset(z)	tminit(z)
47 #define tmisleapyear(y)	(!((y)%4)&&(((y)%100)||!((((y)<1900)?((y)+1900):(y))%400)))
48 
49 #define TM_ADJUST	(1<<0)		/* local doesn't do leap secs	*/
50 #define TM_LEAP		(1<<1)		/* do leap seconds		*/
51 #define TM_UTC		(1<<2)		/* universal coordinated ref	*/
52 
53 #define TM_PEDANTIC	(1<<3)		/* pedantic date parse		*/
54 #define TM_DATESTYLE	(1<<4)		/* date(1) style mmddHHMMccyy	*/
55 #define TM_SUBSECOND	(1<<5)		/* <something>%S => ...%S.%P	*/
56 
57 #define TM_DST		(-60)		/* default minutes for DST	*/
58 #define TM_LOCALZONE	(25 * 60)	/* use local time zone offset	*/
59 #define TM_UTCZONE	(26 * 60)	/* UTC "time zone"		*/
60 #define TM_MAXLEAP	1		/* max leap secs per leap	*/
61 #define TM_WINDOW	69		/* century windowing guard year	*/
62 
63 /*
64  * these indices must agree with tm_dform[]
65  */
66 
67 #define TM_MONTH_ABBREV		0
68 #define TM_MONTH		12
69 #define TM_DAY_ABBREV		24
70 #define TM_DAY			31
71 #define TM_TIME			38
72 #define TM_DATE			39
73 #define TM_DEFAULT		40
74 #define TM_MERIDIAN		41
75 
76 #define TM_UT			43
77 #define TM_DT			47
78 #define TM_SUFFIXES		51
79 #define TM_PARTS		55
80 #define TM_HOURS		62
81 #define TM_DAYS			66
82 #define TM_LAST			69
83 #define TM_THIS			72
84 #define TM_NEXT			75
85 #define TM_EXACT		78
86 #define TM_NOISE		81
87 #define TM_ORDINAL		85
88 #define TM_DIGITS		95
89 #define TM_CTIME		105
90 #define TM_DATE_1		106
91 #define TM_INTERNATIONAL	107
92 #define TM_RECENT		108
93 #define TM_DISTANT		109
94 #define TM_MERIDIAN_TIME	110
95 #define TM_ERA			111
96 #define TM_ERA_DATE		112
97 #define TM_ERA_TIME		113
98 #define TM_ERA_DEFAULT		114
99 #define TM_ERA_YEAR		115
100 #define TM_ORDINALS		116
101 #define TM_FINAL		126
102 #define TM_WORK			129
103 
104 #define TM_NFORM		132
105 
106 typedef struct				/* leap second info		*/
107 {
108 	time_t		time;		/* the leap second event	*/
109 	int		total;		/* inclusive total since epoch	*/
110 } Tm_leap_t;
111 
112 typedef struct				/* time zone info		*/
113 {
114 	char*		type;		/* type name			*/
115 	char*		standard;	/* standard time name		*/
116 	char*		daylight;	/* daylight or summertime name	*/
117 	short		west;		/* minutes west of GMT		*/
118 	short		dst;		/* add to tz.west for DST	*/
119 } Tm_zone_t;
120 
121 typedef struct				/* tm library readonly data	*/
122 {
123 	char**		format;		/* default TM_* format strings	*/
124 	unsigned char*	lex;		/* format lex type classes	*/
125 	char*		digit;		/* output digits		*/
126 	short*		days;		/* days in month i		*/
127 	short*		sum;		/* days in months before i	*/
128 	Tm_leap_t*	leap;		/* leap second table		*/
129 	Tm_zone_t*	zone;		/* alternate timezone table	*/
130 } Tm_data_t;
131 
132 typedef struct				/* tm library global info	*/
133 {
134 	char*		deformat;	/* TM_DEFAULT override		*/
135 	int		flags;		/* flags			*/
136 	char**		format;		/* current format strings	*/
137 	Tm_zone_t*	date;		/* timezone from last tmdate()	*/
138 	Tm_zone_t*	local;		/* local timezone		*/
139 	Tm_zone_t*	zone;		/* current timezone		*/
140 } Tm_info_t;
141 
142 typedef struct Tm_s
143 {
144 	int			tm_sec;
145 	int			tm_min;
146 	int			tm_hour;
147 	int			tm_mday;
148 	int			tm_mon;
149 	int			tm_year;
150 	int			tm_wday;
151 	int			tm_yday;
152 	int			tm_isdst;
153 	uint32_t		tm_nsec;
154 	Tm_zone_t*		tm_zone;
155 } Tm_t;
156 
157 #if _BLD_ast && defined(__EXPORT__)
158 #define extern		extern __EXPORT__
159 #endif
160 #if !_BLD_ast && defined(__IMPORT__)
161 #define extern		extern __IMPORT__
162 #endif
163 
164 extern Tm_data_t*	_tm_datap_;
165 extern Tm_info_t*	_tm_infop_;
166 
167 #define tm_data		(*_tm_datap_)
168 #define tm_info		(*_tm_infop_)
169 
170 #undef	extern
171 
172 #if _BLD_ast && defined(__EXPORT__)
173 #define extern		__EXPORT__
174 #endif
175 
176 extern time_t		tmdate(const char*, char**, time_t*);
177 extern int		tmequiv(Tm_t*);
178 extern Tm_t*		tmfix(Tm_t*);
179 extern char*		tmfmt(char*, size_t, const char*, time_t*);
180 extern char*		tmform(char*, const char*, time_t*);
181 extern int		tmgoff(const char*, char**, int);
182 extern void		tminit(Tm_zone_t*);
183 extern time_t		tmleap(time_t*);
184 extern int		tmlex(const char*, char**, char**, int, char**, int);
185 extern char**		tmlocale(void);
186 extern Tm_t*		tmmake(time_t*);
187 extern char*		tmpoff(char*, size_t, const char*, int, int);
188 extern time_t		tmscan(const char*, char**, const char*, char**, time_t*, long);
189 extern int		tmsleep(time_t, time_t);
190 extern time_t		tmtime(Tm_t*, int);
191 extern Tm_zone_t*	tmtype(const char*, char**);
192 extern int		tmweek(Tm_t*, int, int, int);
193 extern int		tmword(const char*, char**, const char*, char**, int);
194 extern Tm_zone_t*	tmzone(const char*, char**, const char*, int*);
195 
196 #undef	extern
197 
198 #endif
199