# include "dgd.h"
# include <time.h>
# include <sys/time.h>
static struct timeval timeout;
/*
* NAME: P->time()
* DESCRIPTION: return the current time
*/
Uint P_time()
{
return (Uint) time((time_t *) NULL);
}
/*
* NAME: P->mtime()
* DESCRIPTION: return the current time in milliseconds
*/
Uint P_mtime(milli)
unsigned short *milli;
{
struct timeval time;
gettimeofday(&time, (struct timezone *) NULL);
*milli = time.tv_usec / 1000;
return (Uint) time.tv_sec;
}
/*
* NAME: P->ctime()
* DESCRIPTION: convert the given time to a string
*/
char *P_ctime(buf, t)
char *buf;
Uint t;
{
register int offset;
offset = 0;
for (offset = 0; t >= 2147397248L; t -= 883612800L, offset += 28) ;
memcpy(buf, ctime((time_t *) &t), 26);
if (offset != 0) {
long year;
year = strtol(buf + 20, (char **) NULL, 10) + offset;
if (year > 2100 ||
(year == 2100 && (buf[4] != 'J' || buf[5] != 'a') &&
(buf[4] != 'F' || (buf[8] == '2' && buf[9] == '9')))) {
/* 2100 is not a leap year */
t -= 378604800L;
offset += 12;
memcpy(buf, ctime((time_t *) &t), 26);
year = strtol(buf + 20, (char **) NULL, 10) + offset;
}
sprintf(buf + 20, "%ld\012", 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(t, mtime)
Uint t;
unsigned int mtime;
{
timeout.tv_sec = t;
timeout.tv_usec = mtime * 1000L;
}
/*
* NAME: P->timeout()
* DESCRIPTION: return TRUE if there is a timeout, FALSE otherwise
*/
bool P_timeout(t, mtime)
Uint *t;
unsigned short *mtime;
{
struct timeval time;
gettimeofday(&time, (struct timezone *) NULL);
*t = time.tv_sec;
*mtime = time.tv_usec / 1000;
if (timeout.tv_sec == 0) {
/* timer disabled */
return FALSE;
}
return (time.tv_sec > timeout.tv_sec ||
(time.tv_sec == timeout.tv_sec && time.tv_usec >= timeout.tv_usec));
}