diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-10-24 23:48:54 -0400 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-10-24 23:48:54 -0400 |
commit | 689421c6a76223cae4d12e1fc897e2fcb46098e6 (patch) | |
tree | 0728fea297e86cff1ef59b46c1a701ed0bd1e95d /lib.c | |
parent | 77b9c8f289df7b0ba45668e09cdc040252c681c8 (diff) | |
download | txr-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.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -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; |