#!/bin/sh

set -f					# protect against filename generation

prog="$0"

# is there any better way of getting a tab character?
tab=`printf "\t"`
# alternates are:
#	for (Solaris) /bin/sh:	tab="`echo ' \c' | tr ' ' '\t'`"
#	for /bin/bash:		tab=$'\t'
#	general:		tab=`awk 'END { printf "\t" }' < /dev/null`

# ==============================================================================

dodiffer() {
	# differ [diff-opts] filepath leftprefix rightprefix

	differOpts=""
	differCont=1
	while [ $# -gt 3 -a $differCont -eq 1 ]; do
		case "x$1" in
			x-*)	differOpts=$differOpts$tab$1
				shift
				;;
			*)	differCont=0 ;;
		esac
	done

	if [ "$#" != 3 ] ; then
		echo $prog DIFFER [opts] filepath leftprefix rightprefix >&2
		exit 1
	fi
	left=$1
	right=`echo $1 | sed -e s:$2:$3:`

	if [ -r $left ] && [ -r $right ]
	then
		cmp -s $left $right || \
		(echo diff $differOpts $left $right && \
		 diff $differOpts $left $right)
	fi
}

# ==============================================================================

usage() {
	progbase=`basename $prog`
	echo Usage:$tab$progbase [-diff-opts] [file-patterns] dir1 dir2 >&2
	echo "$tab$1" >&2
	exit 1
}

# ==============================================================================

if [ "x$1" = xDIFFER ] ; then
	shift
	dodiffer "$@"
	exit
fi

[ $# -lt 2 ] && usage "missing directories"	# invalid usage

# ==============================================================================

# pick up user-supplied patterns
pats=""
opts=""
while [ $# -gt 2 ]; do
	case "x$1" in
		x-*)	opts=$opts$tab$1
			;;
		*)	pats="$pats${tab}-o${tab}-name$tab$1";;
	esac
	shift
done

# supply our own if there were none
if [ "x$pats" = x ] ; then
	for pat in *.[cChH][+pP][+pP] *.[cChH] \
		   *.[cC][cC] *.[hH][hH] \
		   *.[iI][nN][lL] *.[dD][eE][fF] ; do
		pats="$pats${tab}-o${tab}-name$tab$1"
	done
	pats="${tab}-o${tab}-name${tab}*.cpp"
	pats="$pats${tab}-o${tab}-name${tab}*.h"
	pats="$pats${tab}-o${tab}-name${tab}*.inl"
	pats="$pats${tab}-o${tab}-name${tab}*.def"
fi
strip="s/${tab}-o//"
pats="`echo "$pats"|sed -e "$strip"`"

IFS="$tab"

[ -d $1 ] || usage "$1 is not a directory"
[ -d $2 ] || usage "$2 is not a directory"

find $1 -name CVS -prune -o \
	\( $pats \) \
	-exec $0 DIFFER $opts '{}' $1 $2 ';'
