diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-01-26 23:42:20 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-01-26 23:42:20 -0800 |
commit | c150e646fa90409c412f07f59edbb897bdbb4997 (patch) | |
tree | b4c4cfb5a2a95d57f7049e97574bbcec8b3b70f5 | |
parent | eee670172cca986245006e1c9a4f32f7d0b60895 (diff) | |
download | txr-c150e646fa90409c412f07f59edbb897bdbb4997.tar.gz txr-c150e646fa90409c412f07f59edbb897bdbb4997.tar.bz2 txr-c150e646fa90409c412f07f59edbb897bdbb4997.zip |
* regex.c (match_regex_right): New function.
* regex.h (match_regex_right): Declared.
* eval.c (eval_init): Register match_regex_right as instrinsic.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | regex.c | 20 | ||||
-rw-r--r-- | regex.h | 1 |
4 files changed, 31 insertions, 0 deletions
@@ -1,5 +1,13 @@ 2014-01-26 Kaz Kylheku <kaz@kylheku.com> + * regex.c (match_regex_right): New function. + + * regex.h (match_regex_right): Declared. + + * eval.c (eval_init): Register match_regex_right as instrinsic. + +2014-01-26 Kaz Kylheku <kaz@kylheku.com> + Implementing more correct treatment of meta forms like @[...] and @(...) occurring in the TXR pattern language. @@ -2438,6 +2438,8 @@ void eval_init(void) reg_fun(intern(lit("regexp"), user_package), func_n1(regexp)); 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("match-regex-right"), user_package), + func_n3o(match_regex_right, 2)); reg_fun(intern(lit("regsub"), user_package), func_n3(regsub)); reg_fun(intern(lit("regex-parse"), user_package), func_n2o(regex_parse, 1)); @@ -1854,6 +1854,26 @@ val match_regex(val str, val reg, val pos) return nil; } +val match_regex_right(val str, val regex, val pos) +{ + val slen = length(str); + + if (!pos) + pos = zero; + + for (;;) { + cons_bind (from, len, search_regex(str, regex, pos, nil)); + + if (!from) + return nil; + + if (eql(plus(from, len), slen)) + return len; + + pos = plus(pos, one); + } +} + val regsub(val regex, val repl, val str) { list_collect_decl (out, ptail); @@ -31,6 +31,7 @@ val regex_compile(val regex, val error_stream); 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 match_regex_right(val str, val regex, val pos); val regsub(val regex, val repl, val str); void regex_init(void); |