# include <OSUtils.h> # include <Events.h> # include "dgd.h" static unsigned long timediff; static unsigned long timeoffset; static long timeout; /* * NAME: tminit() * DESCRIPTION: initialize the time package */ void tminit(void) { static DateTimeRec ubirth = { 1970, 1, 1, 0, 0, 0, 0 }; unsigned long t; DateToSeconds(&ubirth, &timediff); GetDateTime(&t); timeoffset = t - timediff - TickCount() / 60; } /* * NAME: m2utime() * DESCRIPTION: convert Mac time to Unix time, will only work with * times up to 2040 */ Uint m2utime(long t) { return (Uint) (t - timediff); } /* * NAME: P->time() * DESCRIPTION: return the current time in seconds since midnight Jan 1, 1970 */ Uint P_time(void) { return timeoffset + TickCount() / 60; } /* * NAME: P->mtime() * DESCRIPTION: return the current time in milliseconds */ Uint P_mtime(milli) unsigned short *milli; { long t; t = TickCount(); *milli = t % 60 * 1667 / 100; return timeoffset + t / 60; } /* * NAME: P->ctime() * DESCRIPTION: convert a time to a string */ char *P_ctime(char *buf, Uint t) { static char *weekday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; DateTimeRec date; int offset; for (offset = 0; t + timediff > 2147397248L; t -= 883612800L, offset += 28) ; SecondsToDate((long) t + timediff, &date); if (offset != 0) { if (date.year + offset > 2100 || (date.year + offset == 2100 && (date.month > 2 || (date.month == 2 && date.day == 29)))) { t -= 378604800L; offset += 12; SecondsToDate((long) t + timediff, &date); } date.year += offset; } sprintf(buf, "%s %s %2d %02d:%02d:%02d %d\012", /* LF */ weekday[date.dayOfWeek - 1], month[date.month - 1], date.day, date.hour, date.minute, date.second, date.year); return buf; } /* * NAME: P->timer() * DESCRIPTION: set the timer to go off at some time in the future, or disable * it */ void P_timer(Uint t, unsigned int mtime) { if (t == 0) { timeout = 0; } else { timeout = (t - timeoffset) * 60 + mtime * 100L / 1667; if (timeout < 0) { timeout = 0; } } } /* * NAME: P->timeout() * DESCRIPTION: return TRUE if there is a timeout, FALSE otherwise */ bool P_timeout(Uint *t, unsigned short *mtime) { long time; time = TickCount(); *t = timeoffset + time / 60; *mtime = time % 60 * 1667 / 100; if (timeout == 0) { return FALSE; } return (timeout - time <= 0); }