less: fix 'n'ext match: sometimes was going to 999999th line
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 8 Mar 2007 16:44:32 +0000 (16:44 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 8 Mar 2007 16:44:32 +0000 (16:44 -0000)
miscutils/less.c

index 3db7c9c..b0e2754 100644 (file)
@@ -342,6 +342,23 @@ static void status_print(void)
        print_hilite(p);
 }
 
+static void cap_cur_fline(int nlines)
+{
+       int diff;
+       if (cur_fline < 0)
+               cur_fline = 0;
+       if (cur_fline + max_displayed_line > max_fline + TILDES) {
+               cur_fline -= nlines;
+               if (cur_fline < 0)
+                       cur_fline = 0;
+               diff = max_fline - (cur_fline + max_displayed_line) + TILDES;
+               /* As the number of lines requested was too large, we just move
+               to the end of the file */
+               if (diff > 0)
+                       cur_fline += diff;
+       }
+}
+
 static char controls[] =
        /* NUL: never encountered; TAB: not converted */
        /**/"\x01\x02\x03\x04\x05\x06\x07\x08"  "\x0a\x0b\x0c\x0d\x0e\x0f"
@@ -479,18 +496,9 @@ static void buffer_fill_and_print(void)
 /* Move the buffer up and down in the file in order to scroll */
 static void buffer_down(int nlines)
 {
-       int diff;
        cur_fline += nlines;
        read_lines();
-
-       if (cur_fline + max_displayed_line > max_fline + TILDES) {
-               cur_fline -= nlines;
-               diff = max_fline - (cur_fline + max_displayed_line) + TILDES;
-               /* As the number of lines requested was too large, we just move
-               to the end of the file */
-               if (diff > 0)
-                       cur_fline += diff;
-       }
+       cap_cur_fline(nlines);
        buffer_fill_and_print();
 }
 
@@ -763,6 +771,7 @@ static void goto_match(int match)
        if (match >= num_matches && eof_error > 0) {
                cur_fline = MAXLINES; /* look as far as needed */
                read_lines();
+               cap_cur_fline(cur_fline);
        }
        if (num_matches) {
                normalize_match_pos(match);