#!/bin/sh
# NOTE: considers realloc(p, n) == malloc(n)

chainsz=1
width=80

while test $# -gt 0; do
	case "$1" in
		-w ) 	width=$2; shift;;
		-w*)	width=`echo $1 | sed 's/-w//'`;;
		-c ) 	chainsz=$2; shift;;
		-c*)	chainsz=`echo $1 | sed 's/-c//'`;;
		--)	shift; break;;
		*)	break;;
	esac
	shift
done

if test $# -ne 0; then
	echo "usage: mprcc [-c N] [-w N]" >&2
	exit 1
fi

awk -F: -v chainsz=$chainsz -v width=$width '

	function chain(n, ch) {
		if (!$NF)
			return
		if (n == 2)	# no frame pointers -> empty chains
			ch = "???"
		else {
			ch = $2
			for (i=1; i<chainsz && i<n-2; i++)
				ch = ch ":" $(2+i)
		}
		amt[ch] += $n
		num[ch]++
	}

	/^m/ {	chain(NF-1) }
	/^r/ {	chain(NF-2) }

	END  {	for (f in amt)
			printf "%-*s\t%-12d\t%-12d\n", width-24, f, num[f], amt[f]
	}' |

sort -t"	" -n +2 | sed 's/	//g'	# this dance handles C++

exit 0
