diff options
-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); |