#!/bin/sh

TMP=${TMP-/tmp}
AWK=${AWK-awk}

F1=$TMP/mpr.fl1.$$
F2=$TMP/mpr.fl2.$$
fofiles=

while test $# -gt 0; do
	case "$1" in
		-F )	fofiles=$2; shift;;
		-F*)	fofiles=`echo $1 | sed 's/-F//'`;;
		--)	shift; break;;
		-*)	echo "mprfl: ignoring unknown option $1" >&2;;
		*)	break;;
	esac
	shift
done

if test $# -ne 1 -a $# -ne 2; then
	echo "usage: mprfl [-F foo.c,bar.c,..] a.out [log]" >&2
	exit 1
fi

aout=$1
shift

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

status=1
set -e

# reliably clean up after ourselves
trap 'set +e; rm -f $F1 $F2; trap 0; exit $status' 0 1 2 15

$MPRFILTER |

$AWK -F: '
	function savepc(n, i) { for (i=2; i<=n; i++) pc[$i]=1 }
	/^m/ { savepc(NF-2) }
	/^r/ { savepc(NF-3) }
	/^f/ { savepc(NF-1) }
	END  { for (i in pc) print i }
' |

sort -n | tee $F1 |

(
	echo set width 0
	$AWK '{ printf "info line *%d\n", $1-1 }'
) |

gdb -nx -r -q $aout 2>/dev/null | sed 's/(gdb) //g' |

$AWK '
	/^Line/ {
		gsub("\"", "", $4)
		printf "%s\t%s\n", $4, $2
		next
	}

	/^No line/ {
		print "xxx"	# needed for paste
		next
	}

	# unexpected output from gdb -> bail out
	{
		printf "*** mprfl: unexpected output from gdb\n" |"cat 1>&2"
		printf "*** mprfl: [%s]\n", $0 |"cat 1>&2"
		exit 1
	}

' >$F2

paste $F1 $F2 | sed '/xxx$/d' |

if test "$fofiles" != ""; then
	select=`echo $fofiles | tr ', ' '||' | sed -e 's%/%\\\\/%g' -e 's%\.%\\\\.%g'`
	$AWK -F"	" '$2 ~ /^('$select')$/'
else
	cat
fi

status=0	# trap handles exit
