diff options
author | P. J. McDermott <pj@pehjota.net> | 2021-09-01 11:57:00 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2021-09-01 11:57:00 (EDT) |
commit | 469814149f1e2434740d6edd4944d150f368f464 (patch) | |
tree | 618d41f3c31624157a5f73605ef1252669814540 | |
parent | 2b87f0a5a8e7276618be024be334acbd2ddf54e7 (diff) | |
download | atsign-469814149f1e2434740d6edd4944d150f368f464.zip atsign-469814149f1e2434740d6edd4944d150f368f464.tar.gz atsign-469814149f1e2434740d6edd4944d150f368f464.tar.bz2 |
datetime: Collapse spaces after strftime()
Turns "Sep 1" into "Sep 1".
-rw-r--r-- | src/datetime.c | 49 | ||||
-rw-r--r-- | src/main.c | 8 |
2 files changed, 33 insertions, 24 deletions
diff --git a/src/datetime.c b/src/datetime.c index 87845b6..079266b 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -248,7 +248,7 @@ datetime_parse(const char *input, time_t *arg_sec) } static void -_datetime_copy_trim_fmt(char *buf, const char *fmt) +_datetime_copy_collapse(char *buf, const char *fmt) { int buf_i; int l; @@ -278,17 +278,19 @@ _datetime_copy_trim_fmt(char *buf, const char *fmt) static int _datetime_strftime(const char *fmts[], const struct tm *tm, char **out, - size_t *out_sz, char **buf, size_t *i) + size_t *buf_sz, char **buf, size_t *i) { + int resized; + if (*i == 0) { - *buf = calloc(strlen(fmts[0]), sizeof(**buf)); + *buf_sz = strlen(fmts[0]); + *buf = calloc(*buf_sz, sizeof(**buf)); if (*buf == NULL) { fprintf(stderr, "Failed to allocate buffer: %s\n", strerror(errno)); return -1; } - *out_sz = strlen(fmts[0]); - *out = calloc(*out_sz, sizeof(**out)); + *out = calloc(*buf_sz, sizeof(**out)); if (*out == NULL) { fprintf(stderr, "Failed to allocate buffer: %s\n", strerror(errno)); @@ -296,18 +298,22 @@ _datetime_strftime(const char *fmts[], const struct tm *tm, char **out, } } - *buf[0] = '\0'; - while (*buf[0] == '\0') { - _datetime_copy_trim_fmt(*buf, fmts[*i]); - ++*i; - } - + resized = 0; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" - while (strftime(*out, *out_sz, *buf, tm) == 0) { + while (strftime(*buf, *buf_sz, fmts[*i], tm) == 0) { #pragma GCC diagnostic pop - ++*out_sz; - *out = realloc(*out, *out_sz * sizeof(**out)); + ++*buf_sz; + *buf = realloc(*buf, *buf_sz * sizeof(**buf)); + if (*buf == NULL) { + fprintf(stderr, "Failed to allocate buffer: %s\n", + strerror(errno)); + return -1; + } + resized = 1; + } + if (resized > 0) { + *out = realloc(*out, *buf_sz * sizeof(**out)); if (*out == NULL) { fprintf(stderr, "Failed to allocate buffer: %s\n", strerror(errno)); @@ -315,11 +321,14 @@ _datetime_strftime(const char *fmts[], const struct tm *tm, char **out, } } + _datetime_copy_collapse(*out, *buf); + ++*i; + return 1; } int -datetime_strftime_date(const struct tm *tm, char **out, size_t *out_sz, +datetime_strftime_date(const struct tm *tm, char **out, size_t *buf_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_DATE_FMTS_) / sizeof(DATETIME_DATE_FMTS_[0])){ @@ -332,11 +341,11 @@ datetime_strftime_date(const struct tm *tm, char **out, size_t *out_sz, return 0; } - return _datetime_strftime(DATETIME_DATE_FMTS_, tm, out, out_sz, buf, i); + return _datetime_strftime(DATETIME_DATE_FMTS_, tm, out, buf_sz, buf, i); } int -datetime_strftime_time(const struct tm *tm, char **out, size_t *out_sz, +datetime_strftime_time(const struct tm *tm, char **out, size_t *buf_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_TIME_FMTS_) / sizeof(DATETIME_TIME_FMTS_[0])){ @@ -349,11 +358,11 @@ datetime_strftime_time(const struct tm *tm, char **out, size_t *out_sz, return 0; } - return _datetime_strftime(DATETIME_TIME_FMTS_, tm, out, out_sz, buf, i); + return _datetime_strftime(DATETIME_TIME_FMTS_, tm, out, buf_sz, buf, i); } int -datetime_strftime_misc(const struct tm *tm, char **out, size_t *out_sz, +datetime_strftime_misc(const struct tm *tm, char **out, size_t *buf_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_MISC_FMTS_) / sizeof(DATETIME_MISC_FMTS_[0])){ @@ -366,5 +375,5 @@ datetime_strftime_misc(const struct tm *tm, char **out, size_t *out_sz, return 0; } - return _datetime_strftime(DATETIME_MISC_FMTS_, tm, out, out_sz, buf, i); + return _datetime_strftime(DATETIME_MISC_FMTS_, tm, out, buf_sz, buf, i); } @@ -84,7 +84,7 @@ _list_formats(void) time_t tim; struct tm *tm; char *out; - size_t out_sz; + size_t buf_sz; char *buf; size_t i; @@ -93,19 +93,19 @@ _list_formats(void) puts("Time formats:"); i = 0; - while (datetime_strftime_time(tm, &out, &out_sz, &buf, &i) > 0) { + while (datetime_strftime_time(tm, &out, &buf_sz, &buf, &i) > 0) { printf(" * %s\n", out); } puts("Date formats:"); i = 0; - while (datetime_strftime_date(tm, &out, &out_sz, &buf, &i) > 0) { + while (datetime_strftime_date(tm, &out, &buf_sz, &buf, &i) > 0) { printf(" * %s\n", out); } puts("Additional formats:"); i = 0; - while (datetime_strftime_misc(tm, &out, &out_sz, &buf, &i) > 0) { + while (datetime_strftime_misc(tm, &out, &buf_sz, &buf, &i) > 0) { printf(" * %s\n", out); } } |