time-util.h revision e28b88ee83b47dc2257140600f491482704c7b79
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen#ifndef TIME_UTIL_H
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen#define TIME_UTIL_H
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen#include <sys/time.h> /* for struct timeval */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen/* Returns -1 if tv1<tv2, 1 if tv1>tv2, 0 if they're equal. */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen/* Same as timeval_cmp, but tv->usecs must differ by at least usec_margin */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenint timeval_cmp_margin(const struct timeval *tv1, const struct timeval *tv2,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen unsigned int usec_margin);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen/* Returns tv1-tv2 in milliseconds. */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen/* Returns tv1-tv2 in microseconds. */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen const struct timeval *tv2);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenstatic inline void
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainentimeval_add_msecs(struct timeval *tv, unsigned int msecs)
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen{
043c8a96a035379bcba04f487d58457beefdfcaaTimo Sirainen tv->tv_sec += msecs / 1000;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_usec += (msecs % 1000) * 1000;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen if (tv->tv_usec >= 1000000) {
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_sec++;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_usec -= 1000000;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen }
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen}
043c8a96a035379bcba04f487d58457beefdfcaaTimo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenstatic inline void
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainentimeval_sub_msecs(struct timeval *tv, unsigned int msecs)
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen{
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_sec -= msecs / 1000;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_usec -= (msecs % 1000) * 1000;
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen if (tv->tv_usec < 0) {
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen tv->tv_sec--;
043c8a96a035379bcba04f487d58457beefdfcaaTimo Sirainen tv->tv_usec += 1000000;
1ff487015234b23c32cf8bb4c9f8c02922535b8eTimo Sirainen }
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen}
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen/* Wrapper to strftime() */
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainenconst char *t_strflocaltime(const char *fmt, time_t t) ATTR_STRFTIME(1);
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen#endif
d96f86fb881c5b106649e8994ead1052acf24030Timo Sirainen