less: add a function to detect when display is at end of file

Add a function to package the test that detects whether enough has
been read from the file to allow a screenful to be displayed.

Also use this to determine when to display '(END)' in the status
line.  The previous code was incomplete and didn't handle truncated
lines (-S flag) properly.

function                                             old     new   delta
at_end                                                 -      63     +63
status_print                                         111     109      -2
read_lines                                           819     764     -55
getch_nowait                                         319     264     -55
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/3 up/down: 63/-112)           Total: -49 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2015-07-24 14:28:50 +01:00 committed by Denys Vlasenko
parent 70b84be9e8
commit ad1b4d5882
1 changed files with 12 additions and 13 deletions

View File

@ -406,6 +406,14 @@ static void fill_match_lines(unsigned pos);
#define fill_match_lines(pos) ((void)0)
#endif
static int at_end(void)
{
return (option_mask32 & FLAG_S)
? !(cur_fline <= max_fline &&
max_lineno > LINENO(flines[cur_fline]) + max_displayed_line)
: !(max_fline > cur_fline + max_displayed_line);
}
/* Devilishly complex routine.
*
* Has to deal with EOF and EPIPE on input,
@ -552,11 +560,7 @@ static void read_lines(void)
eof_error = 0; /* Pretend we saw EOF */
break;
}
if (!(option_mask32 & FLAG_S)
? (max_fline > cur_fline + max_displayed_line)
: (max_fline >= cur_fline
&& max_lineno > LINENO(flines[cur_fline]) + max_displayed_line)
) {
if (!at_end()) {
#if !ENABLE_FEATURE_LESS_REGEXP
break;
#else
@ -662,7 +666,7 @@ static void m_status_print(void)
if (num_lines >= 0)
printf("/%i", num_lines);
if (cur_fline >= (int)(max_fline - max_displayed_line)) {
if (at_end()) {
printf(" (END)");
if (num_files > 1 && current_file != num_files)
printf(" - next: %s", files[current_file]);
@ -692,7 +696,7 @@ static void status_print(void)
#endif
clear_line();
if (cur_fline && cur_fline < (int)(max_fline - max_displayed_line)) {
if (cur_fline && !at_end()) {
bb_putchar(':');
return;
}
@ -1009,12 +1013,7 @@ static int64_t getch_nowait(void)
*/
rd = 1;
/* Are we interested in stdin? */
//TODO: reuse code for determining this
if (!(option_mask32 & FLAG_S)
? !(max_fline > cur_fline + max_displayed_line)
: !(max_fline >= cur_fline
&& max_lineno > LINENO(flines[cur_fline]) + max_displayed_line)
) {
if (at_end()) {
if (eof_error > 0) /* did NOT reach eof yet */
rd = 0; /* yes, we are interested in stdin */
}