[PATCH v2] less: Add -R
Bernhard Reutner-Fischer
rep.dot.nop at gmail.com
Wed Jan 22 19:45:16 UTC 2014
On 22 January 2014 10:52:48 Bernhard Reutner-Fischer
<rep.dot.nop at gmail.com> wrote:
Ping. I See you just look at less.
Having both print_ASCII and print_found is pretty wastefull but beyond the
time I have right now.
OK to push as-is or do you want to do the -R below yourself?
Cheers,
> Let ANSI escape sequences for color go through verbatim.
> git diff HEAD^ --color=always | ./busybox_unstripped less -R
>
> v2: Also handle NNN;NNN;
>
> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
> ---
> miscutils/less.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 47 insertions(+), 9 deletions(-)
>
> diff --git a/miscutils/less.c b/miscutils/less.c
> index 506231d..5a06478 100644
> --- a/miscutils/less.c
> +++ b/miscutils/less.c
> @@ -98,7 +98,7 @@
> //config: Enables "-N" command.
>
> //usage:#define less_trivial_usage
> -//usage: "[-E" IF_FEATURE_LESS_FLAGS("Mm") "Nh~I?] [FILE]..."
> +//usage: "[-E" IF_FEATURE_LESS_FLAGS("Mm") "Nh~IR?] [FILE]..."
> //usage:#define less_full_usage "\n\n"
> //usage: "View FILE (or stdin) one screenful at a time\n"
> //usage: "\n -E Quit once the end of a file is reached"
> @@ -108,6 +108,7 @@
> //usage: )
> //usage: "\n -N Prefix line number to each line"
> //usage: "\n -I Ignore case in all searches"
> +//usage: "\n -R display color escape sequences"
> //usage: "\n -~ Suppress ~s displayed past EOF"
>
> #include <sched.h> /* sched_yield() */
> @@ -142,7 +143,8 @@ enum {
> FLAG_N = 1 << 3,
> FLAG_TILDE = 1 << 4,
> FLAG_I = 1 << 5,
> - FLAG_S = (1 << 6) * ENABLE_FEATURE_LESS_DASHCMD,
> + FLAG_R = 1 << 6,
> + FLAG_S = (1 << 7) * ENABLE_FEATURE_LESS_DASHCMD,
> /* hijack command line options variable for internal state vars */
> LESS_STATE_MATCH_BACKWARDS = 1 << 15,
> };
> @@ -677,6 +679,27 @@ static void lineno_str(char *nbuf9, const char *line)
> }
> }
>
> +/* Determine if STR points to an ANSI color escape sequence of the form:
> + * \033[NNNm
> + * where NNN is
> + * - optional
> + * - can consist of one or more 3-digits, optionally separated by ';'
> + */
> +static int is_ansi_color(const char *str)
> +{
> + if (*str && *str++ == '\033' && *str == '[') {
> + unsigned nums = 4;
> + while (nums-- && *(++str)) {
> + if (*str == 'm')
> + return 1;
> + else if (*str == ';')
> + nums = 4;
> + else if (!isdigit(*str))
> + return 0;
> + }
> + }
> + return 0;
> +}
>
> #if ENABLE_FEATURE_LESS_REGEXP
> static void print_found(const char *line)
> @@ -700,10 +723,18 @@ static void print_found(const char *line)
> p += n;
> str += n;
> }
> - n = strspn(str, controls);
> - memset(p, '.', n);
> - p += n;
> - str += n;
> + if (option_mask32 & FLAG_R && is_ansi_color(str)) {
> + /* Let color sequences go through: \033[NNNm N is optional */
> + while (*str != 'm') {
> + *p++ = *str++;
> + }
> + *p++ = *str++;
> + } else {
> + n = strspn(str, controls);
> + memset(p, '.', n);
> + p += n;
> + str += n;
> + }
> }
> strcpy(p, str);
>
> @@ -775,12 +806,19 @@ 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++ = '{';
> - else
> + else if (option_mask32 & FLAG_R && is_ansi_color(str)) {
> + /* Let color sequences go through: \033[NNNm N is optional */
> + while (*str != 'm') {
> + *p++ = *str++;
> + }
> + *p++ = *str++;
> + break;
> + } else
> *p++ = ctrlconv[(unsigned char)*str];
> str++;
> } while (--n);
> *p = '\0';
> - print_hilite(buf);
> + printf(buf);
> }
> puts(str);
> }
> @@ -1617,7 +1655,7 @@ int less_main(int argc, char **argv)
> /* TODO: -x: do not interpret backspace, -xx: tab also */
> /* -xxx: newline also */
> /* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */
> - getopt32(argv, "EMmN~I" IF_FEATURE_LESS_DASHCMD("S"));
> + getopt32(argv, "EMmN~IR" IF_FEATURE_LESS_DASHCMD("S"));
> argc -= optind;
> argv += optind;
> num_files = argc;
> --
> 1.8.5.2
>
Sent with AquaMail for Android
http://www.aqua-mail.com
More information about the busybox
mailing list