xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/tm/tmdata.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
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  
37  static 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  
104  static 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  
166  static char	digit[] = "0123456789";
167  
168  /*
169   * number of days in month i
170   */
171  
172  static 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  
178  static 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  
190  static 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  
231  static 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  
278  extern Tm_data_t	_tm_data_;
279  
280  #undef	extern
281  
282  Tm_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  
288  Tm_data_t*		_tm_datap_ = &_tm_data_;
289