From 2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 9 Jun 2014 19:37:51 -0700 Subject: * lib.c (match_str): Extended to suffix testing, with a negative start argument. * txr.1: Documented. --- lib.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index d46ab2e6..b0118f45 100644 --- a/lib.c +++ b/lib.c @@ -2077,15 +2077,30 @@ val match_str(val bigstr, val str, val pos) pos = default_arg(pos, zero); - for (i = zero; - length_str_gt(bigstr, p = plus(pos, i)) && length_str_gt(str, i); - i = plus(i, one)) - { - if (chr_str(bigstr, p) != chr_str(str, i)) - return nil; - } + if (ge(pos, zero)) { + for (i = zero; + length_str_gt(bigstr, p = plus(pos, i)) && length_str_gt(str, i); + i = plus(i, one)) + { + if (chr_str(bigstr, p) != chr_str(str, i)) + return nil; + } - return length_str_le(str, i) ? t : nil; + return length_str_le(str, i) ? t : nil; + } else { + pos = plus(pos, length(bigstr)); + pos = plus(minus(pos, length(str)), one); + + for (i = minus(length(str), one); + ge(i, zero) && ge(p = plus(pos, i), zero); + i = minus(i, one)) + { + if (chr_str(bigstr, p) != chr_str(str, i)) + return nil; + } + + return lt(i, zero) ? t : nil; + } } val match_str_tree(val bigstr, val tree, val pos) -- cgit v1.2.3