##
##  table -- Pretty-print a field-separated list as a table
##  Copyright (c) 1998-2002 Ralf S. Engelschall <rse@engelschall.com>
##  Originally written for Apache
##
##  This file is part of shtool and 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
##  2 of the License, or (at your option) any later version.
##
##  This file 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, write to the Free Software
##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
##

str_tool="table"
str_usage="[-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns <cols>] [-s|--strip <strip>] <str><sep><str>..."
arg_spec="1+"
opt_spec="F:w:c:s:"
opt_alias="F:field-sep,w:width,c:columns,s:strip"
opt_F=":"
opt_w=15
opt_c=3
opt_s=79

. ./sh.common

if [ $opt_c -gt 4 ]; then
    echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2
    exit 1
fi
case "x$opt_F" in
    x? ) ;;
    *  ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; exit 1 ;;
esac

#   split the list into a table
list=`
    IFS="$opt_F"
    for entry in $*; do
        if [ ".$entry" != . ]; then
            echo "$entry"
        fi
    done |\
    awk "
        BEGIN { list = \"\"; n = 0; }
        {
            list = list \\$1;
            n = n + 1;
            if (n < $opt_c) {
                list = list \":\";
            }
            if (n == $opt_c) {
                list = list \"\\n\";
                n = 0;
            }
        }
        END { print list; }
     "
`

#   format table cells and make sure table
#   doesn't exceed maximum width
OIFS="$IFS"
IFS='
'
for entry in $list; do
    case $opt_c in
        1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;;
        2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;;
        3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;;
        4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
    esac
done |\
awk "{
    if (length(\$0) > $opt_s) {
        printf(\"%s\\n\", substr(\$0, 0, $opt_s-1));
    } else {
        print \$0;
    }
}"
IFS="$OIFS"

