#!/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 ';'