/*
* File Name: timehelp.c
* Author: Jade Cheng
* Date: March 29, 2009
* Course: ICS 451
* Assignment: Project 2
*/
#include "common.h"
#include "timehelp.h"
static timeval time_normalize(timeval tv);
/* ------------------------------------------------------------------------ */
extern timeval time_add(timeval time1, timeval time2)
{
timeval tv;
/* Normalize the result from the addition and return it. */
tv.tv_sec = time1.tv_sec + time2.tv_sec;
tv.tv_usec = time1.tv_usec + time2.tv_usec;
return time_normalize(tv);
}
/* ------------------------------------------------------------------------ */
extern int time_cmp(timeval time1, timeval time2)
{
/* Don't trust the times coming in. */
time1 = time_normalize(time1);
time2 = time_normalize(time2);
/* Returns something like strcmp. */
if (time1.tv_sec > time2.tv_sec)
return 1;
if (time1.tv_sec < time2.tv_sec)
return -1;
if (time1.tv_usec > time2.tv_usec)
return 1;
if (time1.tv_usec < time2.tv_usec)
return -1;
return 0;
}
/* ------------------------------------------------------------------------ */
extern timeval time_now(void)
{
timeval tv;
gettimeofday(&tv, NULL);
return tv;
}
/* ------------------------------------------------------------------------ */
extern timeval time_seconds(int seconds)
{
timeval tv;
tv.tv_sec = seconds;
tv.tv_usec = 0;
return tv;
}
/* ------------------------------------------------------------------------ */
extern timeval time_sub(timeval time1, timeval time2)
{
timeval tv;
/* Normalize the result from the subtraction and return it. */
tv.tv_sec = time1.tv_sec - time2.tv_sec;
tv.tv_usec = time1.tv_usec - time2.tv_usec;
return time_normalize(tv);
}
/* ------------------------------------------------------------------------ */
/**
* Normalizes and returns a time value. A normalized time value is a time
* value with 0 <= microseconds <= 1000000.
*
* @param tv The source time value.
*
* @return A normalized time value.
*/
static timeval time_normalize(timeval tv)
{
while (tv.tv_usec < 0) {
tv.tv_usec += 1000000;
tv.tv_sec--;
}
while (tv.tv_usec > 1000000) {
tv.tv_usec -= 1000000;
tv.tv_sec++;
}
return tv;
}