summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--eval.c1
-rw-r--r--regex.c28
-rw-r--r--regex.h1
-rw-r--r--txr.12
5 files changed, 42 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9accc1f8..a26863dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+ * eval.c (eval_init): New intrinsic function, regsub.
+
+ * regex.c (regsub): New function.
+
+ * regex.h (regsub): Declared.
+
+ * txr.1: Doc stub added.
+
+2012-03-04 Kaz Kylheku <kaz@kylheku.com>
+
* lib.c (split_str): Separator can be a regex now.
2012-03-04 Kaz Kylheku <kaz@kylheku.com>
diff --git a/eval.c b/eval.c
index 76985a67..0a9f9765 100644
--- a/eval.c
+++ b/eval.c
@@ -2178,6 +2178,7 @@ void eval_init(void)
reg_fun(intern(lit("search-regex"), user_package), func_n4o(search_regex, 2));
reg_fun(intern(lit("match-regex"), user_package), func_n3o(match_regex, 2));
+ reg_fun(intern(lit("regsub"), user_package), func_n3(regsub));
reg_fun(intern(lit("make-hash"), user_package), func_n3(make_hash));
reg_fun(intern(lit("hash"), user_package), func_n0v(hashv));
diff --git a/regex.c b/regex.c
index 2ad5a5cb..6c2a914d 100644
--- a/regex.c
+++ b/regex.c
@@ -1723,3 +1723,31 @@ val match_regex(val str, val reg, val pos)
return nil;
}
+
+val regsub(val str, val regex, val repl)
+{
+ list_collect_decl (out, ptail);
+ val pos = zero;
+
+ do {
+ cons_bind (find, len, search_regex(str, regex, pos, nil));
+ if (!find) {
+ if (pos == zero)
+ return str;
+ list_collect(ptail, sub_str(str, pos, nil));
+ break;
+ }
+ list_collect(ptail, sub_str(str, pos, find));
+ list_collect(ptail, repl);
+ if (len == zero && eql(find, pos)) {
+ if (lt(pos, length_str(str))) {
+ list_collect(ptail, chr_str(str, pos));
+ pos = plus(pos, one);
+ }
+ } else {
+ pos = plus(find, len);
+ }
+ } while (lt(pos, length_str(str)));
+
+ return cat_str(out, nil);
+}
diff --git a/regex.h b/regex.h
index c983142a..a5911790 100644
--- a/regex.h
+++ b/regex.h
@@ -28,3 +28,4 @@ val regex_compile(val regex_sexp);
val regexp(val);
val search_regex(val haystack, val needle_regex, val start_num, val from_end);
val match_regex(val str, val regex, val pos);
+val regsub(val str, val regex, val repl);
diff --git a/txr.1 b/txr.1
index f5f9fbbe..070960ba 100644
--- a/txr.1
+++ b/txr.1
@@ -6518,6 +6518,8 @@ Certain object types have a custom equal function.
.SS Functions search-regex and match-regex
+.SS Function regsub
+
.SS Functions make-hash, hash
.SS Function sethash