#! /bin/sh
###  cols -- output in columns (# columns chosen automatically)
###  c2,c3,c4,c5,c6,c7,c8 -- output in 2, 3, 4, etc. columns
## USAGE:
##	% cat file | c2
##	% c2 file1 file2
##	% cols file1 file2
##	% c2 -d file1 file2
##
##	WITHOUT THE -d OPTION, cols AND THE OTHERS ORDER ITEMS
##	ACROSS THE SCREEN... THAT'S THE FASTEST WAY:
##		1	2	3	4	5
##		6	7	8	9	10
##	WITH THE -d OPTION, ITEMS WILL GO IN ORDER DOWN THE SCREEN:
##		1	3	5	7	9
##		2	4	6	8	10
##
##	PROGRAM GETS SCREEN WIDTH FROM THE $COLUMNS ENVARIABLE IF IT'S SET.
##	OTHERWISE, IT TRIES THE TERMCAP.  (SHOULD ALSO CHECK stty size.)

tcap="/usr/local/bin/tcap -a co"	# PROGRAM TO READ co
temp=/tmp/COLS$$
trap 'rm -f $temp; exit' 0 1 2 15

case "$1" in
-d)	dflag=y; shift;;
esac

# PUT FILES OR STDIN INTO TEMPORARY FILE WITH -rw------- MODE:
umask 077
cat ${1+"$@"} > $temp

# IF NAME IS cols, CHOOSE NUMBER OF COLUMNS; ELSE USE COMMAND NAME:
case "$0" in
*cols)
	# GET NUMBER OF COLUMNS ON TTY.  TRY ENVIRONMENT VARIABLE, THEN TERMCAP:
	case "$COLUMNS" in
	[1-9]*) width="$COLUMNS" ;;
	*)	# GET SCREEN WIDTH FROM TERMCAP AND SUBTRACT 2 (DEFAULT = 78).
		# THROW AWAY ERRORS:
		width=`$tcap 2> /dev/null`
		case "$?X$width" in	# case IS FASTER THAN if test
		0X[0-9][0-9]*) width=`expr $width - 2` ;;	# ZERO STATUS; USE WIDTH
		*)	width=78 ;;		# NON-ZERO STATUS; USE DEFAULT
		esac
		;;
	esac

	# CALCULATE NUMBER OF COLUMNS:
	nc=`awk "
		BEGIN { longest = 0 }
		{	if (length > longest)
				longest = length
		}
		END {
		# SHELL WILL PLUG IN WIDTH HERE:
		num = int ($width / (longest + 1))	# 1 SPACE BETWEEN COLUMNS
		if (num <= 8)
			print num
		else			# NO MORE THAN 8 COLUMNS
			print 8
		}" $temp`
	# IF ONLY ONE COLUMN, SPIT OUT FILES OR STDIN AND QUIT:
	case "$nc" in
	1)	cat $temp; exit;;
	esac
	;;
*[2-8])
	# NUMBER OF COLS. IS THE LAST CHAR. OF THE CALLING NAME (2, 3, 4, ETC.):
	nc=`expr "$0" : '.*\([2-8]\)$'`
	;;
*)	echo "$0: Help!  Shouldn't get here!" 1>&2; exit 1;;
esac

case "$dflag" in
y)	# LENGTH OF LISTING = ( number of lines / number of columns ) + 1
	pr -$nc -t -w$width -l`expr \( \`wc -l < $temp\` / $nc \) + 1` $temp
	;;
*)	pr -$nc -t -w$width -l1 $temp ;;
esac
