#!/sbin/sh
#ident	"$Revision: 1.2 $"

PROG=`basename $0`
USAGE="Usage: $PROG [-abidir DIR -missing -extra -libname NAME] file"
CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
TMPDIR=${TMPDIR:-/var/tmp}
OUTPUT=$TMPDIR/output.$$
CHECKFILE=$TMPDIR/check.$$
TMPOUTPUT=$TMPDIR/tmpoutput.$$
MISSING=1
EXTRA=1
LIBNAME_GIVEN=0

trap "rm -f $OUTPUT $CHECKFILE $TMPOUTPUT; exit 1" 1 2 13 15

while [ $# -gt 1 ]
do
	case "$1" in
	-libname)
		LIBNAME_GIVEN=1;
		shift;
		if [ $# -gt 1 ]
		then
			LIBNAME=$1; shift
		else
			echo $USAGE >&2
			exit 1;
		fi;;
	-abidir)
		shift;
		if [ $# -gt 1 ]
		then
			CHECKER_ABIDIR=$1; shift
		else
			echo $USAGE >&2
			exit 1;
		fi;;
	-missing)
		MISSING=1;
		EXTRA=0;
		shift;;
	-extra)
		MISSING=0;
		EXTRA=1;
		shift;;
	*)	
		echo $USAGE >&2
		exit 1;;
	esac
done


if [ $# -ne 1 ]
then
	echo $USAGE >&2
	exit 1
fi

if [ ! -f $1 ]
then
	echo "$PROG: cannot access file $1" >&2
	exit 1
fi

if [ $LIBNAME_GIVEN -eq 0 ]
then
	LIBNAME=`basename $1`
fi

nm -p $1 | sed -e "s/^[0-9A-Za-z]* //p" -e "s/^[ 	]*//p" | awk '\
	BEGIN { prev = 1 } \
	NF == 0 { prev = 0 } \
	NF > 0 { \
		if (prev != 0) { \
			print $0 \
		} else { \
			prev = 1 \
		} \
	}' | awk '{ \
			if (($1 == "T") || \
				($1 == "D") || \
				($1 == "B") || \
				($1 == "A") || \
				($1 == "G") || \
				($1 == "S") || \
				($1 == "R") || \
				($1 == "C") || \
				($1 == "E")) { \
				print $2 \
			} \
		}' | sort -u | egrep -v "^\.bss$|^\.data$|^\.rdata$|^\.sbss$|^\.sdata$|^\.text$" > $OUTPUT

if [ $MISSING -eq 1 ] || [ $EXTRA -eq 1 ]
then
	grep -v "^#" $CHECKER_ABIDIR/$LIBNAME.names | sort -u > $CHECKFILE
fi

if [ $MISSING -eq 1 ]
then
	comm -23 $CHECKFILE $OUTPUT > $TMPOUTPUT
	if [ `wc -l < $TMPOUTPUT` -ne 0 ]
	then
		if [ $EXTRA -eq 1 ]
		then
			echo "The following ABI routines are missing from the library:"
		fi
		cat $TMPOUTPUT
	fi
fi


if  [ $EXTRA -eq 1 ]
then
	comm -13 $CHECKFILE $OUTPUT | grep -v "^_" > $TMPOUTPUT
	if [ `wc -l < $TMPOUTPUT` -ne 0 ]
	then
		if [ $MISSING -eq 1 ]
		then
			echo "\nThe following public routines are not part of the ABI:"
		fi
		cat $TMPOUTPUT
	fi
fi

rm -f $OUTPUT $CHECKFILE $TMPOUTPUT
