From 469814149f1e2434740d6edd4944d150f368f464 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Wed, 01 Sep 2021 11:57:00 -0400 Subject: datetime: Collapse spaces after strftime() Turns "Sep 1" into "Sep 1". --- 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); } diff --git a/src/main.c b/src/main.c index 19b5334..8e5d2f7 100644 --- a/src/main.c +++ b/src/main.c @@ -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); } } -- cgit v0.9.1