#!/usr/bin/ksh93
################################################################
#### Program: cmp_k93
####
#### Description: Emulation of the Unix "cmp" command
####
#### Author: Dana French (dfrench@mtxia.com)
#### Copyright 2004
####
#### Date: 07/22/2004
####
################################################################
function cmp_k93 {
typeset TRUE="0"
typeset FALSE="1"
typeset VERBOSE="${FALSE}"
typeset VERYVERB="${FALSE}"
typeset EXITCODE="${TRUE}"
typeset OPTION
typeset LINE1
typeset LINE2
while getopts ":vV" OPTION
do
case "${OPTION}" in
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'?') print "Syntax: cmp_k93 [-] file ..." && return 4 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
typeset FILE1="${1:?ERROR: First File not specified}"
typeset FILE2="${2:?ERROR: Second File not specified}"
#### Determine if the first file name is STDIN
typeset STDIN1="${FALSE}"
typeset UNIT1="3"
if [[ "_${FILE1}" = '_-' ]]
then
STDIN1="${TRUE}"
UNIT1="0"
fi
#### Determine if the second file name is STDIN
typeset STDIN2="${FALSE}"
typeset UNIT2="4"
if [[ "_${FILE2}" = '_-' ]]
then
STDIN2="${TRUE}"
UNIT2="0"
fi
(( STDIN1 == TRUE && STDIN2 == TRUE )) &&
print "ERROR: Only one file may be read from STDIN" &&
return 3
(( STDIN1 == FALSE )) && eval exec ${UNIT1}\<"${FILE1}"
(( STDIN2 == FALSE )) && eval exec ${UNIT2}\<"${FILE2}"
IFS=""
NUM="1"
while read -u ${UNIT1} -r -- LINE1
do
read -u ${UNIT2} -r -- LINE2
if [[ "${LINE1}" != "${LINE2}" ]]
then
EXITCODE="${FALSE}"
print -u2 "Files are different at line ${NUM}"
break
fi
(( NUM++ ))
done
(( STDIN1 == FALSE )) && eval exec ${UNIT1}\<\&-
if (( EXITCODE == TRUE )) && read -u ${UNIT2} -r -- LINE2
then
EXITCODE="${FALSE}"
print -u2 "Files are different at line ${NUM}"
fi
(( STDIN2 == FALSE )) && eval exec ${UNIT2}\<\&-
return ${EXITCODE}
}
################################################################
cmp_k93 "${@}"