Some substitutions require pretty expensive operations. So it make
sense to find out which are needed to begin with.
Signed-off-by: Johannes Schindelin <redacted>
---
interpolate.c | 20 ++++++++++++++++++++
interpolate.h | 2 ++
2 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/interpolate.c b/interpolate.c
index 6ef53f2..80eeb36 100644
--- a/interpolate.c
+++ b/interpolate.c
@@ -102,3 +102,23 @@ unsigned long interpolate(char *result, unsigned long reslen,
*dest = '\0';
return newlen;
}
+
+char *interp_find_active(const char *orig,
+ const struct interp *interps, int ninterps)
+{
+ char *result = xcalloc(1, ninterps);
+ char c;
+ int i;
+
+ while ((c = *(orig++)))
+ if (c == '%')
+ /* Try to match an interpolation string. */
+ for (i = 0; i < ninterps; i++)
+ if (!prefixcmp(orig, interps[i].name + 1)) {
+ result[i] = 1;
+ orig += strlen(interps[i].name + 1);
+ break;
+ }
+
+ return result;
+}diff --git a/interpolate.h b/interpolate.h
index 77407e6..2d197c5 100644
--- a/interpolate.h
+++ b/interpolate.h
@@ -22,5 +22,7 @@ extern void interp_clear_table(struct interp *table, int ninterps);
extern unsigned long interpolate(char *result, unsigned long reslen,
const char *orig,
const struct interp *interps, int ninterps);
+extern char *interp_find_active(const char *orig,
+ const struct interp *interps, int ninterps);
#endif /* INTERPOLATE_H */
--
1.5.3.5.1549.g91a3