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