OSSP CVS Repository

ossp - ossp-pkg/shtool/sh.table
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/shtool/sh.table
##
##  table -- Pretty-print a field-separated list as a table
##  Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
##
##  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
    shtool_exit 1
fi
case "x$opt_F" in
    x? ) ;;
    *  ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_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"

shtool_exit 0

##
##  manual page
##

=pod

=head1 NAME

B<shtool table> - B<GNU shtool> pretty-print a field-separated list

=head1 SYNOPSIS

B<shtool table>
[B<-F>|B<--field-sep> I<sep>]
[B<-w>|B<--width> I<width>]
[B<-c>|B<--columns> I<cols>]
[B<-s>|B<--strip> I<strip>]
I<str>B<sep>I<str>...

=head1 DESCRIPTION

This pretty-prints a list of strings as a table.

=head1 OPTIONS

The following command line options are available.

=over 4

=item B<-F>, B<--field-sep> I<sep>

Separate columns using I<sep>. Default is C<:>.

=item B<-w>, B<--width> I<width>

Width of each column. Default is 15 characters.

=item B<-c>, B<--columns> I<cols>

Number of columns. Default is C<3>.

=item B<-s>, B<--strip> I<strip>

Strip off any characters past I<strip>. Default is C<79>.

=back

=head1 EXAMPLE

 #   shell script
 shtool table -F , -w 5 -c 4 "1,2,3,4,5,6,7,8,9,10,11,12"

=head1 HISTORY

The B<GNU shtool> B<table> command was originally written by Ralf S.
Engelschall E<lt>rse@engelschall.comE<gt> in 1999 for B<GNU shtool>.

=head1 SEE ALSO

shtool(1), tr(1), fmt(1), sh(1), awk(1), sed(1).

=cut


CVSTrac 2.0.1