summaryrefslogtreecommitdiffstats
path: root/src/datetime.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-28 21:38:33 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-29 12:52:20 (EDT)
commitd15edf7f6132be7a3b580898dd67267a833a328d (patch)
treed8a3da3bab86502e24d215e8b38a5abee760046e /src/datetime.c
parent595e0bdc74f976aa399810139b4a7d77eeb71bee (diff)
downloadatsign-d15edf7f6132be7a3b580898dd67267a833a328d.zip
atsign-d15edf7f6132be7a3b580898dd67267a833a328d.tar.gz
atsign-d15edf7f6132be7a3b580898dd67267a833a328d.tar.bz2
Add loop, adjust datetime_parse() param and decls
Diffstat (limited to 'src/datetime.c')
-rw-r--r--src/datetime.c40
1 files changed, 24 insertions, 16 deletions
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;
}