From 21d56469fd4b4558d640ad82c78f2b9748341c11 Mon Sep 17 00:00:00 2001 From: "Vojtech Vitek (V-Teq)" Date: Mon, 14 May 2012 17:31:20 +0200 Subject: [PATCH] Fix -F option behavior Original patch written by Jindrich Novy . Changes and improvements by Zdenek Prikryl , Vojtech Vitek and Colin Guthrie . Jozef Mlich --- diff -up ./less-466/forwback.c.Foption ./less-466/forwback.c --- ./less-466/forwback.c.Foption 2014-08-24 02:46:52.000000000 +0200 +++ ./less-466/forwback.c 2014-09-18 13:54:28.804626580 +0200 @@ -440,3 +440,24 @@ get_back_scroll() return (sc_height - 2); return (10000); /* infinity */ } + + +/* + * Get line count of file up to the screen height + 1 char + */ + public int +get_line_count() +{ + int nlines = 0; + POSITION pos; + + pos = ch_zero(); + + while (pos != NULL_POSITION && nlines <= sc_height) + { + pos = forw_line(pos); + nlines++; + } + + return nlines; +} diff -up ./less-466/funcs.h.Foption ./less-466/funcs.h --- ./less-466/funcs.h.Foption 2014-08-24 02:46:54.000000000 +0200 +++ ./less-466/funcs.h 2014-09-18 13:55:12.140010010 +0200 @@ -139,6 +139,7 @@ public void forward (); public void backward (); public int get_back_scroll (); + public int get_line_count (); public void del_ifile (); public IFILE next_ifile (); public IFILE prev_ifile (); diff -up ./less-466/main.c.Foption ./less-466/main.c --- ./less-466/main.c.Foption 2014-08-24 02:46:51.000000000 +0200 +++ ./less-466/main.c 2014-09-18 14:03:12.868331522 +0200 @@ -54,8 +54,10 @@ static char consoleTitle[256]; #endif extern int less_is_more; +public int line_count; extern int missing_cap; extern int know_dumb; +extern int quit_if_one_screen; extern int pr_type; @@ -273,10 +275,27 @@ main(argc, argv) { if (edit_stdin()) /* Edit standard input */ quit(QUIT_ERROR); + if (quit_if_one_screen) + line_count = get_line_count(); + } else { if (edit_first()) /* Edit first valid file in cmd line */ quit(QUIT_ERROR); + /* + * In case that we have only one file and -F, have to get a line + * count fot init(). If the line count is less then a height of a term, + * the content of the file is printed out and then less quits. Otherwise + * -F can not be used + */ + if (quit_if_one_screen) + { + if (nifile() == 1) + line_count = get_line_count(); + else /* In case more than one file, -F can not be used */ + quit_if_one_screen = FALSE; + } + } init(); diff -up ./less-466/screen.c.Foption ./less-466/screen.c --- ./less-466/screen.c.Foption 2014-08-24 02:46:51.000000000 +0200 +++ ./less-466/screen.c 2014-09-18 13:58:52.772962165 +0200 @@ -203,6 +203,7 @@ public int missing_cap = 0; /* Some capa static int attrmode = AT_NORMAL; extern int binattr; +extern int line_count; #if !MSDOS_COMPILER static char *cheaper(); @@ -232,6 +233,7 @@ extern int wscroll; extern int screen_trashed; extern int tty; extern int top_scroll; +extern int quit_if_one_screen; extern int oldbot; #if HILITE_SEARCH extern int hilite_search; @@ -1533,7 +1535,9 @@ win32_deinit_term() init() { #if !MSDOS_COMPILER - if (!no_init) + if (quit_if_one_screen && line_count >= sc_height) + quit_if_one_screen = FALSE; + if (!no_init && !quit_if_one_screen) tputs(sc_init, sc_height, putchr); if (!no_keypad) tputs(sc_s_keypad, sc_height, putchr); @@ -1573,7 +1577,7 @@ deinit() #if !MSDOS_COMPILER if (!no_keypad) tputs(sc_e_keypad, sc_height, putchr); - if (!no_init) + if (!no_init && !quit_if_one_screen) tputs(sc_deinit, sc_height, putchr); #else /* Restore system colors. */