gmtime.c (919B)
1 #include <stdlib.h> 2 #include <time.h> 3 4 #include "../libc.h" 5 6 #undef gmtime 7 8 struct tm * 9 gmtime(const time_t *tim) 10 { 11 div_t d; 12 int month, year; 13 time_t tday, day, t = *tim; 14 static struct tm tm; 15 16 day = t / SECDAY; 17 tday = t % SECDAY; 18 if (tday < 0) { 19 tday += SECDAY; 20 day--; 21 } 22 23 d = div(tday, 60); 24 tm.tm_sec = d.rem; 25 d = div(d.quot, 60); 26 tm.tm_min = d.rem; 27 tm.tm_hour = d.quot; 28 29 /* 1/1/1970 was Thursday */ 30 tm.tm_wday = (day + THU) % 7; 31 if (tm.tm_wday < 0) 32 tm.tm_wday += 7; 33 34 year = EPOCH; 35 if (day >= 0) { 36 while (day >= _daysyear(year)) 37 day -= _daysyear(year++); 38 } else { 39 while (day < 0) 40 day += _daysyear(--year); 41 } 42 43 tm.tm_year = year - 1900; 44 tm.tm_yday = day; 45 46 _daysmon[FEB] = FEBDAYS(year); 47 for (month = JAN; day >= _daysmon[month]; month++) 48 day -= _daysmon[month]; 49 tm.tm_mon = month; 50 tm.tm_mday = day + 1; 51 52 tm.tm_isdst = 0; 53 tm.tm_zone = "UTC"; 54 tm.tm_gmtoff = 0; 55 56 return &tm; 57 }