summaryrefslogtreecommitdiffstats
path: root/src/datetime.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-29 16:48:48 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-29 16:48:48 (EDT)
commit1609f11f494c2d4870857f47a87c0e1955fd43ba (patch)
tree6d65286ebfd74d9db0c9fb5d68ad7a34a97047fc /src/datetime.c
parent611f78ea5e38b9d7ba9a0208fdcd387c7ce4f47e (diff)
downloadatsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.zip
atsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.tar.gz
atsign-1609f11f494c2d4870857f47a87c0e1955fd43ba.tar.bz2
datetime: Support weekday-only dates
Diffstat (limited to 'src/datetime.c')
-rw-r--r--src/datetime.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/datetime.c b/src/datetime.c
index c98f27a..797e955 100644
--- a/src/datetime.c
+++ b/src/datetime.c
@@ -38,6 +38,7 @@ datetime_parse(const char *input, time_t *arg_sec)
struct tm arg_tm;
time_t now_sec;
struct tm *now_tm;
+ int wday;
for (i = 0; DATETIME_FMTS_[i] != NULL; ++i) {
arg_tm.tm_year = INT_MIN;
@@ -61,14 +62,14 @@ datetime_parse(const char *input, time_t *arg_sec)
if (arg_tm.tm_sec == INT_MIN) {
arg_tm.tm_sec = 0;
}
- /* TODO: Support %a-only dates */
- if (arg_tm.tm_mday == INT_MIN) {
+ if (arg_tm.tm_mday == INT_MIN && arg_tm.tm_wday == 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_tm.tm_wday = now_tm->tm_wday;
*arg_sec = mktime(&arg_tm);
if (*arg_sec <= mktime(now_tm)) {
/* Specified time already happened today; use tomorrow.
@@ -82,6 +83,21 @@ datetime_parse(const char *input, time_t *arg_sec)
arg_tm.tm_mday = now_tm->tm_mday;
*arg_sec = mktime(&arg_tm);
}
+ } else if (arg_tm.tm_mday == INT_MIN) {
+ /* Only a weekday specified; try tomorrow or next week. Uses
+ * same shortcut as above. */
+ wday = arg_tm.tm_wday;
+ 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_tm.tm_wday = now_tm->tm_wday;
+ if (wday <= now_tm->tm_wday) {
+ wday += 7;
+ }
+ *arg_sec = mktime(&arg_tm);
+ *arg_sec += (60 * 60 * 24) * (wday - now_tm->tm_wday);
} else if (arg_tm.tm_year == INT_MIN) {
/* No year specified; try this year. */
now_sec = time(NULL);