From d15edf7f6132be7a3b580898dd67267a833a328d Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sat, 28 Aug 2021 21:38:33 -0400 Subject: Add loop, adjust datetime_parse() param and decls --- (limited to 'src') diff --git a/src/datetime.c b/src/datetime.c index 8ceed11..8597ea2 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -67,12 +67,12 @@ datetime_concat_args(int argc, const char *argv[]) } int -datetime_parse(int argc, const char *argv[], struct tm *arg_tm) +datetime_parse(int argc, const char *argv[], time_t *arg_sec) { char *buf; int i; char *end; - time_t arg_sec; + struct tm arg_tm; time_t now_sec; struct tm *now_tm; @@ -81,12 +81,13 @@ datetime_parse(int argc, const char *argv[], struct tm *arg_tm) return -1; } - arg_tm->tm_mday = INT_MIN; /* Sentinel */ - arg_tm->tm_sec = 0; /* Default */ + arg_tm.tm_mday = INT_MIN; /* Sentinel */ + arg_tm.tm_sec = 0; /* Default */ + arg_tm.tm_isdst = -1; for (i = 0; DATETIME_FMTS_[i] != NULL; ++i) { /* printf("%s =~ %s\n", buf, DATETIME_FMTS_[i]); */ - end = strptime(buf, DATETIME_FMTS_[i], arg_tm); + end = strptime(buf, DATETIME_FMTS_[i], &arg_tm); if (end != NULL && *end == '\0') { goto found; } @@ -100,26 +101,33 @@ datetime_parse(int argc, const char *argv[], struct tm *arg_tm) free(buf); /* TODO: Support %a-only dates and optional years */ - if (arg_tm->tm_mday == INT_MIN) { + if (arg_tm.tm_mday == INT_MIN) { /* No date specified; try today. */ now_sec = time(NULL); now_tm = localtime(&now_sec); - arg_tm->tm_year = now_tm->tm_year; - arg_tm->tm_mon = now_tm->tm_mon; - arg_tm->tm_mday = now_tm->tm_mday; - arg_sec = mktime(arg_tm); - if (arg_sec <= mktime(now_tm)) { + arg_tm.tm_year = now_tm->tm_year; + arg_tm.tm_mon = now_tm->tm_mon; + arg_tm.tm_mday = now_tm->tm_mday; + *arg_sec = mktime(&arg_tm); + if (*arg_sec <= mktime(now_tm)) { /* Specified time already happened today; use tomorrow. * Adding the number of seconds in a day is a shortcut * that ignores leap seconds. One better method would * be to increment tm_mday % days in tm_mon, etc. */ - arg_sec += 60 * 60 * 24; - now_tm = localtime(&arg_sec); - arg_tm->tm_year = now_tm->tm_year; - arg_tm->tm_mon = now_tm->tm_mon; - arg_tm->tm_mday = now_tm->tm_mday; + *arg_sec += 60 * 60 * 24; + now_tm = localtime(arg_sec); + arg_tm.tm_year = now_tm->tm_year; + arg_tm.tm_mon = now_tm->tm_mon; + arg_tm.tm_mday = now_tm->tm_mday; + *arg_sec = mktime(&arg_tm); } + } else { + *arg_sec = mktime(&arg_tm); } + printf("%d-%02d-%02dT%02d:%02d:%02d\n", arg_tm.tm_year + 1900, + arg_tm.tm_mon + 1, arg_tm.tm_mday, + arg_tm.tm_hour, arg_tm.tm_min, arg_tm.tm_sec); + return 0; } diff --git a/src/datetime.h b/src/datetime.h index 057bc4b..e1ab3bf 100644 --- a/src/datetime.h +++ b/src/datetime.h @@ -21,6 +21,6 @@ #define DATETIME_H_ int -datetime_parse(int argc, const char *argv[], struct tm *tm); +datetime_parse(int argc, const char *argv[], time_t *arg_sec); #endif /* DATETIME_H_ */ diff --git a/src/main.c b/src/main.c index 45f260f..8aa97a2 100644 --- a/src/main.c +++ b/src/main.c @@ -20,20 +20,32 @@ #include #include #include +#include #include "datetime.h" int main(int argc, const char *argv[]) { - struct tm tm; + time_t arg; + time_t now; + time_t dif; - if (datetime_parse(argc - 1, argv + 1, &tm) < 0) { + if (datetime_parse(argc - 1, argv + 1, &arg) < 0) { return EXIT_FAILURE; } - printf("%d-%02d-%02dT%02d:%02d:%02d\n", - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); + setvbuf(stdout, NULL, _IONBF, 0); + time(&now); + while (arg > now) { + dif = arg - now; + printf("\r%02d:%02d:%02d", + (int) dif / 60 / 60, + (int) dif / 60 % 60, + (int) dif % 60); + sleep(1); + time(&now); + } + puts(""); return EXIT_SUCCESS; } -- cgit v0.9.1