From b7047da89e1dd49bf2b842dfaf4b43a2a1525d1d Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Tue, 11 Oct 2022 09:07:08 -0400 Subject: [PATCH] Allow user-defined substitutions of the form: %{name} or %*{name} that call subst_name. --- src/dosubst.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/dosubst.c b/src/dosubst.c index f68d654b..07611446 100644 --- a/src/dosubst.c +++ b/src/dosubst.c @@ -51,6 +51,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, int d, m, y; int tim = tt->ttime; int h, min, hh, ch, cmin, chh; + int i; char const *pm, *cpm; int tdiff, adiff, mdiff, hdiff; char const *mplu, *hplu, *when, *plu; @@ -224,6 +225,40 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, break; } } + if (c == '{') { + i = 0; + ss = s + snprintf(s, sizeof(s), "subst_"); + while (i < 64) { + c = ParseChar(p, &err, 0); + if (err) { + DBufFree(dbuf); + return err; + } + if (c == '}' || !c) { + break; + } + *ss++ = c; + *ss = 0; + i++; + } + if (UserFuncExists(s) != 3) { + continue; + } + snprintf(ss, sizeof(s) - (ss-s), "(%d,'%04d-%02d-%02d',%02d:%02d)", + altmode ? 1 : 0, y, m+1, d, h, min); + expr = (char const *) s; + r = EvalExpr(&expr, &v, NULL); + if (r == OK) { + if (!DoCoerce(STR_TYPE, &v)) { + if (DBufPuts(dbuf, v.v.str) != OK) { + DestroyValue(v); + return E_NO_MEM; + } + } + DestroyValue(v); + } + continue; + } done = 0; snprintf(uf, sizeof(uf), "subst_%c", c); if (UserFuncExists(uf) == 3) {