#!/bin/sh

#
# This script checks for HAVE_ and ENABLE_ macros which are
# not included in config.h.in
#
# Usage:   checkconfig.sh <top_srcdir> <srcfile> [<srcfile> ...]
#
# Copyright (C) 2007 Matthias Koenig <mkoenig@suse.de>
# Copyright (C) 2008 Karel Zak <kzak@redhat.com>
#


die() {
	echo "error: $1"
	exit 1
}

usage() {
	echo "Usage:"
	echo " $0 <top_srcdir> <srcfile> [<srcfile> ...]"
	echo "Example:"
	echo " find . -name '*.c' | xargs $0 \$(git rev-parse --show-toplevel)"
}

if [ $# -eq 0 ]; then
	usage
	exit 1
fi
srcdir=$1
config="$srcdir/config.h.in"

[ -d "$srcdir" ] || die "$srcdir: not such directory."
[ -f "$config" ] || die "$config: not such file."

shift

while [ "$#" -ne 0 ]; do
	srcfile=$1
	shift

	[ ! -f "$srcfile" ] && continue;

	# Note that we use HAVE_ macros since util-linux-ng-2.14. The
	# previous version also have used ENABLE_ too.
	#
	# ENABLE_ and HAVE_ macros shouldn't be used for any other purpose than
	# for config/build options.
	#
	# Strip C/C++ comments to avoid false positives from
	# macros mentioned in comments (e.g. "when HAVE_FOO is ...")
	DEFINES=$(sed -e 's://.*::' \
		      -e 's:/\*.*\*/::g' \
		      $srcfile | \
		  sed -e '/\/\*/,/\*\//d' | \
		  sed -n -e 's/.*[ \t(]\+\(HAVE_[[:alnum:]]\+[^ \t);]*\).*/\1/p' \
			 -e 's/.*[ \t(]\+\(ENABLE_[[:alnum:]]\+[^ \t);]*\).*/\1/p' | \
		  sort -u)
	[ -z "$DEFINES" ] && continue

	for d in $DEFINES; do
		case $d in
		HAVE_CONFIG_H) continue
		   ;;
		*) grep -q "$d\( \|\>\)" $config || \
		     echo $(echo $srcfile | sed 's:\\'$srcdir/'::') ": $d"
	           ;;
		esac
	done
done
