diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-10-03 20:06:41 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-10-03 20:06:41 -0700 |
commit | b74633f86d69cf1aabebe0b976d695b7a61bddc6 (patch) | |
tree | f20f6760810eaf33f2615a23284559ce3f5a668f /regex.c | |
parent | ebfe50c31d62d647b586619f56aa754971cfdf69 (diff) | |
download | txr-b74633f86d69cf1aabebe0b976d695b7a61bddc6.tar.gz txr-b74633f86d69cf1aabebe0b976d695b7a61bddc6.tar.bz2 txr-b74633f86d69cf1aabebe0b976d695b7a61bddc6.zip |
New function rra.
* regex.c (range_regex_all, regex_range_all): New functions.
(regex_init): Register rra intrinsic function.
* regex.c (range_regex_all, regex_range_all): Declared.
* txr.1: Documented rra.
Diffstat (limited to 'regex.c')
-rw-r--r-- | regex.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -2477,6 +2477,44 @@ val range_regex(val haystack, val needle_regex, val start, return result; } +val range_regex_all(val haystack, val needle_regex, val start, val end) +{ + list_collect_decl (out, ptail); + val slen = length_str(haystack); + + if (null_or_missing_p(start)) { + start = zero; + } else if (minusp(start)) { + start = minus(start, slen); + if (minusp(start)) + start = zero; + } + + if (null_or_missing_p(end)) { + end = slen; + } else if (minusp(end)) { + end = minus(start, slen); + if (minusp(end)) + return nil; + } + + for (;;) { + val range = range_regex(haystack, needle_regex, start, nil); + + if (!range) + break; + + ptail = list_collect(ptail, range); + + { + val rt = to(range); + start = if3(eql(start, rt), succ(start), rt); + } + } + + return out; +} + val match_regex(val str, val reg, val pos) { regex_machine_t regm; @@ -2823,6 +2861,17 @@ val regex_range_search(val regex, val arg1, val arg2, val arg3) } } +val regex_range_all(val regex, val arg1, val arg2, val arg3) +{ + if (missingp(arg2)) { + return range_regex_all(arg1, regex, zero, nil); + } else if (missingp(arg3)) { + return range_regex_all(arg2, regex, arg1, nil); + } else { + return range_regex_all(arg3, regex, arg1, arg2); + } +} + val read_until_match(val regex, val stream_in, val include_match_in) { regex_machine_t regm; @@ -3010,6 +3059,7 @@ void regex_init(void) reg_fun(intern(lit("r^"), user_package), func_n3o(regex_range_left, 2)); reg_fun(intern(lit("r$"), user_package), func_n3o(regex_range_right, 2)); reg_fun(intern(lit("rr"), user_package), func_n4o(regex_range_search, 2)); + reg_fun(intern(lit("rra"), user_package), func_n4o(regex_range_all, 2)); init_special_char_sets(); } |