14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #pragma prototyped 234887Schin /* 244887Schin * Glenn Fowler 254887Schin * AT&T Research 264887Schin * 274887Schin * time conversion support readonly data 284887Schin */ 294887Schin 304887Schin #include <ast.h> 314887Schin #include <tm.h> 324887Schin 334887Schin /* 344887Schin * default format strings -- must agree with TM_* indices 354887Schin */ 364887Schin 374887Schin static char* format[] = 384887Schin { 394887Schin "Jan", "Feb", "Mar", "Apr", 404887Schin "May", "Jun", "Jul", "Aug", 414887Schin "Sep", "Oct", "Nov", "Dec", 424887Schin 434887Schin "January", "February", "March", "April", 444887Schin "May", "June", "July", "August", 454887Schin "September", "October", "November", "December", 464887Schin 474887Schin "Sun", "Mon", "Tue", "Wed", 484887Schin "Thu", "Fri", "Sat", 494887Schin 504887Schin "Sunday", "Monday", "Tuesday", "Wednesday", 514887Schin "Thursday", "Friday", "Saturday", 524887Schin 534887Schin "%H:%M:%S", "%m/%d/%y", "%a %b %e %T %Z %Y", 544887Schin 554887Schin "AM", "PM", 564887Schin 574887Schin "GMT", "UTC", "UCT", "CUT", 584887Schin 594887Schin "DST", "", "", "", 604887Schin 614887Schin "s", "es", "", "", 624887Schin 634887Schin "second", "minute", "hour", "day", 644887Schin "week", "month", "year", 654887Schin 664887Schin "midnight", "morning", "noon", "evening", 674887Schin 684887Schin "yesterday", "today", "tomorrow", 694887Schin 704887Schin "last", "ago", "past", 714887Schin "this", "now", "current", 724887Schin "in", "next", "hence", 734887Schin "exactly", "", "", 744887Schin 754887Schin "at", "on", "", "", 764887Schin 774887Schin "st", "nd", "rd", "th", "th", 784887Schin "th", "th", "th", "th", "th", 794887Schin 804887Schin "", "", "", "", "", 814887Schin "", "", "", "", "", 824887Schin 834887Schin "%a %b %e %T %Y", 844887Schin "%a %b %e %T %Z %Y", 854887Schin "%a %b %e %T %z %Z %Y", 864887Schin "%b %e %H:%M", 874887Schin "%b %e %Y", 884887Schin "%I:%M:%S %p", 894887Schin 904887Schin "", "", "", "", "", 914887Schin 924887Schin "first", "", "third", "fourth", "fifth", 934887Schin "sixth", "seventh", "eighth", "ninth", "tenth", 944887Schin 954887Schin "final", "ending", "nth", 9610898Sroland.mainz@nrubsig.org 9710898Sroland.mainz@nrubsig.org "work", "working", "workday", 984887Schin }; 994887Schin 1004887Schin /* 1014887Schin * format[] lex type classes 1024887Schin */ 1034887Schin 10410898Sroland.mainz@nrubsig.org static unsigned char lex[] = 1054887Schin { 1064887Schin TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV, 1074887Schin TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV, 1084887Schin TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV,TM_MONTH_ABBREV, 1094887Schin 1104887Schin TM_MONTH, TM_MONTH, TM_MONTH, TM_MONTH, 1114887Schin TM_MONTH, TM_MONTH, TM_MONTH, TM_MONTH, 1124887Schin TM_MONTH, TM_MONTH, TM_MONTH, TM_MONTH, 1134887Schin 1144887Schin TM_DAY_ABBREV, TM_DAY_ABBREV, TM_DAY_ABBREV, TM_DAY_ABBREV, 1154887Schin TM_DAY_ABBREV, TM_DAY_ABBREV, TM_DAY_ABBREV, 1164887Schin 1174887Schin TM_DAY, TM_DAY, TM_DAY, TM_DAY, 1184887Schin TM_DAY, TM_DAY, TM_DAY, 1194887Schin 1204887Schin 0, 0, 0, 1214887Schin 1224887Schin TM_MERIDIAN, TM_MERIDIAN, 1234887Schin 1244887Schin TM_UT, TM_UT, TM_UT, TM_UT, 1254887Schin TM_DT, TM_DT, TM_DT, TM_DT, 1264887Schin 1274887Schin TM_SUFFIXES, TM_SUFFIXES, TM_SUFFIXES, TM_SUFFIXES, 1284887Schin 1294887Schin TM_PARTS, TM_PARTS, TM_PARTS, TM_PARTS, 1304887Schin TM_PARTS, TM_PARTS, TM_PARTS, 1314887Schin 1324887Schin TM_HOURS, TM_HOURS, TM_HOURS, TM_HOURS, 1334887Schin 1344887Schin TM_DAYS, TM_DAYS, TM_DAYS, 1354887Schin 1364887Schin TM_LAST, TM_LAST, TM_LAST, 1374887Schin TM_THIS, TM_THIS, TM_THIS, 1384887Schin TM_NEXT, TM_NEXT, TM_NEXT, 1394887Schin TM_EXACT, TM_EXACT, TM_EXACT, 1404887Schin 1414887Schin TM_NOISE, TM_NOISE, TM_NOISE, TM_NOISE, 1424887Schin 1434887Schin TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, 1444887Schin TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, TM_ORDINAL, 1454887Schin 1464887Schin 0, 0, 0, 0, 0, 1474887Schin 0, 0, 0, 0, 0, 1484887Schin 1494887Schin 0, 0, 0, 1504887Schin 0, 0, 0, 1514887Schin 1524887Schin 0, 0, 0, 0, 0, 1534887Schin 1544887Schin TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, 1554887Schin TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, TM_ORDINALS, 1564887Schin 1574887Schin TM_FINAL, TM_FINAL, TM_FINAL, 15810898Sroland.mainz@nrubsig.org 15910898Sroland.mainz@nrubsig.org TM_WORK, TM_WORK, TM_WORK, 1604887Schin }; 1614887Schin 1624887Schin /* 1634887Schin * output format digits 1644887Schin */ 1654887Schin 1664887Schin static char digit[] = "0123456789"; 1674887Schin 1684887Schin /* 1694887Schin * number of days in month i 1704887Schin */ 1714887Schin 1724887Schin static short days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1734887Schin 1744887Schin /* 1754887Schin * sum of days in months before month i 1764887Schin */ 1774887Schin 1784887Schin static short sum[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; 1794887Schin 1804887Schin /* 1814887Schin * leap second time_t and accumulated adjustments 1824887Schin * (reverse order -- biased for recent dates) 1834887Schin * 1844887Schin * tl.time is the seconds since the epoch for the leap event 1854887Schin * 1864887Schin * adding: the first additional second 1874887Schin * subtracting: the first dissappearing second 1884887Schin */ 1894887Schin 1904887Schin static Tm_leap_t leap[] = 1914887Schin { 19210898Sroland.mainz@nrubsig.org 1230768023, 24, /* 2008-12-31+23:59:60-0000 */ 19310898Sroland.mainz@nrubsig.org 1136073622, 23, /* 2005-12-31+23:59:60-0000 */ 19410898Sroland.mainz@nrubsig.org 915148821, 22, /* 1998-12-31+23:59:60-0000 */ 19510898Sroland.mainz@nrubsig.org 867715220, 21, /* 1997-06-30+23:59:60-0000 */ 19610898Sroland.mainz@nrubsig.org 820454419, 20, /* 1995-12-31+23:59:60-0000 */ 19710898Sroland.mainz@nrubsig.org 773020818, 19, /* 1994-06-30+23:59:60-0000 */ 19810898Sroland.mainz@nrubsig.org 741484817, 18, /* 1993-06-30+23:59:60-0000 */ 19910898Sroland.mainz@nrubsig.org 709948816, 17, /* 1992-06-30+23:59:60-0000 */ 20010898Sroland.mainz@nrubsig.org 662688015, 16, /* 1990-12-31+23:59:60-0000 */ 20110898Sroland.mainz@nrubsig.org 631152014, 15, /* 1989-12-31+23:59:60-0000 */ 20210898Sroland.mainz@nrubsig.org 567993613, 14, /* 1987-12-31+23:59:60-0000 */ 20310898Sroland.mainz@nrubsig.org 489024012, 13, /* 1985-06-30+23:59:60-0000 */ 20410898Sroland.mainz@nrubsig.org 425865611, 12, /* 1983-06-30+23:59:60-0000 */ 20510898Sroland.mainz@nrubsig.org 394329610, 11, /* 1982-06-30+23:59:60-0000 */ 20610898Sroland.mainz@nrubsig.org 362793609, 10, /* 1981-06-30+23:59:60-0000 */ 20710898Sroland.mainz@nrubsig.org 315532808, 9, /* 1979-12-31+23:59:60-0000 */ 20810898Sroland.mainz@nrubsig.org 283996807, 8, /* 1978-12-31+23:59:60-0000 */ 20910898Sroland.mainz@nrubsig.org 252460806, 7, /* 1977-12-31+23:59:60-0000 */ 21010898Sroland.mainz@nrubsig.org 220924805, 6, /* 1976-12-31+23:59:60-0000 */ 21110898Sroland.mainz@nrubsig.org 189302404, 5, /* 1975-12-31+23:59:60-0000 */ 21210898Sroland.mainz@nrubsig.org 157766403, 4, /* 1974-12-31+23:59:60-0000 */ 21310898Sroland.mainz@nrubsig.org 126230402, 3, /* 1973-12-31+23:59:60-0000 */ 21410898Sroland.mainz@nrubsig.org 94694401, 2, /* 1972-12-31+23:59:60-0000 */ 21510898Sroland.mainz@nrubsig.org 78796800, 1, /* 1972-06-30+23:59:60-0000 */ 2164887Schin 0, 0, /* can reference (tl+1) */ 2174887Schin 0, 0 2184887Schin }; 2194887Schin 2204887Schin /* 2214887Schin * time zones 2224887Schin * 2234887Schin * the UTC entries must be first 2244887Schin * 2254887Schin * zones with the same type are contiguous with all but the 2264887Schin * first entry for the type having a null type 2274887Schin * 2284887Schin * tz.standard is the sentinel 2294887Schin */ 2304887Schin 2314887Schin static Tm_zone_t zone[] = 2324887Schin { 2334887Schin 0, "GMT", 0, ( 0 * 60), 0, /* UTC */ 2344887Schin 0, "UCT", 0, ( 0 * 60), 0, /* UTC */ 2354887Schin 0, "UTC", 0, ( 0 * 60), 0, /* UTC */ 2364887Schin 0, "CUT", 0, ( 0 * 60), 0, /* UTC */ 2378462SApril.Chin@Sun.COM 0, "Z", 0, ( 0 * 60), 0, /* UTC */ 2384887Schin "USA", "HST", 0, (10 * 60), 0, /* Hawaii */ 2394887Schin 0, "YST", "YDT", ( 9 * 60), TM_DST, /* Yukon */ 2404887Schin 0, "PST", "PDT", ( 8 * 60), TM_DST, /* Pacific */ 2414887Schin 0, "PST", "PPET", ( 8 * 60), TM_DST, /* Pacific pres elect */ 2424887Schin 0, "MST", "MDT", ( 7 * 60), TM_DST, /* Mountain */ 2434887Schin 0, "CST", "CDT", ( 6 * 60), TM_DST, /* Central */ 2444887Schin 0, "EST", "EDT", ( 5 * 60), TM_DST, /* Eastern */ 2454887Schin "CAN", "AST", "ADT", ( 4 * 60), TM_DST, /* Atlantic */ 2464887Schin 0, "NST", 0, ( 3 * 60 + 30), 0, /* Newfoundland */ 2474887Schin "GBR", "", "BST", ( 0 * 60), TM_DST, /* British Summer */ 24810898Sroland.mainz@nrubsig.org "EUR", "WET", "WEST", ( 0 * 60), TM_DST, /* Western Eurpoean */ 24910898Sroland.mainz@nrubsig.org 0, "CET", "CEST", -( 1 * 60), TM_DST, /* Central European */ 25010898Sroland.mainz@nrubsig.org 0, "MET", "MEST", -( 1 * 60), TM_DST, /* Middle European */ 25110898Sroland.mainz@nrubsig.org 0, "EET", "EEST", -( 2 * 60), TM_DST, /* Eastern Eurpoean */ 2524887Schin "ISR", "IST", "IDT", -( 3 * 60), TM_DST, /* Israel */ 2534887Schin "IND", "IST", 0, -( 5 * 60 + 30 ), 0, /* India */ 2544887Schin "CHN", "HKT", 0, -( 8 * 60), 0, /* Hong Kong */ 2554887Schin "KOR", "KST", "KDT", -( 8 * 60), TM_DST, /* Korea */ 2564887Schin "SNG", "SST", 0, -( 8 * 60), 0, /* Singapore */ 2574887Schin "JPN", "JST", 0, -( 9 * 60), 0, /* Japan */ 2584887Schin "AUS", "AWST", 0, -( 8 * 60), 0, /* Australia Western */ 2594887Schin 0, "WST", 0, -( 8 * 60), 0, /* Australia Western */ 2604887Schin 0, "ACST", 0, -( 9 * 60 + 30),TM_DST, /* Australia Central */ 2614887Schin 0, "CST", 0, -( 9 * 60 + 30),TM_DST, /* Australia Central */ 2624887Schin 0, "AEST", 0, -(10 * 60), TM_DST, /* Australia Eastern */ 2634887Schin 0, "EST", 0, -(10 * 60), TM_DST, /* Australia Eastern */ 2644887Schin "NZL", "NZST", "NZDT", -(12 * 60), TM_DST, /* New Zealand */ 2654887Schin 0, 0, 0, 0, 0 2664887Schin }; 2674887Schin 2684887Schin /* 2694887Schin * 2007-03-19 move tm_data from _tm_data_ to (*_tm_datap_) 2704887Schin * to allow future Tm_data_t growth 2714887Schin * by 2009 _tm_data_ can be static 2724887Schin */ 2734887Schin 2744887Schin #if _BLD_ast && defined(__EXPORT__) 2754887Schin #define extern extern __EXPORT__ 2764887Schin #endif 2774887Schin 2784887Schin extern Tm_data_t _tm_data_; 2794887Schin 2804887Schin #undef extern 2814887Schin 2824887Schin Tm_data_t _tm_data_ = { format, lex, digit, days, sum, leap, zone }; 2834887Schin 2844887Schin __EXTERN__(Tm_data_t, _tm_data_); 2854887Schin 2864887Schin __EXTERN__(Tm_data_t*, _tm_datap_); 2874887Schin 2884887Schin Tm_data_t* _tm_datap_ = &_tm_data_; 289