From a065b5f6c8b01327dcf795c9fe8d745c627c960b Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 31 Aug 2021 21:16:20 -0400 Subject: datetime: Free fmt bufs when iterators reach end Simplifies caller code. --- diff --git a/src/datetime.c b/src/datetime.c index b139a48..87845b6 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -280,15 +280,13 @@ static int _datetime_strftime(const char *fmts[], const struct tm *tm, char **out, size_t *out_sz, char **buf, size_t *i) { - if (*buf == NULL) { + if (*i == 0) { *buf = calloc(strlen(fmts[0]), sizeof(**buf)); if (*buf == NULL) { fprintf(stderr, "Failed to allocate buffer: %s\n", strerror(errno)); return -1; } - } - if (*out == NULL) { *out_sz = strlen(fmts[0]); *out = calloc(*out_sz, sizeof(**out)); if (*out == NULL) { @@ -325,6 +323,12 @@ datetime_strftime_date(const struct tm *tm, char **out, size_t *out_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_DATE_FMTS_) / sizeof(DATETIME_DATE_FMTS_[0])){ + if (*out != NULL) { + free(*out); + } + if (*buf != NULL) { + free(*buf); + } return 0; } @@ -336,6 +340,12 @@ datetime_strftime_time(const struct tm *tm, char **out, size_t *out_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_TIME_FMTS_) / sizeof(DATETIME_TIME_FMTS_[0])){ + if (*out != NULL) { + free(*out); + } + if (*buf != NULL) { + free(*buf); + } return 0; } @@ -347,6 +357,12 @@ datetime_strftime_misc(const struct tm *tm, char **out, size_t *out_sz, char **buf, size_t *i) { if (*i >= sizeof(DATETIME_MISC_FMTS_) / sizeof(DATETIME_MISC_FMTS_[0])){ + if (*out != NULL) { + free(*out); + } + if (*buf != NULL) { + free(*buf); + } return 0; } diff --git a/src/main.c b/src/main.c index f450281..19b5334 100644 --- a/src/main.c +++ b/src/main.c @@ -92,49 +92,22 @@ _list_formats(void) tm = localtime(&tim); puts("Time formats:"); - out = NULL; - out_sz = 0; - buf = NULL; - i = 0; + i = 0; while (datetime_strftime_time(tm, &out, &out_sz, &buf, &i) > 0) { printf(" * %s\n", out); } - if (out != NULL) { - free(out); - } - if (buf != NULL) { - free(buf); - } puts("Date formats:"); - out = NULL; - out_sz = 0; - buf = NULL; - i = 0; + i = 0; while (datetime_strftime_date(tm, &out, &out_sz, &buf, &i) > 0) { printf(" * %s\n", out); } - if (out != NULL) { - free(out); - } - if (buf != NULL) { - free(buf); - } puts("Additional formats:"); - out = NULL; - out_sz = 0; - buf = NULL; - i = 0; + i = 0; while (datetime_strftime_misc(tm, &out, &out_sz, &buf, &i) > 0) { printf(" * %s\n", out); } - if (out != NULL) { - free(out); - } - if (buf != NULL) { - free(buf); - } } static void -- cgit v0.9.1