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