From be30a6b8b008aeacacf0a83fe24cadf4f99f2d93 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 22 Feb 2001 00:22:46 +0000 Subject: [PATCH] Adjust the terminal height for any overlap, so that no lines get lost off the top -Erik --- more.c | 21 ++++++++++++++++----- util-linux/more.c | 21 ++++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/more.c b/more.c index 298e1cfb1..77e0c2f7e 100644 --- a/more.c +++ b/more.c @@ -71,6 +71,7 @@ extern int more_main(int argc, char **argv) int please_display_more_prompt = 0; struct stat st; FILE *file; + int len; #if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS struct winsize win = { 0, 0, 0, 0 }; @@ -112,12 +113,12 @@ extern int more_main(int argc, char **argv) (void) signal(SIGTERM, gotsig); #endif + len = 0; while ((c = getc(file)) != EOF) { - if (please_display_more_prompt) { - int len = 0; - please_display_more_prompt = 0; + if (please_display_more_prompt) { lines = 0; + please_display_more_prompt = 0; len = printf("--More-- "); if (file != stdin) { #if _FILE_OFFSET_BITS == 64 @@ -160,7 +161,7 @@ extern int more_main(int argc, char **argv) putc('\b', stdout); fflush(stdout); #endif - + len=0; } /* @@ -183,14 +184,24 @@ extern int more_main(int argc, char **argv) please_display_more_prompt = 1; break; } - if (++lines == terminal_height) + /* Adjust the terminal height for any overlap, so that + * no lines get lost off the top. */ + if (len) { + div_t result = div( len, terminal_width); + if (result.quot) + terminal_height-=(result.quot-1); + } + if (++lines == terminal_height) { please_display_more_prompt = 1; + } + len=0; } /* * If we just read a newline from the file being 'mored' and any * key other than a return is hit, scroll by one page */ putc(c, stdout); + len++; } fclose(file); fflush(stdout); diff --git a/util-linux/more.c b/util-linux/more.c index 298e1cfb1..77e0c2f7e 100644 --- a/util-linux/more.c +++ b/util-linux/more.c @@ -71,6 +71,7 @@ extern int more_main(int argc, char **argv) int please_display_more_prompt = 0; struct stat st; FILE *file; + int len; #if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS struct winsize win = { 0, 0, 0, 0 }; @@ -112,12 +113,12 @@ extern int more_main(int argc, char **argv) (void) signal(SIGTERM, gotsig); #endif + len = 0; while ((c = getc(file)) != EOF) { - if (please_display_more_prompt) { - int len = 0; - please_display_more_prompt = 0; + if (please_display_more_prompt) { lines = 0; + please_display_more_prompt = 0; len = printf("--More-- "); if (file != stdin) { #if _FILE_OFFSET_BITS == 64 @@ -160,7 +161,7 @@ extern int more_main(int argc, char **argv) putc('\b', stdout); fflush(stdout); #endif - + len=0; } /* @@ -183,14 +184,24 @@ extern int more_main(int argc, char **argv) please_display_more_prompt = 1; break; } - if (++lines == terminal_height) + /* Adjust the terminal height for any overlap, so that + * no lines get lost off the top. */ + if (len) { + div_t result = div( len, terminal_width); + if (result.quot) + terminal_height-=(result.quot-1); + } + if (++lines == terminal_height) { please_display_more_prompt = 1; + } + len=0; } /* * If we just read a newline from the file being 'mored' and any * key other than a return is hit, scroll by one page */ putc(c, stdout); + len++; } fclose(file); fflush(stdout);