From cbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 21 Sep 2016 21:14:13 -0700 Subject: 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. --- regex.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'regex.c') 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(®m, 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)); -- cgit v1.2.3