[PATCH v2] less: fix display of line numbers

Ron Yorston rmy at frippery.org
Sat Jul 18 15:20:03 UTC 2015


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 at pobox.com>
---
 miscutils/less.c | 35 +++++++++++------------------------
 1 file changed, 11 insertions(+), 24 deletions(-)

diff --git a/miscutils/less.c b/miscutils/less.c
index d5a68d1..87cff40 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -665,27 +665,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);
 }
 
 
@@ -698,7 +692,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;
@@ -748,12 +741,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
@@ -763,13 +751,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) {
@@ -803,6 +787,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
-- 
2.4.3



More information about the busybox mailing list