#!/bin/sh

TMP=${TMP-/tmp}

F1=$TMP/mpr.fl.$$
F2=$TMP/mpr.fl2.$$

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

status=1
set -e

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

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 $1 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 " $2" != " "; then
	select=`echo $2 | tr ', ' '||' | sed -e 's%/%\\\\/%g' -e 's%\.%\\\\.%g'`
	awk -F"	" '$2 ~ /^('$select')$/'
else
	cat
fi

status=0	# trap handles exit
