#include "mytime.h" #include #include #include #include #include bool fake_time; struct timespec global_time; struct timespec get_current_time() { if(fake_time) { return global_time; } struct timespec val; if(clock_gettime(CLOCK_REALTIME, &val) != 0) { abort(); } return val; } void enable_fake_time() { assert(!fake_time); global_time = (struct timespec){ .tv_sec = 0, .tv_nsec = 0, }; fake_time = true; } void progress_time(uint64_t diff) { assert(fake_time); // Right now the diff is only seconds resolution global_time.tv_sec += diff; } struct timespec time_from_double(double t) { double fraction; double integral; fraction = modf(t, &integral); return (struct timespec) { .tv_sec = integral, .tv_nsec = fraction * 1000000000.0, }; } struct formatted_time format_time(struct timespec time) { struct formatted_time res = {0}; struct tm tm; gmtime_r(&time.tv_sec, &tm); if(strftime(res.buf, 32, "%Y-%m-%d %H:%M:%S", &tm) >= 32) { abort(); } return res; } struct formatted_time format_duration(struct timespec time) { struct formatted_time res = {0}; int hours = time.tv_sec / 3600; int mins = (time.tv_sec % 3600) / 60; int secs = time.tv_sec % 60; if (hours > 0) { snprintf(res.buf, 32, "%dh %02dm %02ds", hours, mins, secs); } else if (mins > 0) { snprintf(res.buf, 32, "%dm %02ds", mins, secs); } else { snprintf(res.buf, 32, "%ds", secs); } return res; } struct timespec time_sub(const struct timespec *t1, const struct timespec *t2) { assert(t1); assert(t2); struct timespec diff = { .tv_sec = t1->tv_sec - t2->tv_sec, .tv_nsec = t1->tv_nsec - t2->tv_nsec }; if (diff.tv_nsec < 0) { diff.tv_nsec += 1000000000; diff.tv_sec--; } return diff; }