From fb96a3ee7732129d0ee475d7d8438aeffe39d80e Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 4 Mar 2012 18:34:13 -0800 Subject: * eval.c (eval_init): New intrinsic function, regsub. * regex.c (regsub): New function. * regex.h (regsub): Declared. * txr.1: Doc stub added. --- ChangeLog | 10 ++++++++++ eval.c | 1 + regex.c | 28 ++++++++++++++++++++++++++++ regex.h | 1 + txr.1 | 2 ++ 5 files changed, 42 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9accc1f8..a26863dd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-03-04 Kaz Kylheku + + * 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 * lib.c (split_str): Separator can be a regex now. 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 -- cgit v1.2.3