summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/datetime.c40
-rw-r--r--src/datetime.h2
-rw-r--r--src/main.c22
3 files changed, 42 insertions, 22 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;
}
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
+#include <unistd.h>
#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;
}