#!/bin/sh

MPRAWK=${MPRAWK-awk}

chainlen=0
width=${COLUMNS-80}
blocksz=1024

for arg in "$@"; do
	case "$1" in
	-c ) 	chainlen=$2; shift;;
	-c*)	chainlen=`echo $1 | sed 's/-c//'`;;
	-w ) 	width=$2; shift;;
	-w*)	width=`echo $1 | sed 's/-w//'`;;
	-b ) 	blocksz=$2; shift;;
	-b*)	blocksz=`echo $1 | sed 's/-b//'`;;
	--)	shift; break;;
	-*)	echo "mprhisto: warning: ignoring unknown option $1" >&2;;
	*)	break;;
	esac
	shift
done

case "$#" in
0|1)	;;
*)	echo "usage: mprhisto [-c N] [-w N] [-b N] [log]" >&2
	exit 1;;
esac

MPRFILTER=`mprfilter mprhisto "$@"` || exit 1

trap 'exit 0' 13

$MPRFILTER |

$MPRAWK -F: -v blocksz=$blocksz -v chainlen=$chainlen -v width=$width '
	function histo(		n,i) {
		n = int(total/blocksz)
		if (n == lastn && !chainlen)
			return
		for (i=0; i<n; i++)
			printf "*"
		if (chainlen) {
			f = $1
			for (j=2; j<=chainlen+1 && j<=NF; j++)
				f = f":"$j
			printf("%*s\n", width-i, f)
		}
		else
			printf "\n"
		lastn = n
	}
	function malloc(n, p) {
		if (p) {
			size[p] = n
			total += n
			histo()
		}
	}
	function free(p) {
		total -= size[p]
		delete size[p]
		histo()
	}
	/^m/ { malloc($(NF-1), $NF) }
	/^f/ { free($NF) }
	/^r/ { free($(NF-1)); malloc($(NF-2), $NF) }'

exit 0
