bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#9116: Bug in unexpand --all of <spaces><tab>


From: Pádraig Brady
Subject: bug#9116: Bug in unexpand --all of <spaces><tab>
Date: Mon, 18 Jul 2011 16:25:11 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100227 Thunderbird/3.0.3

On 18/07/11 12:18, Hallvard B Furuseth wrote:
> Unexpand --all of <7 printables, 2-8 spaces, tab, word> loses a tab.
> 
> perl -lwe 'print 1234567, " " x $_, "\t$_" for (1..9)' | unexpand --all
> -->
> 1234567       1
> 1234567       2
> 1234567       3
> 1234567       4
> 1234567       5
> 1234567       6
> 1234567       7
> 1234567       8
> 1234567                       9
> 
> Coreutils-8.12.  Old bug, has existed at least since version 6.8.

Yep, 5.97 has the same issue at least.
Interestingly the i18n patch gets it right:

$ printf "1234567        \t8\n" | unexpand -a
1234567         8
$ printf "1234567        \t8\n" | LANG=C unexpand -a
1234567 8

Looking at this for a few minutes suggests the following patch.
Though it's probably wrong, as I'm not sure why the current
code is not converting the trailing space in a field to a tab,
which is even enforced with test misc/unexpand::infloop-3.
Note the i18n patch does not maintain this trailing space,
nor does freebsd, which is what I'd expect.

$ printf "[ \t\t ]\n" | unexpand -t 2,3 | tr '\t ' ts
[ttts]
$ printf "[ \t\t ]\n" | LANG=C unexpand -t 2,3 | tr '\t ' ts
[stts]

I'll look at this later this evening.

cheers,
Pádraig.

diff --git a/src/unexpand.c b/src/unexpand.c
index 0014375..1489c4b 100644
--- a/src/unexpand.c
+++ b/src/unexpand.c
@@ -381,11 +381,14 @@ unexpand (void)

                           /* Discard pending blanks, unless it was a single
                              blank just before the previous tab stop.  */
-                          if (! (pending == 1 && one_blank_before_tab_stop))
+                          if (one_blank_before_tab_stop)
                             {
-                              pending = 0;
+                              pending = 1;
+                              pending_blank[0] = '\t';
                               one_blank_before_tab_stop = false;
                             }
+                          else
+                            pending = 0;
                         }
                       else
                         {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]