From f06386ad4f5e1e5b5a3aea71ac757d5be8574067 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Sat, 18 Jul 2015 16:20:03 +0100 Subject: less: fix display of line numbers Line numbers are displayed incorrectly on lines that have a search pattern highlighted. The problem can be fixed by moving the call to lineno_str in print_found above the while loop that alters the value of the line pointer. However, a more substantial rewrite results in savings. function old new delta buffer_print 688 697 +9 .rodata 156077 156045 -32 lineno_str 85 - -85 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 1/1 up/down: 9/-117) Total: -108 bytes Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- miscutils/less.c | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) (limited to 'miscutils/less.c') diff --git a/miscutils/less.c b/miscutils/less.c index c1755655a..7c46ba5cc 100644 --- a/miscutils/less.c +++ b/miscutils/less.c @@ -677,27 +677,21 @@ static const char ctrlconv[] ALIGN1 = "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x40\x4b\x4c\x4d\x4e\x4f" "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"; -static void lineno_str(char *nbuf9, const char *line) +static void print_lineno(const char *line) { - nbuf9[0] = '\0'; - if (option_mask32 & FLAG_N) { - const char *fmt; - unsigned n; - - if (line == empty_line_marker) { - memset(nbuf9, ' ', 8); - nbuf9[8] = '\0'; - return; - } + const char *fmt = " "; + unsigned n = n; /* for compiler */ + + if (line != empty_line_marker) { /* Width of 7 preserves tab spacing in the text */ fmt = "%7u "; n = LINENO(line) + 1; - if (n > 9999999) { + if (n > 9999999 && MAXLINES > 9999999) { n %= 10000000; fmt = "%07u "; } - sprintf(nbuf9, fmt, n); } + printf(fmt, n); } @@ -710,7 +704,6 @@ static void print_found(const char *line) regmatch_t match_structs; char buf[width]; - char nbuf9[9]; const char *str = line; char *p = buf; size_t n; @@ -760,12 +753,7 @@ static void print_found(const char *line) match_status = 1; } - lineno_str(nbuf9, line); - if (!growline) { - printf(CLEAR_2_EOL"%s%s\n", nbuf9, str); - return; - } - printf(CLEAR_2_EOL"%s%s%s\n", nbuf9, growline, str); + printf("%s%s\n", growline ? growline : "", str); free(growline); } #else @@ -775,13 +763,9 @@ void print_found(const char *line); static void print_ascii(const char *str) { char buf[width]; - char nbuf9[9]; char *p; size_t n; - lineno_str(nbuf9, str); - printf(CLEAR_2_EOL"%s", nbuf9); - while (*str) { n = strcspn(str, controls); if (n) { @@ -815,6 +799,9 @@ static void buffer_print(void) move_cursor(0, 0); for (i = 0; i <= max_displayed_line; i++) { + printf(CLEAR_2_EOL); + if (option_mask32 & FLAG_N) + print_lineno(buffer[i]); if (pattern_valid) print_found(buffer[i]); else -- cgit v1.2.3