From 28226fed7a52114efbd43860ef1ff7794ce88931 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sat, 28 Aug 2021 17:53:27 -0400 Subject: datetime: WIP --- 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 +#include +#include +#include +#include +#include +#include +#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 +#include +#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; } -- cgit v0.9.1