#!/usr/bin/perl
###############################################################################
#	dux:	format 'du' output
#	written 18jan92 by Stefan Esser <se@ikp.uni-koeln.de>
#
$slash="\0"; # "/";

($progname) = ($0 =~ m!([^/]+)$!);
$arg = $ARGV[0] || ".";

$arg =~ s!/$!! unless $arg eq "/";
$argslashes = ($arg =~ tr!/!/!);

die "$progname: $arg: no such file or directory\n" unless -d $arg;

@DU=`du $arg 2>-`;
die "$progname: error executing 'du'\n" if $?;

# split du output for further processing
for (@DU) {
    ($size, $dir)   = split;

    ($name)         = ($dir =~ m!([^/]+)$!);
    $slashes        = ($dir =~ tr!/!$slash!) - $argslashes;

    $size{$dir}	    = $size;
    $name{$dir}     = $name;
    $slashes{$dir}  = $slashes;
}

# generate sort keys from pathname and subtree size
for $dir (sort keys(%name)) {
    $#SIZE          = $slashes{$dir} -1;
    push (@SIZE, sprintf ("%8d%s",99999999-$size{$dir},$name{$dir}));

    $cmp{$dir}    = "@SIZE\000";
}

sub du_order {
    $cmp{$a} cmp $cmp{$b};
}

for $dir (sort du_order keys(%name)) {
    $name = $slashes{$dir} ? $name{$dir} : $arg;

    printf " %s%8d %s\n","\t|" x $slashes{$dir}, $size{$dir}, $name;
}
