}
+static char *func_subst (const char *filename, unsigned long line_no, char *input) {
+
+ char *src, *dst, *new_body, *old_body, *p;
+ unsigned long size, pos, l, dst_len, src_len;
+
+ (void) filename;
+ (void) line_no;
+
+ src = input;
+
+ if (!(dst = strstr (src, ",")) || !dst[0]) {
+ return 0;
+ }
+
+ *dst++ = 0;
+
+ if (!(old_body = strstr (dst, ",")) || !old_body[0]) {
+ return 0;
+ }
+
+ *old_body++ = 0;
+
+ size = 16 + strlen (old_body);
+ new_body = xmalloc (size);
+
+ dst_len = strlen (dst);
+ src_len = strlen (src);
+
+ pos = 0;
+
+ while (*old_body) {
+
+ if ((p = strstr (old_body, src))) {
+
+ l = p - old_body;
+
+ if (l + dst_len + 1 >= size - pos) {
+
+ size += l + dst_len + 1 + strlen (old_body);
+ new_body = xrealloc (new_body, size);
+
+ }
+
+ memcpy (new_body + pos, old_body, l);
+ pos += l;
+
+ memcpy (new_body + pos, dst, dst_len + 1);
+ pos += dst_len;
+
+ old_body = p + src_len;
+
+ } else {
+
+ if (strlen (old_body) >= size - pos) {
+
+ size += strlen (old_body) + size - pos + 1;
+ new_body = xrealloc (new_body, size);
+
+ }
+
+ memcpy (new_body + pos, old_body, strlen (old_body) + 1);
+ break;
+
+ }
+
+ }
+
+ return new_body;
+
+}
+
#if defined (_WIN32) || defined (__WIN32__)
# include <windows.h>
static char *internal_commands[] = {
#endif
{ "eval", &func_eval },
+ { "subst", &func_subst },
+
{ 0, 0 }
};