summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-03-13 18:35:52 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-03-13 18:35:52 -0700
commit7864acb3e7baaed37356562b7d74259d0cfa1d17 (patch)
tree6161c358f26fabd59fc5ad7ee5e56cbbcedb0ecf /regex.c
parentf35f559b7ed6455af72b995a2cacd19d44cf32fd (diff)
downloadtxr-7864acb3e7baaed37356562b7d74259d0cfa1d17.tar.gz
txr-7864acb3e7baaed37356562b7d74259d0cfa1d17.tar.bz2
txr-7864acb3e7baaed37356562b7d74259d0cfa1d17.zip
* 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.
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c5
1 files changed, 4 insertions, 1 deletions
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));