#!/bin/sh

MPRAWK=${MPRAWK-awk}

case "$#" in
0|1)	;;
*)	echo "usage: mprleak [log]" >&2
	exit 1;;
esac

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

trap 'exit 0' 13

$MPRFILTER |

$MPRAWK -F: '
	/^m/ {
		if ($NF)
			malloc[$NF]=sprintf("%d:%s", NR, $0)
	}
	/^f/ {
		if ($NF && !malloc[$NF])
			printf "mprleak: %s (NR=%d)\n", $0, NR |"cat 1>&2"
		delete malloc[$NF]
	}
	/^r/ {
		if ($(NF-1) && !malloc[$(NF-1)]) {
			printf "mprleak: %s (NR=%d)\n", $0, NR |"cat 1>&2"
			delete malloc[$(NF-1)]
		}
		if (!$(NF-2) || $NF)
			delete malloc[$(NF-1)]
		if ($NF)
			malloc[$NF]=sprintf("%d:%s", NR, $0)
	}
	END  {
		for (i in malloc)
			print malloc[i]
	}' |

sort -n -t: | cut -d: -f2- |

$MPRAWK -F: '
	/^m/ { if ($(NF-1)) print }
	/^r/ { if ($(NF-2)) print }'

exit 0
