[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: [PATCH v2 1/2] less: fully implement -R and print color escapes
From: FriendlyNeighborhoodShane <shane.880088.supw () gmail ! com>
Date: 2022-04-15 6:23:35
Message-ID: 20220415061136.48145-1-shane.880088.supw () gmail ! com
[Download RAW message or body]
Emit NORMAL at newlines, like less, to deal with malformed input.
Doesn't work in regex find mode, but neither does the normal escape
highlighting.
---
Fits a little akwardly into the output flow with a break and continue,
but it works.
Changes from v1:
- count_colctrl does better validation for escape sequences
miscutils/less.c | 55 +++++++++++++++++++++++++++---------------------
1 file changed, 31 insertions(+), 24 deletions(-)
diff --git a/miscutils/less.c b/miscutils/less.c
index 8a0525cb7..dcb682404 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -139,7 +139,7 @@
//usage: "\n -S Truncate long lines"
//usage: )
//usage: IF_FEATURE_LESS_RAW(
-//usage: "\n -R Remove color escape codes in input"
+//usage: "\n -R Keep ANSI color escape codes in input"
//usage: )
//usage: "\n -~ Suppress ~s displayed past EOF"
@@ -229,9 +229,6 @@ struct globals {
regex_t pattern;
smallint pattern_valid;
#endif
-#if ENABLE_FEATURE_LESS_RAW
- smallint in_escape;
-#endif
#if ENABLE_FEATURE_LESS_ASK_TERMINAL
smallint winsize_err;
#endif
@@ -541,26 +538,6 @@ static void read_lines(void)
*--p = '\0';
continue;
}
-#if ENABLE_FEATURE_LESS_RAW
- if (option_mask32 & FLAG_R) {
- if (c == '\033')
- goto discard;
- if (G.in_escape) {
- if (isdigit(c)
- || c == '['
- || c == ';'
- || c == 'm'
- ) {
- discard:
- G.in_escape = (c != 'm');
- readpos++;
- continue;
- }
- /* Hmm, unexpected end of "ESC [ N ; N m" sequence */
- G.in_escape = 0;
- }
- }
-#endif
{
size_t new_last_line_pos = last_line_pos + 1;
if (c == '\t') {
@@ -864,13 +841,34 @@ static void print_found(const char *line)
void print_found(const char *line);
#endif
+static size_t count_colctrl(const char *str) {
+ size_t n;
+ if (str[1] == '['
+ && (n = strspn(str+2, "0123456789;")) >= 0
+ && str[n+2] == 'm')
+ return n+3;
+ return 0;
+}
+
static void print_ascii(const char *str)
{
char buf[width+1];
char *p;
size_t n;
+#if ENABLE_FEATURE_LESS_RAW
+ size_t esc = 0;
+#endif
while (*str) {
+#if ENABLE_FEATURE_LESS_RAW
+ if (esc) {
+ printf("%.*s", (int) esc, str);
+ str += esc;
+ esc = 0;
+ continue;
+ }
+#endif
n = strcspn(str, controls);
if (n) {
if (!str[n]) break;
@@ -886,6 +884,14 @@ static void print_ascii(const char *str)
/* VT100's CSI, aka Meta-ESC. Who's inventor? */
/* I want to know who committed this sin */
*p++ = '{';
+#if ENABLE_FEATURE_LESS_RAW
+ else if ((option_mask32 & FLAG_R)
+ && *str == '\033'
+ && (esc = count_colctrl(str))) {
+ break;
+ }
+#endif
else
*p++ = ctrlconv[(unsigned char)*str];
str++;
@@ -894,6 +900,7 @@ static void print_ascii(const char *str)
print_hilite(buf);
}
puts(str);
+ printf(NORMAL);
}
/* Print the buffer */
--
2.35.3
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic