summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-10-24 23:48:54 -0400
committerKaz Kylheku <kaz@kylheku.com>2011-10-24 23:48:54 -0400
commit689421c6a76223cae4d12e1fc897e2fcb46098e6 (patch)
tree0728fea297e86cff1ef59b46c1a701ed0bd1e95d /lib.c
parent77b9c8f289df7b0ba45668e09cdc040252c681c8 (diff)
downloadtxr-689421c6a76223cae4d12e1fc897e2fcb46098e6.tar.gz
txr-689421c6a76223cae4d12e1fc897e2fcb46098e6.tar.bz2
txr-689421c6a76223cae4d12e1fc897e2fcb46098e6.zip
Bugs #34641, #34629.
* lib.c (search_str_tree): If multiple strings from the needle tree matching within within the haystack string, then take the leftmost match. If there are multiple matches at the same leftmost position, take the longest one.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib.c b/lib.c
index 064cb8ee..d5a6634a 100644
--- a/lib.c
+++ b/lib.c
@@ -1023,12 +1023,21 @@ val search_str_tree(val haystack, val tree, val start_num, val from_end)
if (result)
return cons(result, length_str(tree));
} else if (consp(tree)) {
- while (tree) {
+ val it = nil, minpos = nil, maxlen = nil;
+
+ for (; tree; tree = cdr(tree)) {
val result = search_str_tree(haystack, car(tree), start_num, from_end);
- if (result)
- return result;
- tree = cdr(tree);
+ if (result) {
+ cons_bind (pos, len, result);
+ if (!it || lt(pos, minpos) || (eq(pos, minpos) && gt(len, maxlen))) {
+ minpos = pos;
+ maxlen = len;
+ it = result;
+ }
+ }
}
+
+ return it;
}
return nil;