diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | regex.c | 28 | ||||
-rw-r--r-- | regex.h | 1 | ||||
-rw-r--r-- | txr.1 | 2 |
5 files changed, 42 insertions, 0 deletions
@@ -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> @@ -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)); @@ -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); +} @@ -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); @@ -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 |