diff options
author | Ron Yorston | 2015-07-18 16:20:03 +0100 |
---|---|---|
committer | Denys Vlasenko | 2015-07-19 22:48:05 +0200 |
commit | f06386ad4f5e1e5b5a3aea71ac757d5be8574067 (patch) | |
tree | f45448523ab56a43efc09aae7ac6d9a3b2d09404 | |
parent | 51aa861843002e92b605be840460e7141d4d86a2 (diff) | |
download | busybox-f06386ad4f5e1e5b5a3aea71ac757d5be8574067.zip busybox-f06386ad4f5e1e5b5a3aea71ac757d5be8574067.tar.gz |
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 <rmy@frippery.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/less.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/miscutils/less.c b/miscutils/less.c index c175565..7c46ba5 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 |