1*012771d8Swdenk #ifndef _LINUX_TIME_H 2*012771d8Swdenk #define _LINUX_TIME_H 3*012771d8Swdenk 4*012771d8Swdenk #include <linux/types.h> 5*012771d8Swdenk 6*012771d8Swdenk #define _DEFUN(a,b,c) a(c) 7*012771d8Swdenk #define _CONST const 8*012771d8Swdenk #define _AND , 9*012771d8Swdenk 10*012771d8Swdenk #define _REENT_ONLY 11*012771d8Swdenk 12*012771d8Swdenk #define SECSPERMIN 60L 13*012771d8Swdenk #define MINSPERHOUR 60L 14*012771d8Swdenk #define HOURSPERDAY 24L 15*012771d8Swdenk #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) 16*012771d8Swdenk #define SECSPERDAY (SECSPERHOUR * HOURSPERDAY) 17*012771d8Swdenk #define DAYSPERWEEK 7 18*012771d8Swdenk #define MONSPERYEAR 12 19*012771d8Swdenk 20*012771d8Swdenk #define YEAR_BASE 1900 21*012771d8Swdenk #define EPOCH_YEAR 1970 22*012771d8Swdenk #define EPOCH_WDAY 4 23*012771d8Swdenk 24*012771d8Swdenk #define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) 25*012771d8Swdenk 26*012771d8Swdenk 27*012771d8Swdenk /* Used by other time functions. */ 28*012771d8Swdenk struct tm { 29*012771d8Swdenk int tm_sec; /* Seconds. [0-60] (1 leap second) */ 30*012771d8Swdenk int tm_min; /* Minutes. [0-59] */ 31*012771d8Swdenk int tm_hour; /* Hours. [0-23] */ 32*012771d8Swdenk int tm_mday; /* Day. [1-31] */ 33*012771d8Swdenk int tm_mon; /* Month. [0-11] */ 34*012771d8Swdenk int tm_year; /* Year - 1900. */ 35*012771d8Swdenk int tm_wday; /* Day of week. [0-6] */ 36*012771d8Swdenk int tm_yday; /* Days in year.[0-365] */ 37*012771d8Swdenk int tm_isdst; /* DST. [-1/0/1]*/ 38*012771d8Swdenk 39*012771d8Swdenk # ifdef __USE_BSD 40*012771d8Swdenk long int tm_gmtoff; /* Seconds east of UTC. */ 41*012771d8Swdenk __const char *tm_zone; /* Timezone abbreviation. */ 42*012771d8Swdenk # else 43*012771d8Swdenk long int __tm_gmtoff; /* Seconds east of UTC. */ 44*012771d8Swdenk __const char *__tm_zone; /* Timezone abbreviation. */ 45*012771d8Swdenk # endif 46*012771d8Swdenk }; 47*012771d8Swdenk 48*012771d8Swdenk static inline char * 49*012771d8Swdenk _DEFUN (asctime_r, (tim_p, result), 50*012771d8Swdenk _CONST struct tm *tim_p _AND 51*012771d8Swdenk char *result) 52*012771d8Swdenk { 53*012771d8Swdenk static _CONST char day_name[7][3] = { 54*012771d8Swdenk "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 55*012771d8Swdenk }; 56*012771d8Swdenk static _CONST char mon_name[12][3] = { 57*012771d8Swdenk "Jan", "Feb", "Mar", "Apr", "May", "Jun", 58*012771d8Swdenk "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 59*012771d8Swdenk }; 60*012771d8Swdenk 61*012771d8Swdenk sprintf (result, "%.3s %.3s %.2d %.2d:%.2d:%.2d %d\n", 62*012771d8Swdenk day_name[tim_p->tm_wday], 63*012771d8Swdenk mon_name[tim_p->tm_mon], 64*012771d8Swdenk tim_p->tm_mday, tim_p->tm_hour, tim_p->tm_min, 65*012771d8Swdenk tim_p->tm_sec, 1900 + tim_p->tm_year); 66*012771d8Swdenk return result; 67*012771d8Swdenk } 68*012771d8Swdenk 69*012771d8Swdenk static inline struct tm * 70*012771d8Swdenk _DEFUN (localtime_r, (tim_p, res), 71*012771d8Swdenk _CONST time_t * tim_p _AND 72*012771d8Swdenk struct tm *res) 73*012771d8Swdenk { 74*012771d8Swdenk static _CONST int mon_lengths[2][MONSPERYEAR] = { 75*012771d8Swdenk {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 76*012771d8Swdenk {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 77*012771d8Swdenk } ; 78*012771d8Swdenk 79*012771d8Swdenk static _CONST int year_lengths[2] = { 80*012771d8Swdenk 365, 81*012771d8Swdenk 366 82*012771d8Swdenk } ; 83*012771d8Swdenk 84*012771d8Swdenk long days, rem; 85*012771d8Swdenk int y; 86*012771d8Swdenk int yleap; 87*012771d8Swdenk _CONST int *ip; 88*012771d8Swdenk 89*012771d8Swdenk days = ((long) *tim_p) / SECSPERDAY; 90*012771d8Swdenk rem = ((long) *tim_p) % SECSPERDAY; 91*012771d8Swdenk while (rem < 0) 92*012771d8Swdenk { 93*012771d8Swdenk rem += SECSPERDAY; 94*012771d8Swdenk --days; 95*012771d8Swdenk } 96*012771d8Swdenk 97*012771d8Swdenk /* compute hour, min, and sec */ 98*012771d8Swdenk res->tm_hour = (int) (rem / SECSPERHOUR); 99*012771d8Swdenk rem %= SECSPERHOUR; 100*012771d8Swdenk res->tm_min = (int) (rem / SECSPERMIN); 101*012771d8Swdenk res->tm_sec = (int) (rem % SECSPERMIN); 102*012771d8Swdenk 103*012771d8Swdenk /* compute day of week */ 104*012771d8Swdenk if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0) 105*012771d8Swdenk res->tm_wday += DAYSPERWEEK; 106*012771d8Swdenk 107*012771d8Swdenk /* compute year & day of year */ 108*012771d8Swdenk y = EPOCH_YEAR; 109*012771d8Swdenk if (days >= 0) 110*012771d8Swdenk { 111*012771d8Swdenk for (;;) 112*012771d8Swdenk { 113*012771d8Swdenk yleap = isleap(y); 114*012771d8Swdenk if (days < year_lengths[yleap]) 115*012771d8Swdenk break; 116*012771d8Swdenk y++; 117*012771d8Swdenk days -= year_lengths[yleap]; 118*012771d8Swdenk } 119*012771d8Swdenk } 120*012771d8Swdenk else 121*012771d8Swdenk { 122*012771d8Swdenk do 123*012771d8Swdenk { 124*012771d8Swdenk --y; 125*012771d8Swdenk yleap = isleap(y); 126*012771d8Swdenk days += year_lengths[yleap]; 127*012771d8Swdenk } while (days < 0); 128*012771d8Swdenk } 129*012771d8Swdenk 130*012771d8Swdenk res->tm_year = y - YEAR_BASE; 131*012771d8Swdenk res->tm_yday = days; 132*012771d8Swdenk ip = mon_lengths[yleap]; 133*012771d8Swdenk for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon) 134*012771d8Swdenk days -= ip[res->tm_mon]; 135*012771d8Swdenk res->tm_mday = days + 1; 136*012771d8Swdenk 137*012771d8Swdenk /* set daylight saving time flag */ 138*012771d8Swdenk res->tm_isdst = -1; 139*012771d8Swdenk 140*012771d8Swdenk return (res); 141*012771d8Swdenk } 142*012771d8Swdenk 143*012771d8Swdenk static inline char * 144*012771d8Swdenk _DEFUN (ctime_r, (tim_p, result), 145*012771d8Swdenk _CONST time_t * tim_p _AND 146*012771d8Swdenk char * result) 147*012771d8Swdenk 148*012771d8Swdenk { 149*012771d8Swdenk struct tm tm; 150*012771d8Swdenk return asctime_r (localtime_r (tim_p, &tm), result); 151*012771d8Swdenk } 152*012771d8Swdenk 153*012771d8Swdenk #endif 154