summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-06-09 19:37:51 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-06-09 19:37:51 -0700
commit2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd (patch)
tree8e6f8f294f2ec6e32171a71e5f04b4e0a847c1c0 /lib.c
parent3e1962283c934b374829667f693244e5d23ee25b (diff)
downloadtxr-2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd.tar.gz
txr-2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd.tar.bz2
txr-2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd.zip
* lib.c (match_str): Extended to suffix testing, with a negative
start argument. * txr.1: Documented.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c31
1 files changed, 23 insertions, 8 deletions
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)