summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-29 10:12:21 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-29 13:37:04 (EDT)
commitad183ca49b89ea7eef84872b30bebdcaf003f535 (patch)
tree965a361df72dd0131628915c07b5d7c31ae31cc1 /src
parentb7ac4e9e2da1e7d0832a12c3260f1b0b838d4fe7 (diff)
downloadatsign-ad183ca49b89ea7eef84872b30bebdcaf003f535.zip
atsign-ad183ca49b89ea7eef84872b30bebdcaf003f535.tar.gz
atsign-ad183ca49b89ea7eef84872b30bebdcaf003f535.tar.bz2
Move concatenation function
Diffstat (limited to 'src')
-rw-r--r--src/datetime.c51
-rw-r--r--src/datetime.h2
-rw-r--r--src/main.c52
3 files changed, 52 insertions, 53 deletions
diff --git a/src/datetime.c b/src/datetime.c
index 8597ea2..d01f5e1 100644
--- a/src/datetime.c
+++ b/src/datetime.c
@@ -19,12 +19,9 @@
#define _XOPEN_SOURCE
-#include <errno.h>
#include <limits.h>
-#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <time.h>
#include "datetime.h"
@@ -33,73 +30,31 @@ static const char *DATETIME_FMTS_[] = {
NULL
};
-static char *
-datetime_concat_args(int argc, const char *argv[])
-{
- int buf_l;
- int i;
- char *buf;
- int buf_i;
- int j;
-
- buf_l = 0;
- for (i = 0; i < argc; ++i) {
- buf_l += strlen(argv[i]) + 1;
- }
-
- 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) {
- for (j = 0; argv[i][j] != '\0'; ++j) {
- buf[buf_i++] = argv[i][j];
- }
- buf[buf_i++] = ' ';
- }
- buf[--buf_i] = '\0';
-
- return buf;
-}
-
int
-datetime_parse(int argc, const char *argv[], time_t *arg_sec)
+datetime_parse(const char *input, time_t *arg_sec)
{
- char *buf;
int i;
char *end;
struct tm arg_tm;
time_t now_sec;
struct tm *now_tm;
- buf = datetime_concat_args(argc, argv);
- if (buf == NULL) {
- return -1;
- }
-
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);
+ /* printf("%s =~ %s\n", input, DATETIME_FMTS_[i]); */
+ end = strptime(input, DATETIME_FMTS_[i], &arg_tm);
if (end != NULL && *end == '\0') {
goto found;
}
}
- free(buf);
fprintf(stderr, "Unknown date format\n");
return -1;
found:
- free(buf);
-
/* TODO: Support %a-only dates and optional years */
if (arg_tm.tm_mday == INT_MIN) {
/* No date specified; try today. */
diff --git a/src/datetime.h b/src/datetime.h
index e1ab3bf..f0523f9 100644
--- a/src/datetime.h
+++ b/src/datetime.h
@@ -21,6 +21,6 @@
#define DATETIME_H_
int
-datetime_parse(int argc, const char *argv[], time_t *arg_sec);
+datetime_parse(const char *input, time_t *arg_sec);
#endif /* DATETIME_H_ */
diff --git a/src/main.c b/src/main.c
index e6b9758..00e0ef7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -17,22 +17,66 @@
* along with @. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <errno.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <time.h>
#include <unistd.h>
#include "datetime.h"
+static char *
+_concat_args(int argc, const char *argv[])
+{
+ int buf_l;
+ int i;
+ char *buf;
+ int buf_i;
+ int j;
+
+ buf_l = 0;
+ for (i = 0; i < argc; ++i) {
+ buf_l += strlen(argv[i]) + 1;
+ }
+
+ 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) {
+ for (j = 0; argv[i][j] != '\0'; ++j) {
+ buf[buf_i++] = argv[i][j];
+ }
+ buf[buf_i++] = ' ';
+ }
+ buf[--buf_i] = '\0';
+
+ return buf;
+}
+
int
main(int argc, const char *argv[])
{
- time_t arg;
- time_t now;
- time_t dif;
+ char *buf;
+ time_t arg;
+ time_t now;
+ time_t dif;
+
+ buf = _concat_args(argc - 1, argv + 1);
+ if (buf == NULL) {
+ return -1;
+ }
- if (datetime_parse(argc - 1, argv + 1, &arg) < 0) {
+ if (datetime_parse(buf, &arg) < 0) {
+ free(buf);
return EXIT_FAILURE;
}
+ free(buf);
setvbuf(stdout, NULL, _IONBF, 0);
time(&now);