about summary refs log tree commit diff
path: root/template.c
diff options
context:
space:
mode:
authorC. McEnroe <june@causal.agency>2020-04-09 21:58:10 -0400
committerC. McEnroe <june@causal.agency>2020-04-09 21:58:10 -0400
commit796f5a869e2330818f549ebec74f4b18e937f1c7 (patch)
treed663b7f4eef2fce8fa0144f61482da3e24ebc3d1 /template.c
parentRender HTML To and Cc lists (diff)
downloadbubger-796f5a869e2330818f549ebec74f4b18e937f1c7.tar.gz
bubger-796f5a869e2330818f549ebec74f4b18e937f1c7.zip
Factor out templateURL
Diffstat (limited to 'template.c')
-rw-r--r--template.c20
1 files changed, 19 insertions, 1 deletions
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;
+}