From 689421c6a76223cae4d12e1fc897e2fcb46098e6 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 24 Oct 2011 23:48:54 -0400 Subject: 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. --- ChangeLog | 9 +++++++++ lib.c | 17 +++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index f4d66b63..564268e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-10-24 Kaz Kylheku + + 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. + 2011-10-24 Kaz Kylheku * filter.c (function_filter): New function. 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; -- cgit v1.2.3