11.1Smrg#!/bin/sh -
21.1Smrg#
31.5Sjoerg# $NetBSD: zdiff,v 1.5 2010/04/14 20:30:28 joerg Exp $
41.2Swiz#
51.1Smrg# $OpenBSD: zdiff,v 1.2 2003/07/29 07:42:44 otto Exp $
61.1Smrg#
71.1Smrg# Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
81.4Sjoerg# Copyright (c) 2010 Joerg Sonnenberger <joerg@NetBSD.org>
91.1Smrg#
101.1Smrg# Permission to use, copy, modify, and distribute this software for any
111.1Smrg# purpose with or without fee is hereby granted, provided that the above
121.1Smrg# copyright notice and this permission notice appear in all copies.
131.1Smrg#
141.1Smrg# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
151.1Smrg# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
161.1Smrg# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
171.1Smrg# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
181.1Smrg# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
191.1Smrg# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
201.1Smrg# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
211.1Smrg#
221.1Smrg# Sponsored in part by the Defense Advanced Research Projects
231.1Smrg# Agency (DARPA) and Air Force Research Laboratory, Air Force
241.1Smrg# Materiel Command, USAF, under agreement number F39502-99-1-0512.
251.1Smrg#
261.1Smrg
271.1Smrg# Set $prog based on $0
281.1Smrgcase $0 in
291.1Smrg	*cmp)	prog=cmp
301.1Smrg		;;
311.1Smrg	*)	prog=diff
321.1Smrg		;;
331.1Smrgesac
341.4SjoergUSAGE="usage: $0 [options] file1 [file2]"
351.4Sjoerg
361.4Sjoergcheck_suffix() {
371.4Sjoerg	case "$1" in
381.4Sjoerg	*[._-][Zz])
391.4Sjoerg		setvar $2 "${1%??}"
401.4Sjoerg		setvar $3 "gzip -cdqf"
411.4Sjoerg		;;
421.4Sjoerg	*[._-]bz)
431.4Sjoerg		setvar $2 "${1%???}"
441.4Sjoerg		setvar $3 "bzip2 -cdqf"
451.4Sjoerg		;;
461.4Sjoerg	*[._-]gz)
471.4Sjoerg		setvar $2 "${1%???}"
481.4Sjoerg		setvar $3 "gzip -cdqf"
491.4Sjoerg		;;
501.4Sjoerg	*[._-]xz)
511.4Sjoerg		setvar $2 "${1%???}"
521.4Sjoerg		setvar $3 "xz -cdqf"
531.4Sjoerg		;;
541.4Sjoerg	*[._-]bz2)
551.4Sjoerg		setvar $2 "${1%????}"
561.4Sjoerg		setvar $3 "bzip2 -cdqf"
571.4Sjoerg		;;
581.4Sjoerg	*[._-]lzma)
591.4Sjoerg		setvar $2 "${1%?????}"
601.4Sjoerg		setvar $3 "xz -cdqf"
611.4Sjoerg		;;
621.4Sjoerg	*.t[ag]z)
631.4Sjoerg		setvar $2 "${1%??}"ar
641.4Sjoerg		setvar $3 "gzip -cdqf"
651.4Sjoerg		;;
661.4Sjoerg	*.tbz)
671.4Sjoerg		setvar $2 "${1%??}"ar
681.4Sjoerg		setvar $3 "bzip2 -cdqf"
691.4Sjoerg		;;
701.4Sjoerg	*.tbz2)
711.4Sjoerg		setvar $2 "${1%???}"ar
721.4Sjoerg		setvar $3 "bzip2 -cdqf"
731.4Sjoerg		;;
741.4Sjoerg	*.t[lx]z)
751.4Sjoerg		setvar $2 "${1%??}"ar
761.4Sjoerg		setvar $3 "xz -cdqf"
771.4Sjoerg		;;
781.4Sjoerg	*)
791.4Sjoerg		setvar $2 "$1"
801.4Sjoerg		setvar $3 ""
811.4Sjoerg		;;
821.4Sjoerg	esac
831.4Sjoerg}
841.4Sjoerg
851.1Smrg
861.1Smrg# Pull out any command line flags so we can pass them to diff/cmp
871.1Smrg# XXX - assumes there is no optarg
881.1Smrgflags=
891.1Smrgwhile test $# -ne 0; do
901.1Smrg	case "$1" in
911.1Smrg		--)
921.1Smrg			shift
931.1Smrg			break
941.1Smrg			;;
951.4Sjoerg		-)
961.4Sjoerg			break
971.4Sjoerg			;;
981.1Smrg		-*)
991.1Smrg			flags="$flags $1"
1001.1Smrg			shift
1011.1Smrg			;;
1021.1Smrg		*)
1031.1Smrg			break
1041.1Smrg			;;
1051.1Smrg	esac
1061.1Smrgdone
1071.1Smrg
1081.1Smrgif [ $# -eq 1 ]; then
1091.1Smrg	# One file given, compare compressed to uncompressed
1101.1Smrg	files="$1"
1111.4Sjoerg	check_suffix "$1" files filt
1121.4Sjoerg	if [ -z "$filt" ]; then
1131.4Sjoerg		echo "z$prog: unknown suffix" 1>&2
1141.4Sjoerg		exit 1
1151.4Sjoerg	fi
1161.5Sjoerg	$filt -- "$1" | $prog $flags -- - "$files"
1171.1Smrg	status=$?
1181.1Smrgelif [ $# -eq 2 ]; then
1191.1Smrg	# Two files given, compare the two uncompressing as needed
1201.4Sjoerg	check_suffix "$1" files filt
1211.4Sjoerg	check_suffix "$2" files2 filt2
1221.4Sjoerg	if [ -z "$filt" -a -z "$filt2" ]; then
1231.5Sjoerg		$prog $flags -- "$1" "$2"
1241.4Sjoerg	elif [ -z "$filt" -a -n "$filt2" -a "$1" != "-" ]; then
1251.5Sjoerg		$filt2 -- "$2" | $prog $flags -- "$1" -
1261.4Sjoerg	elif [ -n "$filt" -a -z "$filt2" -a "$2" != "-" ]; then
1271.5Sjoerg		$filt -- "$1" | $prog $flags -- - "$2"
1281.1Smrg	else
1291.4Sjoerg		tmp=`mktemp -t z$prog.XXXXXXXXXX` || exit 1
1301.4Sjoerg		trap "rm -f $tmp" 0 1 2 3 13 15
1311.5Sjoerg		${filt2:-cat} -- "$2" > $tmp || exit $?
1321.5Sjoerg		${filt:-cat} -- "$1" | $prog $flags -- - "$tmp"
1331.1Smrg	fi
1341.1Smrg	status=$?
1351.1Smrgelse
1361.1Smrg	echo "$USAGE" 1>&2
1371.1Smrg	exit 1
1381.1Smrgfi
1391.1Smrg
1401.1Smrgexit $status
141