diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-06-09 19:37:51 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-06-09 19:37:51 -0700 |
commit | 2ea6ca3ef8151d94d2a3f306a9035ae7ae001fcd (patch) | |
tree | 8e6f8f294f2ec6e32171a71e5f04b4e0a847c1c0 /lib.c | |
parent | 3e1962283c934b374829667f693244e5d23ee25b (diff) | |
download | txr-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.c | 31 |
1 files changed, 23 insertions, 8 deletions
@@ -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) |