diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | lib.c | 17 |
2 files changed, 22 insertions, 4 deletions
@@ -1,5 +1,14 @@ 2011-10-24 Kaz Kylheku <kaz@kylheku.com> + 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 <kaz@kylheku.com> + * filter.c (function_filter): New function. (get_filter): Handle (fun ...) syntax. @@ -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; |