summaryrefslogtreecommitdiffstats
path: root/src/datetime.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2022-03-22 18:46:20 (EDT)
committer P. J. McDermott <pj@pehjota.net>2022-03-22 18:46:20 (EDT)
commit50d117cb76883735faa8864c4978b5819cb167bd (patch)
tree4a3e2b44e66064dfffc7dc75e8fd70c954830be6 /src/datetime.c
parente75ef778d29de6a66373dad8fdda32d33f0c9f52 (diff)
downloadatsign-50d117cb76883735faa8864c4978b5819cb167bd.zip
atsign-50d117cb76883735faa8864c4978b5819cb167bd.tar.gz
atsign-50d117cb76883735faa8864c4978b5819cb167bd.tar.bz2
datetime, formats: Conform to strptime() space req
Diffstat (limited to 'src/datetime.c')
-rw-r--r--src/datetime.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/src/datetime.c b/src/datetime.c
index 8f5051d..f7cdb89 100644
--- a/src/datetime.c
+++ b/src/datetime.c
@@ -43,6 +43,31 @@ static struct tm DATETIME_EPOCH_ = {
};
static void
+_datetime_buf_cpy_p(char *dst, const char *src)
+{
+ for (; *src != '\0'; ++src, ++dst) {
+ if (*src == '^') {
+ *dst = ' ';
+ } else {
+ *dst = *src;
+ }
+ }
+ *dst = '\0';
+}
+
+static void
+_datetime_buf_cpy_f(char *dst, const char *src)
+{
+ for (; *src != '\0'; ++src, ++dst) {
+ if (*src == '^') {
+ ++src;
+ }
+ *dst = *src;
+ }
+ *dst = '\0';
+}
+
+static void
_datetime_reset_tm(struct tm *tm)
{
tm->tm_year = INT_MIN;
@@ -142,7 +167,7 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec)
sec = *arg_sec; /* GCC is dumb. */
got = false;
for (t = 0; t < sizeof(FORMATS_TIME) / sizeof(FORMATS_TIME[0]) ; ++t) {
- memcpy(fmt_buf, FORMATS_TIME[t], time_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf, FORMATS_TIME[t]);
_datetime_reset_tm(&arg_tm);
end = strptime(input, fmt_buf, &arg_tm);
if (end != NULL && *end == '\0') {
@@ -159,11 +184,11 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec)
if (FORMATS_DATE[d][0] == '\0') {
break;
}
- memcpy(fmt_buf, FORMATS_DATE[d], date_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf, FORMATS_DATE[d]);
for (t = 0; t < sizeof(FORMATS_TIME) / sizeof(FORMATS_TIME[0]);
++t) {
- memcpy(fmt_buf + date_fmt_len, FORMATS_TIME[t],
- time_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf + date_fmt_len,
+ FORMATS_TIME[t]);
_datetime_reset_tm(&arg_tm);
end = strptime(input, fmt_buf, &arg_tm);
if (end != NULL && *end == '\0') {
@@ -178,14 +203,14 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec)
}
}
for (t = 0; t < sizeof(FORMATS_TIME) / sizeof(FORMATS_TIME[0]); ++t) {
- memcpy(fmt_buf, FORMATS_TIME[t], time_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf, FORMATS_TIME[t]);
for (d = 0; d < sizeof(FORMATS_DATE) / sizeof(FORMATS_DATE[0]);
++d) {
if (FORMATS_DATE[d][0] == '\0') {
break;
}
- memcpy(fmt_buf + time_fmt_len, FORMATS_DATE[d],
- date_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf + time_fmt_len,
+ FORMATS_DATE[d]);
_datetime_reset_tm(&arg_tm);
end = strptime(input, fmt_buf, &arg_tm);
if (end != NULL && *end == '\0') {
@@ -200,7 +225,7 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec)
}
}
for (d = 0; d < sizeof(FORMATS_MISC) / sizeof(FORMATS_MISC[0]) ; ++d) {
- memcpy(fmt_buf, FORMATS_MISC[d], misc_fmt_len + 1);
+ _datetime_buf_cpy_p(fmt_buf, FORMATS_MISC[d]);
_datetime_reset_tm(&arg_tm);
end = strptime(input, fmt_buf, &arg_tm);
if (end != NULL && *end == '\0') {
@@ -280,10 +305,12 @@ _datetime_strftime(const char *fmts[], const struct tm *tm, char **out,
++*i;
}
+ _datetime_buf_cpy_f(*out, fmts[*i]);
+
resized = 0;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
- while (strftime(*buf, *buf_sz, fmts[*i], tm) == 0) {
+ while (strftime(*buf, *buf_sz, *out, tm) == 0) {
#pragma GCC diagnostic pop
++*buf_sz;
*buf = realloc(*buf, *buf_sz * sizeof(**buf));