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_t conversion support 28da2e3ebdSchin */ 29da2e3ebdSchin 30da2e3ebdSchin #include <tmx.h> 31da2e3ebdSchin 32da2e3ebdSchin #include "FEATURE/tmlib" 33da2e3ebdSchin 34da2e3ebdSchin /* 35da2e3ebdSchin * return Tm_t for t 36da2e3ebdSchin * time zone and leap seconds accounted for in return value 37da2e3ebdSchin */ 38da2e3ebdSchin 39da2e3ebdSchin Tm_t* tmxtm(register Tm_t * tm,Time_t t,Tm_zone_t * zone)4034f9b3eeSRoland Mainztmxtm(register Tm_t* tm, Time_t t, Tm_zone_t* zone) 41da2e3ebdSchin { 42da2e3ebdSchin register struct tm* tp; 43da2e3ebdSchin register Tm_leap_t* lp; 44da2e3ebdSchin Time_t x; 45da2e3ebdSchin time_t now; 46da2e3ebdSchin int leapsec; 47da2e3ebdSchin int y; 48da2e3ebdSchin uint32_t n; 49da2e3ebdSchin int32_t o; 50da2e3ebdSchin #if TMX_FLOAT 51da2e3ebdSchin Time_t z; 52da2e3ebdSchin uint32_t i; 53da2e3ebdSchin #endif 54da2e3ebdSchin 55da2e3ebdSchin tmset(tm_info.zone); 56da2e3ebdSchin leapsec = 0; 57da2e3ebdSchin if ((tm_info.flags & (TM_ADJUST|TM_LEAP)) == (TM_ADJUST|TM_LEAP) && (n = tmxsec(t))) 58da2e3ebdSchin { 59da2e3ebdSchin for (lp = &tm_data.leap[0]; n < lp->time; lp++); 60da2e3ebdSchin if (lp->total) 61da2e3ebdSchin { 62da2e3ebdSchin if (n == lp->time && (leapsec = (lp->total - (lp+1)->total)) < 0) 63da2e3ebdSchin leapsec = 0; 64da2e3ebdSchin t = tmxsns(n - lp->total, tmxnsec(t)); 65da2e3ebdSchin } 66da2e3ebdSchin } 67da2e3ebdSchin x = tmxsec(t); 6834f9b3eeSRoland Mainz if (!(tm->tm_zone = zone)) 6934f9b3eeSRoland Mainz { 70da2e3ebdSchin if (tm_info.flags & TM_UTC) 7134f9b3eeSRoland Mainz tm->tm_zone = &tm_data.zone[2]; 72da2e3ebdSchin else 7334f9b3eeSRoland Mainz tm->tm_zone = tm_info.zone; 7434f9b3eeSRoland Mainz } 7534f9b3eeSRoland Mainz if ((o = 60 * tm->tm_zone->west) && x > o) 76da2e3ebdSchin { 77da2e3ebdSchin x -= o; 78da2e3ebdSchin o = 0; 79da2e3ebdSchin } 80da2e3ebdSchin #if TMX_FLOAT 81da2e3ebdSchin i = x / (24 * 60 * 60); 82da2e3ebdSchin z = i; 83da2e3ebdSchin n = x - z * (24 * 60 * 60); 8434f9b3eeSRoland Mainz tm->tm_sec = n % 60 + leapsec; 85da2e3ebdSchin n /= 60; 8634f9b3eeSRoland Mainz tm->tm_min = n % 60; 87da2e3ebdSchin n /= 60; 8834f9b3eeSRoland Mainz tm->tm_hour = n % 24; 89da2e3ebdSchin #define x i 90da2e3ebdSchin #else 9134f9b3eeSRoland Mainz tm->tm_sec = x % 60 + leapsec; 92da2e3ebdSchin x /= 60; 9334f9b3eeSRoland Mainz tm->tm_min = x % 60; 94da2e3ebdSchin x /= 60; 9534f9b3eeSRoland Mainz tm->tm_hour = x % 24; 96da2e3ebdSchin x /= 24; 97da2e3ebdSchin #endif 9834f9b3eeSRoland Mainz tm->tm_wday = (x + 4) % 7; 9934f9b3eeSRoland Mainz tm->tm_year = (400 * (x + 25202)) / 146097 + 1; 10034f9b3eeSRoland Mainz n = tm->tm_year - 1; 101da2e3ebdSchin x -= n * 365 + n / 4 - n / 100 + (n + (1900 - 1600)) / 400 - (1970 - 1901) * 365 - (1970 - 1901) / 4; 10234f9b3eeSRoland Mainz tm->tm_mon = 0; 10334f9b3eeSRoland Mainz tm->tm_mday = x + 1; 10434f9b3eeSRoland Mainz tm->tm_nsec = tmxnsec(t); 10534f9b3eeSRoland Mainz tmfix(tm); 106da2e3ebdSchin n += 1900; 10734f9b3eeSRoland Mainz tm->tm_isdst = 0; 10834f9b3eeSRoland Mainz if (tm->tm_zone->daylight) 109da2e3ebdSchin { 11034f9b3eeSRoland Mainz if ((y = tmequiv(tm) - 1900) == tm->tm_year) 111da2e3ebdSchin now = tmxsec(t); 112da2e3ebdSchin else 113da2e3ebdSchin { 114da2e3ebdSchin Tm_t te; 115da2e3ebdSchin 11634f9b3eeSRoland Mainz te = *tm; 117da2e3ebdSchin te.tm_year = y; 11834f9b3eeSRoland Mainz now = tmxsec(tmxtime(&te, tm->tm_zone->west)); 119da2e3ebdSchin } 12034f9b3eeSRoland Mainz if ((tp = tmlocaltime(&now)) && ((tm->tm_isdst = tp->tm_isdst) || o)) 121da2e3ebdSchin { 12234f9b3eeSRoland Mainz tm->tm_min -= o / 60 + (tm->tm_isdst ? tm->tm_zone->dst : 0); 12334f9b3eeSRoland Mainz tmfix(tm); 124da2e3ebdSchin } 125da2e3ebdSchin } 12634f9b3eeSRoland Mainz return tm; 12734f9b3eeSRoland Mainz } 12834f9b3eeSRoland Mainz 12934f9b3eeSRoland Mainz /* 13034f9b3eeSRoland Mainz * return Tm_t for t 13134f9b3eeSRoland Mainz * time zone and leap seconds accounted for in return value 13234f9b3eeSRoland Mainz */ 13334f9b3eeSRoland Mainz 13434f9b3eeSRoland Mainz Tm_t* tmxmake(Time_t t)13534f9b3eeSRoland Mainztmxmake(Time_t t) 13634f9b3eeSRoland Mainz { 13734f9b3eeSRoland Mainz static Tm_t ts; 13834f9b3eeSRoland Mainz 13934f9b3eeSRoland Mainz return tmxtm(&ts, t, NiL); 140da2e3ebdSchin } 141