gmtime.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /* $Id$ */
  2. #include <time.h>
  3. static int monthsize[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  4. #define SECS_DAY (24*60L*60L)
  5. #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
  6. #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
  7. struct tm *
  8. gmtime(clock)
  9. long *clock;
  10. {
  11. long cl = *clock;
  12. long dayclock, dayno;
  13. static struct tm tm_buf;
  14. register struct tm *pbuf = &tm_buf;
  15. register int *months = monthsize;
  16. int year = 1970;
  17. dayclock = cl % SECS_DAY;
  18. dayno = cl / SECS_DAY;
  19. pbuf->tm_sec = dayclock % 60;
  20. pbuf->tm_min = (dayclock % 3600) / 60;
  21. pbuf->tm_hour = dayclock / 3600;
  22. pbuf->tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */
  23. while (dayno >= YEARSIZE(year)) {
  24. dayno -= YEARSIZE(year);
  25. year++;
  26. }
  27. pbuf->tm_year = year - 1900;
  28. pbuf->tm_yday = dayno;
  29. pbuf->tm_isdst = 0;
  30. if (YEARSIZE(year) == 366) monthsize[1] = 29;
  31. while (dayno - *months >= 0) dayno -= *months++;
  32. pbuf->tm_mday = dayno + 1;
  33. pbuf->tm_mon = months - monthsize;
  34. monthsize[1] = 28;
  35. return pbuf;
  36. }