summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-28 17:53:27 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-29 12:40:53 (EDT)
commit28226fed7a52114efbd43860ef1ff7794ce88931 (patch)
tree537214f4e2bab9c9a4136380a272733835b6361a
parent21e7e051b8c14d764bb283da59d8c04fb336ed77 (diff)
downloadatsign-28226fed7a52114efbd43860ef1ff7794ce88931.zip
atsign-28226fed7a52114efbd43860ef1ff7794ce88931.tar.gz
atsign-28226fed7a52114efbd43860ef1ff7794ce88931.tar.bz2
datetime: WIP
-rw-r--r--src/datetime.c104
-rw-r--r--src/datetime.h4
-rw-r--r--src/local.mk2
-rw-r--r--src/main.c11
4 files changed, 121 insertions, 0 deletions
diff --git a/src/datetime.c b/src/datetime.c
new file mode 100644
index 0000000..f39f80c
--- /dev/null
+++ b/src/datetime.c
@@ -0,0 +1,104 @@
+#define _XOPEN_SOURCE
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "datetime.h"
+
+static const char *DATETIME_FMTS_[] = {
+ "%H:%M:%S",
+ "%I:%M:%S %p",
+ "%H:%M",
+ "%Y-%m-%dT%H:%M:%S",
+ "%Y-%m-%d %H:%M:%S",
+ "%A %B %d, %Y %H:%M:%S",
+ NULL
+};
+
+static char *
+datetime_normalize_spacing(int argc, const char *argv[])
+{
+ int buf_l;
+ int i;
+ int l;
+ bool was_space;
+ int j;
+ char *buf;
+ int buf_i;
+
+ buf_l = 0;
+ for (i = 0; i < argc; ++i) {
+ l = strlen(argv[i]);
+ was_space = true;
+ for (j = 0; j < l; ++j) {
+ if (isspace(argv[i][j]) != 0) {
+ if (was_space == false) {
+ buf_l++;
+ was_space = true;
+ }
+ } else {
+ buf_l++;
+ was_space = false;
+ }
+ }
+ ++buf_l;
+ }
+
+ buf = calloc(buf_l, sizeof(*buf));
+ if (buf == NULL) {
+ fprintf(stderr, "Failed to allocate buffer: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+
+ buf_i = 0;
+ for (i = 0; i < argc; ++i) {
+ l = strlen(argv[i]);
+ was_space = true;
+ for (j = 0; j < l; ++j) {
+ if (isspace(argv[i][j]) != 0) {
+ if (was_space == false) {
+ buf[buf_i++] = ' ';
+ was_space = true;
+ }
+ } else {
+ buf[buf_i++] = argv[i][j];
+ was_space = false;
+ }
+ }
+ buf[buf_i++] = ' ';
+ }
+ buf[--buf_i] = '\0';
+
+ return buf;
+}
+
+int
+datetime_parse(int argc, const char *argv[], struct tm *tm)
+{
+ int e = -1;
+ char *buf;
+ int i;
+ char *end;
+
+ buf = datetime_normalize_spacing(argc, argv);
+ if (buf == NULL) {
+ return -1;
+ }
+
+ for (i = 0; DATETIME_FMTS_[i] != NULL; ++i) {
+ printf("%s =~ %s\n", buf, DATETIME_FMTS_[i]);
+ end = strptime(buf, DATETIME_FMTS_[i], tm);
+ if (end != NULL && *end == '\0') {
+ e = 0;
+ break;
+ }
+ }
+
+ free(buf);
+ return e;
+}
diff --git a/src/datetime.h b/src/datetime.h
new file mode 100644
index 0000000..562b377
--- /dev/null
+++ b/src/datetime.h
@@ -0,0 +1,4 @@
+
+int
+datetime_parse(int argc, const char *argv[], struct tm *tm);
+
diff --git a/src/local.mk b/src/local.mk
index 51037fb..0882580 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -1,2 +1,4 @@
@_SOURCES += \
+ %reldir%/datetime.c \
+ %reldir%/datetime.h \
%reldir%/main.c
diff --git a/src/main.c b/src/main.c
index 71f0d9b..62e00dd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,5 +1,16 @@
+#include <stdio.h>
+#include <time.h>
+#include "datetime.h"
+
int
main(int argc, char *argv[])
{
+ struct tm tm;
+
+ datetime_parse(argc - 1, argv + 1, &tm);
+ 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);
+
return 0;
}