time.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <time.h>
  2. static int mdays[13] = { 0,31,31+28,31+28+31,31+28+31+30,
  3. 31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31,
  4. 31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30,
  5. 31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30,
  6. 365 };
  7. #define SECSPERHOUR (60*60)
  8. #define SECSPERDAY (SECSPERHOUR*24L)
  9. /****************************************
  10. * Return the number of seconds that have elapsed since the start
  11. * of 1970.
  12. * Input:
  13. * timer pointer to where to store result (or NULL)
  14. * Output:
  15. * *timer = result (unless timer == NULL)
  16. * Returns:
  17. * time
  18. */
  19. static long get_time(ah)
  20. {
  21. #asm
  22. #if !__FIRST_ARG_IN_AX__
  23. mov bx,sp
  24. mov ax,[bx+2]
  25. #endif
  26. mov ah,al
  27. int $21
  28. mov ax,dx
  29. mov dx,cx
  30. #endasm
  31. }
  32. time_t time(timer)
  33. time_t *timer;
  34. {
  35. unsigned day,month,year;
  36. long rv;
  37. time_t t;
  38. rv = get_time(0x2C);
  39. rv >>= 8; t = (rv & 0xFF);
  40. rv >>= 8; t += (rv & 0xFF)*60;
  41. rv >>= 8; t += (rv & 0xFF)*3600;
  42. rv = get_time(0x2A);
  43. day = (rv & 0xFF);
  44. rv >>= 8; month = (rv & 0xFF) -1;
  45. rv >>= 8; year = (rv & 0xFFFF) - 1970;
  46. if (month <= 1 || year & 3) /* if before Feb or not a leap year */
  47. day--; /* don't add day for this leap year */
  48. day += mdays[month]; /* day in year */
  49. day += (year + 3) >> 2; /* add a day for each leap year, but */
  50. /* don't worry about 2100 */
  51. t += ((year * 365L) + day) * SECSPERDAY;
  52. if (timer)
  53. *timer = t;
  54. return t;
  55. }