changeset 33099:49f317597430 v9.0.1834

patch 9.0.1834: Some problems with xxd coloring Commit: https://github.com/vim/vim/commit/f6fc255e8d9c46a0e51e03f16a508833d309dee6 Author: K.Takata <kentkt@csc.jp> Date: Fri Sep 1 18:41:04 2023 +0200 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>
author Christian Brabandt <cb@256bit.org>
date Fri, 01 Sep 2023 18:45:06 +0200
parents d3d82d3f6006
children d6ca39752b4f
files runtime/doc/xxd.1 src/version.c src/xxd/xxd.c
diffstat 3 files changed, 54 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/xxd.1
+++ b/runtime/doc/xxd.1
@@ -135,9 +135,9 @@ to read plain hexadecimal dumps without 
 particular column layout. Additional whitespace and line breaks are allowed
 anywhere.
 .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.
-.I WHEN
+.I \fIwhen\fP
 is
 .BR never ", " always ", or " auto .
 .TP
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1834,
+/**/
     1833,
 /**/
     1832,
--- a/src/xxd/xxd.c
+++ b/src/xxd/xxd.c
@@ -87,10 +87,10 @@
 #endif
 #if defined(WIN32) || defined(CYGWIN)
 # include <io.h>	/* for setmode() */
-#else
-# ifdef UNIX
-#  include <unistd.h>
-# endif
+# include <windows.h>
+#endif
+#ifdef UNIX
+# include <unistd.h>
 #endif
 #include <stdlib.h>
 #include <string.h>	/* for strncmp() */
@@ -135,7 +135,7 @@ extern void perror __P((char *));
 # 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
 char osver[] = " (Win32)";
 #else
@@ -256,7 +256,7 @@ exit_with_usage(void)
 	  "", "");
 #endif
   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);
   exit(1);
 }
@@ -502,7 +502,7 @@ static unsigned char etoa64[] =
     0070,0071,0372,0373,0374,0375,0376,0377
 };
 
-   static void
+  static void
 begin_coloring_char (char *l, int *c, int e, int ebcdic)
 {
   if (ebcdic)
@@ -547,6 +547,27 @@ begin_coloring_char (char *l, int *c, in
   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
 main(int argc, char *argv[])
 {
@@ -564,10 +585,11 @@ main(int argc, char *argv[])
   char *varname = NULL;
   int addrlen = 9;
   int color = 0;
+  char *no_color;
 
-#ifdef UNIX
-  color = isatty(STDOUT_FILENO);
-#endif
+  no_color = getenv("NO_COLOR");
+  if (no_color == NULL || no_color[0] == '\0')
+    color = enable_color();
 
 #ifdef AMIGA
   /* This program doesn't work when started from the Workbench */
@@ -720,14 +742,26 @@ main(int argc, char *argv[])
         }
       else if (!STRNCMP(pp, "-R", 2))
         {
-	  if (!argv[2])
+	  char *pw = pp + 2;
+	  if (!pw[0])
+	    {
+	      pw = argv[2];
+	      argv++;
+	      argc--;
+	    }
+	  if (!pw)
 	    exit_with_usage();
-	  if (!STRNCMP(argv[2], "always", 2))
-	    color = 1;
-	  else if (!STRNCMP(argv[2], "never", 1))
+	  if (!STRNCMP(pw, "always", 6))
+	    {
+	      (void)enable_color();
+	      color = 1;
+	    }
+	  else if (!STRNCMP(pw, "never", 5))
 	    color = 0;
-	  argv++;
-	  argc--;
+	  else if (!STRNCMP(pw, "auto", 4))
+	    ;	/* Do nothing. */
+	  else
+	    exit_with_usage();
         }
       else if (!strcmp(pp, "--"))	/* end of options */
 	{