summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datetime.c49
-rw-r--r--src/main.c8
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);
}
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);
}
}