]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
fmt: interpret -w as an inclusive maximum
authorPádraig Brady <P@draigBrady.com>
Wed, 7 Jan 2026 17:15:28 +0000 (17:15 +0000)
committerPádraig Brady <P@draigBrady.com>
Thu, 8 Jan 2026 12:08:14 +0000 (12:08 +0000)
This aligns with `fold -w` and BSD `fmt` implementations.

* src/fmt.c (fmt_paragraph): Check len <= max_width.
* tests/fmt/width.sh: Add a new test.
* tests/local.mk: Reference the new test.
* NEWS: Mention the change in behavior.
Addresses part of https://bugs.gnu.org/79497

NEWS
src/fmt.c
tests/fmt/width.sh [new file with mode: 0755]
tests/local.mk

diff --git a/NEWS b/NEWS
index eb9c5e2c4d8e627b0550daa771d08c98f10b14a0..240edc562db709d021beac672cc0b855413bb735 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -53,6 +53,9 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Changes in behavior
 
+  'fmt' -w,--width no longer includes '\n' in the width of a line.
+  I.e., the specified width is interpreted to be an _inclusive_ maximum.
+
   'ptx' -t is no longer a no-op, and now sets the default width to 100 columns.
 
   'timeout' now honors ignored signals and will not propagate them.  E.g.,
index 127e7ba4bd03fd000f642f01fe70cde66312f1fb..ae689ec2863c95c811e06872db3e399bce673f09 100644 (file)
--- a/src/fmt.c
+++ b/src/fmt.c
@@ -908,7 +908,7 @@ fmt_paragraph (void)
 
           len += (w - 1)->space + w->length;   /* w > start >= word */
         }
-      while (len < max_width);
+      while (len <= max_width);
       start->best_cost = best + base_cost (start);
     }
 
diff --git a/tests/fmt/width.sh b/tests/fmt/width.sh
new file mode 100755 (executable)
index 0000000..981ca96
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+# Exercise the fmt -w option.
+
+# Copyright (C) 2026 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ fmt
+
+# Ensure width is max display width.
+# Before v9.10, width incorrectly included the \n character
+printf 'aa bb cc dd ee' | fmt -w 8 > out || fail=1
+cat <<\_EOF_ > exp || framework_failure_
+aa bb cc
+dd ee
+_EOF_
+compare exp out || fail=1
+
+printf 'aa bb cc dd ee' | fmt -w 7 > out || fail=1
+cat <<\_EOF_ > exp || framework_failure_
+aa
+bb cc
+dd ee
+_EOF_
+compare exp out || fail=1
+
+
+Exit $fail
index 807eddac1e3cf0f6fe0e97977b992b57b53d9a99..01db53678282c26ec2c6db113265fbcf62c32b0a 100644 (file)
@@ -251,6 +251,7 @@ all_tests =                                 \
   tests/fmt/goal-option.sh                     \
   tests/fmt/long-line.sh                       \
   tests/fmt/non-space.sh                       \
+  tests/fmt/width.sh                           \
   tests/misc/echo.sh                           \
   tests/env/env.sh                             \
   tests/env/env-signal-handler.sh              \