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