summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-09-21 21:14:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-09-21 21:14:13 -0700
commitcbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b (patch)
treec23e5679559579ffd2f6dbd30983a45e17e9c80a /regex.c
parent9f039218345989a770322611704c3d7ff9a76a12 (diff)
downloadtxr-cbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b.tar.gz
txr-cbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b.tar.bz2
txr-cbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b.zip
Support negative positions in regex matching funs.
* regex.c (match_regex, match_regex_right): Detect a negative start or end position, respectively, and add the string length to it. If it is still negative, bail with nil. * txr.1: Documented.
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/regex.c b/regex.c
index 2930e2e9..c7a5e132 100644
--- a/regex.c
+++ b/regex.c
@@ -2464,7 +2464,13 @@ val match_regex(val str, val reg, val pos)
val i, retval;
regm_result_t last_res = REGM_INCOMPLETE;
- pos = default_arg(pos, zero);
+ if (null_or_missing_p(pos)) {
+ pos = zero;
+ } else if (lt(pos, zero)) {
+ pos = plus(pos, length_str(str));
+ if (lt(pos, zero))
+ return nil;
+ }
regex_machine_init(&regm, reg);
@@ -2497,6 +2503,8 @@ val match_regex_right(val str, val regex, val end)
if (null_or_missing_p(end) || gt(end, slen))
end = slen;
+ else if (lt(end, zero))
+ end = plus(end, slen);
while (le(pos, end)) {
cons_bind (from, len, search_regex(str, regex, pos, nil));