diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-09-21 21:14:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-09-21 21:14:13 -0700 |
commit | cbe8ab16302c0224c2e90dc0dd28e64e80b3fe2b (patch) | |
tree | c23e5679559579ffd2f6dbd30983a45e17e9c80a /regex.c | |
parent | 9f039218345989a770322611704c3d7ff9a76a12 (diff) | |
download | txr-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.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -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)); |