diff --git a/man/rgbasm.1 b/man/rgbasm.1 index 550877e7..8436a623 100644 --- a/man/rgbasm.1 +++ b/man/rgbasm.1 @@ -177,6 +177,9 @@ or The defaults are 0123. .It Fl h , Fl \-help Print help text for the program and exit. +(Help text wraps to the value of the +.Dv COLUMNS +environment variable if that is defined as nonzero; or else to the console window width if output is to a TTY.) .It Fl I Ar path , Fl \-include Ar path Add a new .Dq include path ; diff --git a/man/rgbfix.1 b/man/rgbfix.1 index aa04658f..aa32fe77 100644 --- a/man/rgbfix.1 +++ b/man/rgbfix.1 @@ -152,6 +152,9 @@ Trash the global checksum. .El .It Fl h , Fl \-help Print help text for the program and exit. +(Help text wraps to the value of the +.Dv COLUMNS +environment variable if that is defined as nonzero; or else to the console window width if output is to a TTY.) .It Fl i Ar game_id , Fl \-game-id Ar game_id Set the game ID string .Pq Ad 0x13F Ns \(en Ns Ad 0x142 diff --git a/man/rgbgfx.1 b/man/rgbgfx.1 index 13ac3d7f..a4366bd4 100644 --- a/man/rgbgfx.1 +++ b/man/rgbgfx.1 @@ -257,6 +257,9 @@ Set the bit depth of the output tile data, in bits per pixel (bpp), either 1 or This changes how tile data is output, and the maximum number of colors per palette (2 and 4 respectively). .It Fl h , Fl \-help Print help text for the program and exit. +(Help text wraps to the value of the +.Dv COLUMNS +environment variable if that is defined as nonzero; or else to the console window width if output is to a TTY.) .It Fl i Ar input_tiles , Fl \-input-tileset Ar input_tiles Use the specified input tiles in addition to having .Nm diff --git a/man/rgblink.1 b/man/rgblink.1 index f57e7207..37830a34 100644 --- a/man/rgblink.1 +++ b/man/rgblink.1 @@ -152,6 +152,9 @@ This option automatically enables .Fl w . .It Fl h , Fl \-help Print help text for the program and exit. +(Help text wraps to the value of the +.Dv COLUMNS +environment variable if that is defined as nonzero; or else to the console window width if output is to a TTY.) .It Fl l Ar linker_script , Fl \-linkerscript Ar linker_script Specify a linker script file that tells the linker how sections must be placed in the ROM. The attributes assigned in the linker script must be consistent with any assigned in the code. diff --git a/src/usage.cpp b/src/usage.cpp index d8658af6..4bc4849d 100644 --- a/src/usage.cpp +++ b/src/usage.cpp @@ -10,6 +10,7 @@ #include "helpers.hpp" #include "platform.hpp" #include "style.hpp" +#include "util.hpp" // parseWholeNumber #include "version.hpp" #if defined(_MSC_VER) || defined(__MINGW32__) @@ -24,20 +25,19 @@ void Usage::printVersion(bool error) const { } void Usage::printAndExit(int code) const { - FILE *file; - bool isTerminal; - if (code) { - file = stderr; - isTerminal = isatty(STDERR_FILENO); - } else { - file = stdout; - isTerminal = isatty(STDOUT_FILENO); + // Usage flags can be long lines, so wrap them at a maximum line length + uint64_t maxLineLen = 0; + // Use the conventional COLUMNS environment variable, if it is defined and nonzero + if (char const *columnsStr = getenv("COLUMNS"); columnsStr) { + if (std::optional columns = parseWholeNumber(columnsStr, BASE_10); + columns && *columns > 0) { + maxLineLen = *columns; + } else { + warnx("Ignoring invalid `COLUMNS` value \"%s\"", columnsStr); + } } - - // Use the console window width minus 1 as the maximum line length for flags, - // or the historically common 80 minus 1 if the output is not to a console TTY - size_t maxLineLen = 79; - if (isTerminal) { + // Otherwise, use the console window width minus 1, if the output is to a console TTY + if (maxLineLen == 0 && isatty(code ? STDERR_FILENO : STDOUT_FILENO)) { // LCOV_EXCL_START #if defined(_MSC_VER) || defined(__MINGW32__) CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -54,8 +54,13 @@ void Usage::printAndExit(int code) const { #endif // LCOV_EXCL_STOP } + // Otherwise, just use the historically common 80 minus 1 + if (maxLineLen == 0) { + maxLineLen = 79; + } // Print "Usage: " + FILE *file = code ? stderr : stdout; style_Set(file, STYLE_GREEN, true); fputs("Usage: ", file); style_Set(file, STYLE_CYAN, true);