In Savannah #67309, I mused: > It's long seemed weird to me that one could force color off with the > `-c` option, but a document could blithely turn it back on again with > impunity. > > If the point of this feature is to avoid problems with monochrome > output devices, or to conserve color ink in printers, foreclosing the > emission [of] color-related grout commands would seem to serve the > purpose better.
Here's a patch. I refactored the logic a little bit to avoid writing racily to a global variable in the event we ever make GNU troff multi-threaded. diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp index 56877ffad..ed94aad0d 100644 --- a/src/roff/troff/input.cpp +++ b/src/roff/troff/input.cpp @@ -102,6 +102,7 @@ void transparent_file(); token tok; bool want_break = false; bool using_character_classes = false; +static bool permit_color_output = true; bool want_color_output = true; static bool want_backtraces = false; char *pipe_command = 0 /* nullptr */; @@ -1523,10 +1524,16 @@ static color *read_gray(char end = 0) static void activate_color() { int n; + bool is_color_desired = false; if (has_arg() && get_integer(&n)) - want_color_output = (n > 0); + is_color_desired = (n > 0); else - want_color_output = true; + is_color_desired = true; + if (is_color_desired && !permit_color_output) { + error("color output disabled via command line"); + is_color_desired = false; + } + want_color_output = is_color_desired; skip_line(); } @@ -9265,7 +9278,7 @@ int main(int argc, char **argv) want_att_compat = true; // fall through case 'c': - want_color_output = false; + permit_color_output = false; break; case 'M': macro_path.command_line_dir(optarg); Demonstration: $ echo '.color 0' | ./build/test-groff $ echo '.color 1' | ./build/test-groff $ echo '.color 0' | ./build/test-groff -c $ echo '.color 1' | ./build/test-groff -c troff:<standard input>:1: error: color output disabled via command line Any objection? Regards, Branden
signature.asc
Description: PGP signature