1
0
forked from aniani/vim

patch 9.0.1834: Some problems with xxd coloring

Problem:  Some problems with xxd coloring
Solution: Fix the following problems:

* Support colored output on Windows.
  SetConsoleMode() is required to enable ANSI color sequences.
* Support "NO_COLOR" environment variable.
  If "NO_COLOR" is defined and not empty, colored output should be
  disabled.
  See https://no-color.org/
* "-R" should only accept "always", "never" or "auto" as the parameter.
* Adjust help and documentation. "-R" cannot omit the parameter. Remove
  surrounding brackets.

Related #12131
closes: #12997
closes: #12991
closes: #12986

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: K.Takata <kentkt@csc.jp>
This commit is contained in:
K.Takata 2023-09-01 18:41:04 +02:00 committed by Christian Brabandt
parent da16a1b471
commit f6fc255e8d
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
3 changed files with 54 additions and 18 deletions

View File

@ -135,9 +135,9 @@ to read plain hexadecimal dumps without line number information and without a
particular column layout. Additional whitespace and line breaks are allowed particular column layout. Additional whitespace and line breaks are allowed
anywhere. anywhere.
.TP .TP
.IR \-R " "[WHEN] .IR \-R " " when
In output the hex-value and the value are both colored with the same color depending on the hex-value. Mostly helping to differentiate printable and non-printable characters. In output the hex-value and the value are both colored with the same color depending on the hex-value. Mostly helping to differentiate printable and non-printable characters.
.I WHEN .I \fIwhen\fP
is is
.BR never ", " always ", or " auto . .BR never ", " always ", or " auto .
.TP .TP

View File

@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1834,
/**/ /**/
1833, 1833,
/**/ /**/

View File

@ -87,10 +87,10 @@
#endif #endif
#if defined(WIN32) || defined(CYGWIN) #if defined(WIN32) || defined(CYGWIN)
# include <io.h> /* for setmode() */ # include <io.h> /* for setmode() */
#else # include <windows.h>
# ifdef UNIX #endif
#ifdef UNIX
# include <unistd.h> # include <unistd.h>
# endif
#endif #endif
#include <stdlib.h> #include <stdlib.h>
#include <string.h> /* for strncmp() */ #include <string.h> /* for strncmp() */
@ -135,7 +135,7 @@ extern void perror __P((char *));
# endif # endif
#endif #endif
char version[] = "xxd 2023-08-31 by Juergen Weigert et al."; char version[] = "xxd 2023-09-01 by Juergen Weigert et al.";
#ifdef WIN32 #ifdef WIN32
char osver[] = " (Win32)"; char osver[] = " (Win32)";
#else #else
@ -256,7 +256,7 @@ exit_with_usage(void)
"", ""); "", "");
#endif #endif
fprintf(stderr, " -u use upper case hex letters.\n"); fprintf(stderr, " -u use upper case hex letters.\n");
fprintf(stderr, " -R [WHEN] colorize the output; WHEN can be 'always', 'auto' or 'never'. Default: 'auto'.\n"), fprintf(stderr, " -R when colorize the output; <when> can be 'always', 'auto' or 'never'. Default: 'auto'.\n"),
fprintf(stderr, " -v show version: \"%s%s\".\n", version, osver); fprintf(stderr, " -v show version: \"%s%s\".\n", version, osver);
exit(1); exit(1);
} }
@ -547,6 +547,27 @@ begin_coloring_char (char *l, int *c, int e, int ebcdic)
l[(*c)++] = 'm'; l[(*c)++] = 'm';
} }
static int
enable_color(void)
{
#ifdef WIN32
DWORD mode;
HANDLE out;
if (!isatty(1))
return 0;
out = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(out, &mode);
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
return (int)SetConsoleMode(out, mode);
#elif defined(UNIX)
return isatty(STDOUT_FILENO);
#else
return 0;
#endif
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -564,10 +585,11 @@ main(int argc, char *argv[])
char *varname = NULL; char *varname = NULL;
int addrlen = 9; int addrlen = 9;
int color = 0; int color = 0;
char *no_color;
#ifdef UNIX no_color = getenv("NO_COLOR");
color = isatty(STDOUT_FILENO); if (no_color == NULL || no_color[0] == '\0')
#endif color = enable_color();
#ifdef AMIGA #ifdef AMIGA
/* This program doesn't work when started from the Workbench */ /* This program doesn't work when started from the Workbench */
@ -720,15 +742,27 @@ main(int argc, char *argv[])
} }
else if (!STRNCMP(pp, "-R", 2)) else if (!STRNCMP(pp, "-R", 2))
{ {
if (!argv[2]) char *pw = pp + 2;
exit_with_usage(); if (!pw[0])
if (!STRNCMP(argv[2], "always", 2)) {
color = 1; pw = argv[2];
else if (!STRNCMP(argv[2], "never", 1))
color = 0;
argv++; argv++;
argc--; argc--;
} }
if (!pw)
exit_with_usage();
if (!STRNCMP(pw, "always", 6))
{
(void)enable_color();
color = 1;
}
else if (!STRNCMP(pw, "never", 5))
color = 0;
else if (!STRNCMP(pw, "auto", 4))
; /* Do nothing. */
else
exit_with_usage();
}
else if (!strcmp(pp, "--")) /* end of options */ else if (!strcmp(pp, "--")) /* end of options */
{ {
argv++; argv++;