xref: /titanic_44/usr/src/lib/libast/common/tm/tmdata.c (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*3e14f97fSRoger A. Faulkner *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6da2e3ebdSchin *                  Common Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10da2e3ebdSchin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11da2e3ebdSchin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin  * Glenn Fowler
25da2e3ebdSchin  * AT&T Research
26da2e3ebdSchin  *
27da2e3ebdSchin  * time conversion support readonly data
28da2e3ebdSchin  */
29da2e3ebdSchin 
30da2e3ebdSchin #include <ast.h>
31da2e3ebdSchin #include <tm.h>
32da2e3ebdSchin 
33da2e3ebdSchin /*
34da2e3ebdSchin  * default format strings -- must agree with TM_* indices
35da2e3ebdSchin  */
36da2e3ebdSchin 
37da2e3ebdSchin static char*		format[] =
38da2e3ebdSchin {
39da2e3ebdSchin 	"Jan",		"Feb",		"Mar",		"Apr",
40da2e3ebdSchin 	"May",		"Jun",		"Jul",		"Aug",
41da2e3ebdSchin 	"Sep",		"Oct",		"Nov",		"Dec",
42da2e3ebdSchin 
43da2e3ebdSchin 	"January",	"February",	"March",	"April",
44da2e3ebdSchin 	"May",		"June",		"July",		"August",
45da2e3ebdSchin 	"September",	"October",	"November",	"December",
46da2e3ebdSchin 
47da2e3ebdSchin 	"Sun",		"Mon",		"Tue",		"Wed",
48da2e3ebdSchin 	"Thu",		"Fri",		"Sat",
49da2e3ebdSchin 
50da2e3ebdSchin 	"Sunday",	"Monday",	"Tuesday",	"Wednesday",
51da2e3ebdSchin 	"Thursday",	"Friday",	"Saturday",
52da2e3ebdSchin 
53da2e3ebdSchin 	"%H:%M:%S",	"%m/%d/%y",	"%a %b %e %T %Z %Y",
54da2e3ebdSchin 
55da2e3ebdSchin 	"AM",		"PM",
56da2e3ebdSchin 
57da2e3ebdSchin 	"GMT",		"UTC",		"UCT",		"CUT",
58da2e3ebdSchin 
59da2e3ebdSchin 	"DST",		"",		"",		"",
60da2e3ebdSchin 
61da2e3ebdSchin 	"s",		"es",		"",		"",
62da2e3ebdSchin 
63da2e3ebdSchin 	"second",	"minute",	"hour",		"day",
64da2e3ebdSchin 	"week",		"month",	"year",
65da2e3ebdSchin 
66da2e3ebdSchin 	"midnight",	"morning",	"noon",		"evening",
67da2e3ebdSchin 
68da2e3ebdSchin 	"yesterday",	"today",	"tomorrow",
69da2e3ebdSchin 
70da2e3ebdSchin 	"last",		"ago",		"past",
71da2e3ebdSchin 	"this",		"now",		"current",
72da2e3ebdSchin 	"in",		"next",		"hence",
73da2e3ebdSchin 	"exactly",	"",		"",
74da2e3ebdSchin 
75da2e3ebdSchin 	"at",		"on",		"",		"",
76da2e3ebdSchin 
77da2e3ebdSchin 	"st",		"nd",		"rd",		"th",		"th",
78da2e3ebdSchin 	"th",		"th",		"th",		"th",		"th",
79da2e3ebdSchin 
80da2e3ebdSchin 	"",		"",		"",		"",		"",
81da2e3ebdSchin 	"",		"",		"",		"",		"",
82da2e3ebdSchin 
83da2e3ebdSchin 	"%a %b %e %T %Y",
84da2e3ebdSchin 	"%a %b %e %T %Z %Y",
85da2e3ebdSchin 	"%a %b %e %T %z %Z %Y",
86da2e3ebdSchin 	"%b %e %H:%M",
87da2e3ebdSchin 	"%b %e  %Y",
88da2e3ebdSchin 	"%I:%M:%S %p",
89da2e3ebdSchin 
90da2e3ebdSchin 	"",		"",		"",		"",		"",
91da2e3ebdSchin 
92da2e3ebdSchin 	"first",	"",		"third",	"fourth",	"fifth",
93da2e3ebdSchin 	"sixth",	"seventh",	"eighth",	"ninth",	"tenth",
94da2e3ebdSchin 
95da2e3ebdSchin 	"final",	"ending",	"nth",
9634f9b3eeSRoland Mainz 
9734f9b3eeSRoland Mainz 	"work",		"working",	"workday",
98da2e3ebdSchin };
99da2e3ebdSchin 
100da2e3ebdSchin /*
101da2e3ebdSchin  * format[] lex type classes
102da2e3ebdSchin  */
103da2e3ebdSchin 
10434f9b3eeSRoland Mainz static unsigned char	lex[] =
105da2e3ebdSchin {
106da2e3ebdSchin 	TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,
107da2e3ebdSchin 	TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,
108da2e3ebdSchin 	TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,
109da2e3ebdSchin 
110da2e3ebdSchin 	TM_MONTH,	TM_MONTH,	TM_MONTH,	TM_MONTH,
111da2e3ebdSchin 	TM_MONTH,	TM_MONTH,	TM_MONTH,	TM_MONTH,
112da2e3ebdSchin 	TM_MONTH,	TM_MONTH,	TM_MONTH,	TM_MONTH,
113da2e3ebdSchin 
114da2e3ebdSchin 	TM_DAY_ABBREV,	TM_DAY_ABBREV,	TM_DAY_ABBREV,	TM_DAY_ABBREV,
115da2e3ebdSchin 	TM_DAY_ABBREV,	TM_DAY_ABBREV,	TM_DAY_ABBREV,
116da2e3ebdSchin 
117da2e3ebdSchin 	TM_DAY,		TM_DAY,		TM_DAY,		TM_DAY,
118da2e3ebdSchin 	TM_DAY,		TM_DAY,		TM_DAY,
119da2e3ebdSchin 
120da2e3ebdSchin 	0,		0,		0,
121da2e3ebdSchin 
122da2e3ebdSchin 	TM_MERIDIAN,	TM_MERIDIAN,
123da2e3ebdSchin 
124da2e3ebdSchin 	TM_UT,		TM_UT,		TM_UT,		TM_UT,
125da2e3ebdSchin 	TM_DT,		TM_DT,		TM_DT,		TM_DT,
126da2e3ebdSchin 
127da2e3ebdSchin 	TM_SUFFIXES,	TM_SUFFIXES,	TM_SUFFIXES,	TM_SUFFIXES,
128da2e3ebdSchin 
129da2e3ebdSchin 	TM_PARTS,	TM_PARTS,	TM_PARTS,	TM_PARTS,
130da2e3ebdSchin 	TM_PARTS,	TM_PARTS,	TM_PARTS,
131da2e3ebdSchin 
132da2e3ebdSchin 	TM_HOURS,	TM_HOURS,	TM_HOURS,	TM_HOURS,
133da2e3ebdSchin 
134da2e3ebdSchin 	TM_DAYS,	TM_DAYS,	TM_DAYS,
135da2e3ebdSchin 
136da2e3ebdSchin 	TM_LAST,	TM_LAST,	TM_LAST,
137da2e3ebdSchin 	TM_THIS,	TM_THIS,	TM_THIS,
138da2e3ebdSchin 	TM_NEXT,	TM_NEXT,	TM_NEXT,
139da2e3ebdSchin 	TM_EXACT,	TM_EXACT,	TM_EXACT,
140da2e3ebdSchin 
141da2e3ebdSchin 	TM_NOISE,	TM_NOISE,	TM_NOISE,	TM_NOISE,
142da2e3ebdSchin 
143da2e3ebdSchin 	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,
144da2e3ebdSchin 	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,	TM_ORDINAL,
145da2e3ebdSchin 
146da2e3ebdSchin 	0,		0,		0,		0,		0,
147da2e3ebdSchin 	0,		0,		0,		0,		0,
148da2e3ebdSchin 
149da2e3ebdSchin 	0,		0,		0,
150da2e3ebdSchin 	0,		0,		0,
151da2e3ebdSchin 
152da2e3ebdSchin 	0,		0,		0,		0,		0,
153da2e3ebdSchin 
154da2e3ebdSchin 	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,
155da2e3ebdSchin 	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,	TM_ORDINALS,
156da2e3ebdSchin 
157da2e3ebdSchin 	TM_FINAL,	TM_FINAL,	TM_FINAL,
15834f9b3eeSRoland Mainz 
15934f9b3eeSRoland Mainz 	TM_WORK,	TM_WORK,	TM_WORK,
160da2e3ebdSchin };
161da2e3ebdSchin 
162da2e3ebdSchin /*
163da2e3ebdSchin  * output format digits
164da2e3ebdSchin  */
165da2e3ebdSchin 
166da2e3ebdSchin static char	digit[] = "0123456789";
167da2e3ebdSchin 
168da2e3ebdSchin /*
169da2e3ebdSchin  * number of days in month i
170da2e3ebdSchin  */
171da2e3ebdSchin 
172da2e3ebdSchin static short	days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
173da2e3ebdSchin 
174da2e3ebdSchin /*
175da2e3ebdSchin  * sum of days in months before month i
176da2e3ebdSchin  */
177da2e3ebdSchin 
178da2e3ebdSchin static short	sum[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
179da2e3ebdSchin 
180da2e3ebdSchin /*
181da2e3ebdSchin  * leap second time_t and accumulated adjustments
182da2e3ebdSchin  * (reverse order -- biased for recent dates)
183da2e3ebdSchin  *
184da2e3ebdSchin  * tl.time is the seconds since the epoch for the leap event
185da2e3ebdSchin  *
186da2e3ebdSchin  *	adding:		the first additional second
187da2e3ebdSchin  *	subtracting:	the first dissappearing second
188da2e3ebdSchin  */
189da2e3ebdSchin 
190da2e3ebdSchin static Tm_leap_t	leap[] =
191da2e3ebdSchin {
19234f9b3eeSRoland Mainz 	 1230768023,   24,		/* 2008-12-31+23:59:60-0000 */
19334f9b3eeSRoland Mainz 	 1136073622,   23,		/* 2005-12-31+23:59:60-0000 */
19434f9b3eeSRoland Mainz 	  915148821,   22,		/* 1998-12-31+23:59:60-0000 */
19534f9b3eeSRoland Mainz 	  867715220,   21,		/* 1997-06-30+23:59:60-0000 */
19634f9b3eeSRoland Mainz 	  820454419,   20,		/* 1995-12-31+23:59:60-0000 */
19734f9b3eeSRoland Mainz 	  773020818,   19,		/* 1994-06-30+23:59:60-0000 */
19834f9b3eeSRoland Mainz 	  741484817,   18,		/* 1993-06-30+23:59:60-0000 */
19934f9b3eeSRoland Mainz 	  709948816,   17,		/* 1992-06-30+23:59:60-0000 */
20034f9b3eeSRoland Mainz 	  662688015,   16,		/* 1990-12-31+23:59:60-0000 */
20134f9b3eeSRoland Mainz 	  631152014,   15,		/* 1989-12-31+23:59:60-0000 */
20234f9b3eeSRoland Mainz 	  567993613,   14,		/* 1987-12-31+23:59:60-0000 */
20334f9b3eeSRoland Mainz 	  489024012,   13,		/* 1985-06-30+23:59:60-0000 */
20434f9b3eeSRoland Mainz 	  425865611,   12,		/* 1983-06-30+23:59:60-0000 */
20534f9b3eeSRoland Mainz 	  394329610,   11,		/* 1982-06-30+23:59:60-0000 */
20634f9b3eeSRoland Mainz 	  362793609,   10,		/* 1981-06-30+23:59:60-0000 */
20734f9b3eeSRoland Mainz 	  315532808,    9,		/* 1979-12-31+23:59:60-0000 */
20834f9b3eeSRoland Mainz 	  283996807,    8,		/* 1978-12-31+23:59:60-0000 */
20934f9b3eeSRoland Mainz 	  252460806,    7,		/* 1977-12-31+23:59:60-0000 */
21034f9b3eeSRoland Mainz 	  220924805,    6,		/* 1976-12-31+23:59:60-0000 */
21134f9b3eeSRoland Mainz 	  189302404,    5,		/* 1975-12-31+23:59:60-0000 */
21234f9b3eeSRoland Mainz 	  157766403,    4,		/* 1974-12-31+23:59:60-0000 */
21334f9b3eeSRoland Mainz 	  126230402,    3,		/* 1973-12-31+23:59:60-0000 */
21434f9b3eeSRoland Mainz 	   94694401,    2,		/* 1972-12-31+23:59:60-0000 */
21534f9b3eeSRoland Mainz 	   78796800,    1,		/* 1972-06-30+23:59:60-0000 */
216da2e3ebdSchin 		  0,    0,		/* can reference (tl+1)     */
217da2e3ebdSchin 		  0,    0
218da2e3ebdSchin };
219da2e3ebdSchin 
220da2e3ebdSchin /*
221da2e3ebdSchin  * time zones
222da2e3ebdSchin  *
223da2e3ebdSchin  * the UTC entries must be first
224da2e3ebdSchin  *
225da2e3ebdSchin  * zones with the same type are contiguous with all but the
226da2e3ebdSchin  * first entry for the type having a null type
227da2e3ebdSchin  *
228da2e3ebdSchin  * tz.standard is the sentinel
229da2e3ebdSchin  */
230da2e3ebdSchin 
231da2e3ebdSchin static Tm_zone_t	zone[] =
232da2e3ebdSchin {
233da2e3ebdSchin  0,	"GMT",	0,	 ( 0 * 60),	     0,	/* UTC			*/
234da2e3ebdSchin  0,	"UCT",	0,	 ( 0 * 60),	     0,	/* UTC			*/
235da2e3ebdSchin  0,	"UTC",	0,	 ( 0 * 60),	     0,	/* UTC			*/
236da2e3ebdSchin  0,	"CUT",	0,	 ( 0 * 60),	     0,	/* UTC			*/
2377c2fbfb3SApril Chin  0,	"Z",	0,	 ( 0 * 60),	     0,	/* UTC			*/
238da2e3ebdSchin  "USA",	"HST",	0,	 (10 * 60),	     0,	/* Hawaii		*/
239da2e3ebdSchin  0,	"YST",	"YDT",	 ( 9 * 60),	TM_DST,	/* Yukon		*/
240da2e3ebdSchin  0,	"PST",	"PDT",	 ( 8 * 60),	TM_DST,	/* Pacific		*/
241da2e3ebdSchin  0,	"PST",	"PPET",	 ( 8 * 60),	TM_DST,	/* Pacific pres elect	*/
242da2e3ebdSchin  0,	"MST",	"MDT",	 ( 7 * 60),	TM_DST,	/* Mountain		*/
243da2e3ebdSchin  0,	"CST",	"CDT",	 ( 6 * 60),	TM_DST,	/* Central		*/
244da2e3ebdSchin  0,	"EST",	"EDT",	 ( 5 * 60),	TM_DST,	/* Eastern		*/
245da2e3ebdSchin  "CAN",	"AST",	"ADT",	 ( 4 * 60),	TM_DST,	/* Atlantic		*/
246da2e3ebdSchin  0,	"NST",	0,	 ( 3 * 60 + 30),     0,	/* Newfoundland		*/
247da2e3ebdSchin  "GBR",	"",	"BST",	 ( 0 * 60),	TM_DST,	/* British Summer	*/
24834f9b3eeSRoland Mainz  "EUR",	"WET",	"WEST",	 ( 0 * 60),	TM_DST,	/* Western Eurpoean	*/
24934f9b3eeSRoland Mainz  0,	"CET",	"CEST",	-( 1 * 60),	TM_DST,	/* Central European	*/
25034f9b3eeSRoland Mainz  0,	"MET",	"MEST",	-( 1 * 60),	TM_DST,	/* Middle European	*/
25134f9b3eeSRoland Mainz  0,	"EET",	"EEST",	-( 2 * 60),	TM_DST,	/* Eastern Eurpoean	*/
252da2e3ebdSchin  "ISR",	"IST",	"IDT",  -( 3 * 60),	TM_DST,	/* Israel		*/
253da2e3ebdSchin  "IND",	"IST",	0,  	-( 5 * 60 + 30 ),    0,	/* India		*/
254da2e3ebdSchin  "CHN",	"HKT",	0,	-( 8 * 60),	     0,	/* Hong Kong		*/
255da2e3ebdSchin  "KOR",	"KST",	"KDT",	-( 8 * 60),	TM_DST,	/* Korea		*/
256da2e3ebdSchin  "SNG",	"SST",	0,	-( 8 * 60),	     0,	/* Singapore		*/
257da2e3ebdSchin  "JPN",	"JST",	0,	-( 9 * 60),	     0,	/* Japan		*/
258da2e3ebdSchin  "AUS",	"AWST",	0,	-( 8 * 60),	     0,	/* Australia Western	*/
259da2e3ebdSchin  0,	"WST",	0,	-( 8 * 60),	     0,	/* Australia Western	*/
260da2e3ebdSchin  0,	"ACST",	0,	-( 9 * 60 + 30),TM_DST,	/* Australia Central	*/
261da2e3ebdSchin  0,	"CST",	0,	-( 9 * 60 + 30),TM_DST,	/* Australia Central	*/
262da2e3ebdSchin  0,	"AEST",	0,	-(10 * 60),	TM_DST,	/* Australia Eastern	*/
263da2e3ebdSchin  0,	"EST",	0,	-(10 * 60),	TM_DST,	/* Australia Eastern	*/
264da2e3ebdSchin  "NZL",	"NZST",	"NZDT",	-(12 * 60),	TM_DST,	/* New Zealand		*/
265da2e3ebdSchin  0,	0,	0,	0,		     0
266da2e3ebdSchin };
267da2e3ebdSchin 
268da2e3ebdSchin /*
269da2e3ebdSchin  * 2007-03-19 move tm_data from _tm_data_ to (*_tm_datap_)
270da2e3ebdSchin  *	      to allow future Tm_data_t growth
271da2e3ebdSchin  *            by 2009 _tm_data_ can be static
272da2e3ebdSchin  */
273da2e3ebdSchin 
274da2e3ebdSchin #if _BLD_ast && defined(__EXPORT__)
275da2e3ebdSchin #define extern		extern __EXPORT__
276da2e3ebdSchin #endif
277da2e3ebdSchin 
278da2e3ebdSchin extern Tm_data_t	_tm_data_;
279da2e3ebdSchin 
280da2e3ebdSchin #undef	extern
281da2e3ebdSchin 
282da2e3ebdSchin Tm_data_t _tm_data_ = { format, lex, digit, days, sum, leap, zone };
283da2e3ebdSchin 
284da2e3ebdSchin __EXTERN__(Tm_data_t, _tm_data_);
285da2e3ebdSchin 
286da2e3ebdSchin __EXTERN__(Tm_data_t*, _tm_datap_);
287da2e3ebdSchin 
288da2e3ebdSchin Tm_data_t*		_tm_datap_ = &_tm_data_;
289