From 9a88f7da453eadc72d8f333700dbd80777feecd1 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 25 Feb 2018 14:33:19 +0100 Subject: Initial commit Signed-off-by: David Oberhollenzer --- lib/src/strexpand.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 lib/src/strexpand.c (limited to 'lib/src/strexpand.c') diff --git a/lib/src/strexpand.c b/lib/src/strexpand.c new file mode 100644 index 0000000..7e552eb --- /dev/null +++ b/lib/src/strexpand.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "util.h" + +char *strexpand(const char *inp, size_t argc, const char *const *argv) +{ + char *out, *dst; + const char *ptr; + size_t i, len; + + ptr = inp; + len = 0; + + while (*ptr != '\0') { + if (ptr[0] == '%' && isdigit(ptr[1])) { + i = ptr[1] - '0'; + if (i < argc) + len += strlen(argv[i]); + ptr += 2; + } else if (ptr[0] == '%' && ptr[1] == '%') { + ptr += 2; + len += 1; + } else { + ++ptr; + ++len; + } + } + + out = calloc(1, len + 1); + if (out == NULL) + return NULL; + + dst = out; + + while (*inp != '\0') { + if (inp[0] == '%' && isdigit(inp[1])) { + i = inp[1] - '0'; + if (i < argc) { + len = strlen(argv[i]); + memcpy(dst, argv[i], len); + dst += len; + } + inp += 2; + } else if (inp[0] == '%' && inp[1] == '%') { + *(dst++) = '%'; + inp += 2; + } else { + *(dst++) = *(inp++); + } + } + + return out; +} -- cgit v1.2.3