From 796f5a869e2330818f549ebec74f4b18e937f1c7 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Thu, 9 Apr 2020 21:58:10 -0400 Subject: Factor out templateURL --- archive.h | 4 ++-- html.c | 19 ++----------------- template.c | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/archive.h b/archive.h index 6cc7c5f..5a80748 100644 --- a/archive.h +++ b/archive.h @@ -59,7 +59,6 @@ static inline void envelopeFree(struct Envelope envelope) { } #define TEMPLATE(...) #__VA_ARGS__ -#define ESCAPE_URL_CAP(len) (3 * (len)) struct Variable { const char *name; @@ -73,8 +72,9 @@ int escapeXML(FILE *file, const char *str); int templateRender( FILE *file, const char *template, - const struct Variable *vars, EscapeFn *escape + const struct Variable vars[], EscapeFn *escape ); +char *templateURL(const char *template, const struct Variable vars[]); #define MBOX_HEADERS \ "Date Subject From Sender Reply-To To Cc Bcc " \ diff --git a/html.c b/html.c index 85b6f6b..e404434 100644 --- a/html.c +++ b/html.c @@ -14,7 +14,6 @@ * along with this program. If not, see . */ -#include #include #include #include @@ -50,21 +49,7 @@ int htmlEnvelope(FILE *file, const struct Envelope *envelope) { { "messageID", envelope->messageID }, {0}, }; - - size_t cap = sizeof(Mailto); - for (struct Variable *var = mailtoVars; var->value; ++var) { - cap += ESCAPE_URL_CAP(strlen(var->value)); - } - char *mailto = malloc(cap); - if (!mailto) err(EX_OSERR, "malloc"); - - FILE *url = fmemopen(mailto, cap, "w"); - if (!url) err(EX_OSERR, "fmemopen"); - - int error = 0 - || templateRender(url, Mailto, mailtoVars, escapeURL) - || fclose(url); - assert(!error); + char *mailto = templateURL(Mailto, mailtoVars); const char *from = envelope->from.name; if (!from) from = envelope->from.mailbox; @@ -84,7 +69,7 @@ int htmlEnvelope(FILE *file, const struct Envelope *envelope) { { "date", date }, {0}, }; - error = templateRender(file, Summary, summaryVars, escapeXML); + int error = templateRender(file, Summary, summaryVars, escapeXML); free(mailto); if (error) return error; diff --git a/template.c b/template.c index 92c6381..426f1d0 100644 --- a/template.c +++ b/template.c @@ -68,7 +68,7 @@ int escapeXML(FILE *file, const char *str) { int templateRender( FILE *file, const char *template, - const struct Variable *vars, EscapeFn *escape + const struct Variable vars[], EscapeFn *escape ) { for (bool subst = false; *template; subst ^= true) { size_t len = strcspn(template, "[]"); @@ -97,3 +97,21 @@ int templateRender( } return 0; } + +char *templateURL(const char *template, const struct Variable vars[]) { + size_t cap = 3 * strlen(template) + 1; + for (const struct Variable *var = vars; var->name; ++var) { + cap += 3 * strlen(var->value); + } + + char *buf = malloc(cap); + if (!buf) err(EX_OSERR, "malloc"); + + FILE *file = fmemopen(buf, cap, "w"); + if (!file) err(EX_OSERR, "fmemopen"); + + int error = templateRender(file, template, vars, escapeURL) || fclose(file); + assert(!error); + + return buf; +} -- cgit 1.4.1