unexpand: correct behavior for --first-only --tabs=4
authorMark Edgar <medgar123@gmail.com>
Sat, 30 May 2020 17:05:46 +0000 (19:05 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 9 Jun 2020 13:40:49 +0000 (15:40 +0200)
Prior to the patch, both -f and --first-only are in all cases either
no-op or ignored.
Without --tabs, --first-only is the default so specifying it is a no-op.
With --tabs, --all is implied, and --first-only is intended to reset this.

function                                             old     new   delta
expand_main                                          690     694      +4

Signed-off-by: Mark Edgar <medgar123@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/expand.c
testsuite/unexpand.tests

index 4fa974df8ac9b0ebf0669c9aa5bdf271d4027277..5f599392149e5f77ce8b9c2c1f69ea7e1b816155 100644 (file)
@@ -160,7 +160,7 @@ static void unexpand(FILE *file, unsigned tab_size, unsigned opt)
                                        putchar('\t');
                        }
 
-                       if ((opt & OPT_INITIAL) && ptr != line) {
+                       if (!(opt & OPT_ALL) && ptr != line) {
                                printf("%*s%s", len, "", ptr);
                                break;
                        }
@@ -207,13 +207,13 @@ int expand_main(int argc UNUSED_PARAM, char **argv)
                                "ft:a"
                                "\0"
                                "ta" /* -t NUM sets -a */,
-                               "first-only\0"       No_argument       "i"
+                               "first-only\0"       No_argument       "f"
                                "tabs\0"             Required_argument "t"
                                "all\0"              No_argument       "a"
                                , &opt_t
                );
-               /* -f --first-only is the default */
-               if (!(opt & OPT_ALL)) opt |= OPT_INITIAL;
+               /* -t implies -a, but an explicit -f overrides */
+               if (opt & OPT_INITIAL) opt &= ~OPT_ALL;
        }
        tab_size = xatou_range(opt_t, 1, UINT_MAX);
 
index 7b326dc2cb0901d113b0fe6348d942c48cccccc6..4ab693ec842afcd1a85bfe8fba52c777d92fe4bb 100755 (executable)
@@ -31,6 +31,39 @@ testing "unexpand case 7" "unexpand" \
 testing "unexpand case 8" "unexpand" \
        "a b\n" "" "a b\n" \
 
+testcase()
+{
+    testing "unexpand flags $*" "unexpand $*" \
+        "$want" "" '        a       b    c'
+}
+
+# tabs=8, Convert only leading sequences of blanks
+want='\ta       b    c'
+testcase
+testcase -f
+testcase -f -t8
+testcase -t8 -f
+testcase -t8 --first-only
+
+# tabs=8, Convert all blanks
+want='\ta\tb    c'
+testcase -a
+testcase -t8
+testcase -a -t8
+
+# tabs=4, Convert all blanks
+want='\t\ta\t\tb\t c'
+testcase -t4
+testcase -a -t4
+testcase -t4 -a
+
+# tabs=4, Convert only leading sequences of blanks
+want='\t\ta       b    c'
+testcase -t4 -f
+testcase -f -t4
+testcase -t4 --first-only
+testcase --first-only -t4
+
 test x"$CONFIG_UNICODE_SUPPORT" = x"y" \
 && test x"$CONFIG_UNICODE_USING_LOCALE" != x"y" \
 && testing "unexpand with unicode characher 0x394" "unexpand" \