[hackers] [sbase] tr: Fix multiple ranges with different lengths (Michael Forney) || Laslo Hunhold

From: <git_AT_suckless.org>
Date: Fri, 18 Nov 2016 12:47:13 +0100 (CET)

commit fb11173926bc783bc70b8e848368eaa97915e54f
Author: Laslo Hunhold <dev_AT_frign.de>
AuthorDate: Fri Nov 18 12:45:59 2016 +0100
Commit: Laslo Hunhold <dev_AT_frign.de>
CommitDate: Fri Nov 18 12:45:59 2016 +0100

    tr: Fix multiple ranges with different lengths (Michael Forney)
    
    See his description below. Thanks Michael!
    
    ---
    A bug was introduced in bc4c293fe59de042c1ac71793d33bb685c4fb915 causing the
    range length for the next set to be used instead of the first one. This causes
    issues when choosing the replacement rune when the ranges are of different
    lengths.
    
    Current behavior:
    
    $ echo 1234 | tr 'a-f1-4' '1-6a-d'
    56ab
    
    Correct behavior:
    
    $ echo 1234 | tr 'a-f1-4' '1-6a-d'
    abcd
    
    This also fixes range expressions in the form [a-z], which get encoded as four
    ranges '[', 'a'..'z', ']', causing all a-z characters to get mapped to ']'. This
    form is occasionally used in shell scripts, including the syscalltbl.sh script
    used to build linux.
    ---

diff --git a/tr.c b/tr.c
index a633d74..c235215 100644
--- a/tr.c
+++ b/tr.c
_AT_@ -213,7 +213,7 @@ read:
         }
         if (argc == 1 && sflag)
                 goto write;
- for (i = 0, off1 = 0; i < set1ranges; i++, off1 += rangelen(set1[i])) {
+ for (i = 0, off1 = 0; i < set1ranges; off1 += rangelen(set1[i]), i++) {
                 if (set1[i].start <= r && r <= set1[i].end) {
                         if (dflag) {
                                 if (cflag)
Received on Fri Nov 18 2016 - 12:47:13 CET

This archive was generated by hypermail 2.3.0 : Fri Nov 18 2016 - 12:48:15 CET