From 7864acb3e7baaed37356562b7d74259d0cfa1d17 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 13 Mar 2012 18:35:52 -0700 Subject: * regex.c (regsub): the replacement argument can now be a function of one argument which maps the original piece of text matched by the regex to a replacement text. --- ChangeLog | 7 +++++++ regex.c | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ffccdb02..09356ae7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-03-13 Kaz Kylheku + + * regex.c (regsub): the replacement argument + can now be a function of one argument which maps + the original piece of text matched by the regex + to a replacement text. + 2012-03-13 Kaz Kylheku * stream.c (stdio_put_string, stdio_put_char, stdio_put_byte): Do not diff --git a/regex.c b/regex.c index 60f5cd2d..9d07f411 100644 --- a/regex.c +++ b/regex.c @@ -1728,6 +1728,7 @@ val regsub(val regex, val repl, val str) { list_collect_decl (out, ptail); val pos = zero; + val isfunc = functionp(repl); do { cons_bind (find, len, search_regex(str, regex, pos, nil)); @@ -1738,7 +1739,9 @@ val regsub(val regex, val repl, val str) break; } list_collect(ptail, sub_str(str, pos, find)); - list_collect(ptail, repl); + list_collect(ptail, if3(isfunc, + funcall1(repl, sub_str(str, find, plus(find, len))), + repl)); if (len == zero && eql(find, pos)) { if (lt(pos, length_str(str))) { list_collect(ptail, chr_str(str, pos)); -- cgit v1.2.3