scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

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 }