<<< Date Index >>>     <<< Thread Index >>>

Re: [Mutt] #3127: Hangup when searching for failed pattern



Perhaps this is what Rocco meant:

diff -r 10a1f06bc8aa pager.c
--- a/pager.c   Tue Oct 07 19:22:53 2008 -0700
+++ b/pager.c   Sun Oct 19 13:19:48 2008 +0900
@@ -1511,7 +1511,7 @@
   struct q_class_t *QuoteList = NULL;
   int i, j, ch = 0, rc = -1, hideQuoted = 0, q_level = 0, force_redraw = 0;
   int lines = 0, curline = 0, topline = 0, oldtopline = 0, err, first = 1;
-  int r = -1;
+  int r = -1, wrapped = 0;
   int redraw = REDRAW_FULL;
   FILE *fp = NULL;
   LOFF_T last_pos = 0, last_offset = 0;
@@ -1967,12 +1967,14 @@
       case OP_SEARCH_OPPOSITE:
        if (SearchCompiled)
        {
+         wrapped = 0;
+
 search_next:
          if ((!SearchBack && ch==OP_SEARCH_NEXT) ||
              (SearchBack &&ch==OP_SEARCH_OPPOSITE))
          {
            /* searching forward */
-           for (i = topline + 1; i < lastLine; i++)
+           for (i = wrapped ? 0 : topline + 1; i < lastLine; i++)
            {
              if ((!hideQuoted || lineInfo[i].type != MT_COLOR_QUOTED) && 
                    !lineInfo[i].continuation && lineInfo[i].search_cnt > 0)
@@ -1981,19 +1983,19 @@
 
            if (i < lastLine)
              topline = i;
-           else if (!option (OPTWRAPSEARCH))
+           else if (wrapped || !option (OPTWRAPSEARCH))
              mutt_error _("Not found.");
            else
            {
              mutt_message _("Search wrapped to top.");
-             topline = 1;
+             wrapped = 1;
              goto search_next;
            }
          }
          else
          {
            /* searching backward */
-           for (i = topline - 1; i >= 0; i--)
+           for (i = wrapped ? lastLine : topline - 1; i >= 0; i--)
            {
              if ((!hideQuoted || (has_types && 
                    lineInfo[i].type != MT_COLOR_QUOTED)) && 
@@ -2003,12 +2005,12 @@
 
            if (i >= 0)
              topline = i;
-           else if (!option (OPTWRAPSEARCH))
+           else if (wrapped || !option (OPTWRAPSEARCH))
              mutt_error _("Not found.");
            else
            {
              mutt_message _("Search wrapped to bottom.");
-             topline = lastLine - 1;
+             wrapped = 1;
              goto search_next;
            }
          }
@@ -2038,6 +2040,7 @@
            else
              ch = OP_SEARCH_OPPOSITE;
 
+           wrapped = 0;
            goto search_next;
          }
        }