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/datetime.c') 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; } -- cgit v0.9.1