[PATCH v5 2/2] less: replace most uses of NORMAL escape with UNHIGHLIGHT

FriendlyNeighborhoodShane shane.880088.supw at gmail.com
Tue May 10 15:38:22 UTC 2022


Emmitting NORMAL resets the entire SGR state of the terminal, which
includes colors. We don't want that now, since those sequences can
come between a colored line, and this would cut the coloring short.

UNHIGHLIGHT is a dedicated code to just flip the HIGHLIGHT (invert)
bit to off, and is a better complement anywhere after HIGHLIGHT.

NORMAL is still used wherever appropriate, e.g. at the end of lines
to reset color state.

This cannot handle the case when there is a HIGHLIGHT sequence in
the input itself, and any such highlighting can be cut short by
less-emmitted highlight sequences. Avoiding that probably requires
looking at the codes and keeping state. Testing shows that even
greenwood less doesn't bother to do that.

function                                             old     new   delta
.rodata                                           100509  100527     +18
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 18/0)               Total: 18 bytes

Signed-off-by: FriendlyNeighborhoodShane <shane.880088.supw at gmail.com>
---
 miscutils/less.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/miscutils/less.c b/miscutils/less.c
index cad37aaac..5e8a87ca5 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -155,6 +155,7 @@
 #define ESC "\033"
 /* The escape codes for highlighted and normal text */
 #define HIGHLIGHT   ESC"[7m"
+#define UNHIGHLIGHT ESC"[27m"
 #define NORMAL      ESC"[m"
 /* The escape code to home and clear to the end of screen */
 #define CLEAR       ESC"[H"ESC"[J"
@@ -312,13 +313,13 @@ static void clear_line(void)
 
 static void print_hilite(const char *str)
 {
-	printf(HIGHLIGHT"%s"NORMAL, str);
+	printf(HIGHLIGHT"%s"UNHIGHLIGHT, str);
 }
 
 static void print_statusline(const char *str)
 {
 	clear_line();
-	printf(HIGHLIGHT"%.*s"NORMAL, width - 1, str);
+	printf(HIGHLIGHT"%.*s"UNHIGHLIGHT, width - 1, str);
 }
 
 /* Exit the program gracefully */
@@ -710,7 +711,7 @@ static void m_status_print(void)
 		percent = (100 * last + num_lines/2) / num_lines;
 		printf(" %i%%", percent <= 100 ? percent : 100);
 	}
-	printf(NORMAL);
+	printf(UNHIGHLIGHT);
 }
 #endif
 
@@ -740,7 +741,7 @@ static void status_print(void)
 	if (!cur_fline)
 		p = filename;
 	if (num_files > 1) {
-		printf(HIGHLIGHT"%s (file %i of %i)"NORMAL,
+		printf(HIGHLIGHT"%s (file %i of %i)"UNHIGHLIGHT,
 				p, current_file, num_files);
 		return;
 	}
@@ -807,7 +808,7 @@ static void print_found(const char *line)
 	/* buf[] holds quarantined version of str */
 
 	/* Each part of the line that matches has the HIGHLIGHT
-	 * and NORMAL escape sequences placed around it.
+	 * and UNHIGHLIGHT escape sequences placed around it.
 	 * NB: we regex against line, but insert text
 	 * from quarantined copy (buf[]) */
 	str = buf;
@@ -816,7 +817,7 @@ static void print_found(const char *line)
 	goto start;
 
 	while (match_status == 0) {
-		char *new = xasprintf("%s%.*s"HIGHLIGHT"%.*s"NORMAL,
+		char *new = xasprintf("%s%.*s"HIGHLIGHT"%.*s"UNHIGHLIGHT,
 				growline ? growline : "",
 				(int)match_structs.rm_so, str,
 				(int)(match_structs.rm_eo - match_structs.rm_so),
@@ -1553,7 +1554,7 @@ static void show_flag_status(void)
 	}
 
 	clear_line();
-	printf(HIGHLIGHT"The status of the flag is: %u"NORMAL, flag_val != 0);
+	printf(HIGHLIGHT"The status of the flag is: %u"UNHIGHLIGHT, flag_val != 0);
 }
 #endif
 
-- 
2.36.1



More information about the busybox mailing list