]> git.neil.brown.name Git - edlib.git/commitdiff
Fix search bug: not finding longest match.
authorNeilBrown <neil@brown.name>
Wed, 2 Dec 2015 09:44:59 +0000 (20:44 +1100)
committerNeilBrown <neil@brown.name>
Wed, 2 Dec 2015 09:44:59 +0000 (20:44 +1100)
We need to keep going while we have a partial match (len=-1)
and record the last good match.

Signed-off-by: NeilBrown <neil@brown.name>
lib-search.c
rexel.c

index 26d3a287dd2076ae929c4c5dba1ababc5db2c848..64148a23e1c5f3d7d24e4f8bef2598cfb6d93ae8 100644 (file)
@@ -14,7 +14,7 @@
 
 DEF_CMD(text_search)
 {
-       struct mark *m;
+       struct mark *m, *endmark = NULL;;
        struct doc *d;
        unsigned short *rxl;
        struct match_state *st;
@@ -32,19 +32,24 @@ DEF_CMD(text_search)
                return -1;
        st = rxl_prepare(rxl);
        since_start = -1;
-       while (since_start < 0 || len > 0) {
+       while (since_start < 0 || len != -2) {
                wint_t wch = mark_next(d, m);
                if (wch == WEOF)
                        break;
-               if (since_start >= 0)
-                       since_start += 1;
+
                len = rxl_advance(st, wch, 0, since_start < 0);
                if (len >= 0 &&
-                   (since_start < 0 || len > since_start))
+                   (since_start < 0 || len > since_start)) {
                        since_start = len;
+                       if (endmark)
+                               mark_free(endmark);
+                       endmark = mark_dup(m, 1);
+               }
+       }
+       if (since_start > 0 && endmark) {
+               mark_to_mark(m, endmark);
+               mark_free(endmark);
        }
-       if (since_start > 0)
-               mark_prev(d, m);
        ci->extra = since_start;
        rxl_free_state(st);
        free(rxl);
diff --git a/rexel.c b/rexel.c
index a1e7d471e2f2a085459c03f13ecb2b45ddc66057..36d53c2c37f371ab6f5474ab7af9f5b41295354a 100644 (file)
--- a/rexel.c
+++ b/rexel.c
@@ -265,7 +265,6 @@ static int set_match(struct match_state *st, unsigned short addr, wchar_t ch)
        return 0;
 }
 
-
 /*
  * Advance the match state to process 'ch' and/or flag.
  * flag indicates start/end of word/line, and whether to ignore ch.