summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--lib.c17
2 files changed, 22 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index f4d66b63..564268e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
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;