xref: /netbsd-src/usr.bin/gzip/zdiff (revision 70729907f6fc12525a8e123fbba223e189512300)
15ddb4360Smrg#!/bin/sh -
25ddb4360Smrg#
3*70729907Sjoerg# $NetBSD: zdiff,v 1.5 2010/04/14 20:30:28 joerg Exp $
43a92ef57Swiz#
55ddb4360Smrg# $OpenBSD: zdiff,v 1.2 2003/07/29 07:42:44 otto Exp $
65ddb4360Smrg#
75ddb4360Smrg# Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
868128a56Sjoerg# Copyright (c) 2010 Joerg Sonnenberger <joerg@NetBSD.org>
95ddb4360Smrg#
105ddb4360Smrg# Permission to use, copy, modify, and distribute this software for any
115ddb4360Smrg# purpose with or without fee is hereby granted, provided that the above
125ddb4360Smrg# copyright notice and this permission notice appear in all copies.
135ddb4360Smrg#
145ddb4360Smrg# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
155ddb4360Smrg# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
165ddb4360Smrg# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
175ddb4360Smrg# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
185ddb4360Smrg# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
195ddb4360Smrg# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
205ddb4360Smrg# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
215ddb4360Smrg#
225ddb4360Smrg# Sponsored in part by the Defense Advanced Research Projects
235ddb4360Smrg# Agency (DARPA) and Air Force Research Laboratory, Air Force
245ddb4360Smrg# Materiel Command, USAF, under agreement number F39502-99-1-0512.
255ddb4360Smrg#
265ddb4360Smrg
275ddb4360Smrg# Set $prog based on $0
285ddb4360Smrgcase $0 in
295ddb4360Smrg	*cmp)	prog=cmp
305ddb4360Smrg		;;
315ddb4360Smrg	*)	prog=diff
325ddb4360Smrg		;;
335ddb4360Smrgesac
3468128a56SjoergUSAGE="usage: $0 [options] file1 [file2]"
3568128a56Sjoerg
3668128a56Sjoergcheck_suffix() {
3768128a56Sjoerg	case "$1" in
3868128a56Sjoerg	*[._-][Zz])
3968128a56Sjoerg		setvar $2 "${1%??}"
4068128a56Sjoerg		setvar $3 "gzip -cdqf"
4168128a56Sjoerg		;;
4268128a56Sjoerg	*[._-]bz)
4368128a56Sjoerg		setvar $2 "${1%???}"
4468128a56Sjoerg		setvar $3 "bzip2 -cdqf"
4568128a56Sjoerg		;;
4668128a56Sjoerg	*[._-]gz)
4768128a56Sjoerg		setvar $2 "${1%???}"
4868128a56Sjoerg		setvar $3 "gzip -cdqf"
4968128a56Sjoerg		;;
5068128a56Sjoerg	*[._-]xz)
5168128a56Sjoerg		setvar $2 "${1%???}"
5268128a56Sjoerg		setvar $3 "xz -cdqf"
5368128a56Sjoerg		;;
5468128a56Sjoerg	*[._-]bz2)
5568128a56Sjoerg		setvar $2 "${1%????}"
5668128a56Sjoerg		setvar $3 "bzip2 -cdqf"
5768128a56Sjoerg		;;
5868128a56Sjoerg	*[._-]lzma)
5968128a56Sjoerg		setvar $2 "${1%?????}"
6068128a56Sjoerg		setvar $3 "xz -cdqf"
6168128a56Sjoerg		;;
6268128a56Sjoerg	*.t[ag]z)
6368128a56Sjoerg		setvar $2 "${1%??}"ar
6468128a56Sjoerg		setvar $3 "gzip -cdqf"
6568128a56Sjoerg		;;
6668128a56Sjoerg	*.tbz)
6768128a56Sjoerg		setvar $2 "${1%??}"ar
6868128a56Sjoerg		setvar $3 "bzip2 -cdqf"
6968128a56Sjoerg		;;
7068128a56Sjoerg	*.tbz2)
7168128a56Sjoerg		setvar $2 "${1%???}"ar
7268128a56Sjoerg		setvar $3 "bzip2 -cdqf"
7368128a56Sjoerg		;;
7468128a56Sjoerg	*.t[lx]z)
7568128a56Sjoerg		setvar $2 "${1%??}"ar
7668128a56Sjoerg		setvar $3 "xz -cdqf"
7768128a56Sjoerg		;;
7868128a56Sjoerg	*)
7968128a56Sjoerg		setvar $2 "$1"
8068128a56Sjoerg		setvar $3 ""
8168128a56Sjoerg		;;
8268128a56Sjoerg	esac
8368128a56Sjoerg}
8468128a56Sjoerg
855ddb4360Smrg
865ddb4360Smrg# Pull out any command line flags so we can pass them to diff/cmp
875ddb4360Smrg# XXX - assumes there is no optarg
885ddb4360Smrgflags=
895ddb4360Smrgwhile test $# -ne 0; do
905ddb4360Smrg	case "$1" in
915ddb4360Smrg		--)
925ddb4360Smrg			shift
935ddb4360Smrg			break
945ddb4360Smrg			;;
9568128a56Sjoerg		-)
9668128a56Sjoerg			break
9768128a56Sjoerg			;;
985ddb4360Smrg		-*)
995ddb4360Smrg			flags="$flags $1"
1005ddb4360Smrg			shift
1015ddb4360Smrg			;;
1025ddb4360Smrg		*)
1035ddb4360Smrg			break
1045ddb4360Smrg			;;
1055ddb4360Smrg	esac
1065ddb4360Smrgdone
1075ddb4360Smrg
1085ddb4360Smrgif [ $# -eq 1 ]; then
1095ddb4360Smrg	# One file given, compare compressed to uncompressed
1105ddb4360Smrg	files="$1"
11168128a56Sjoerg	check_suffix "$1" files filt
11268128a56Sjoerg	if [ -z "$filt" ]; then
11368128a56Sjoerg		echo "z$prog: unknown suffix" 1>&2
1145ddb4360Smrg		exit 1
11568128a56Sjoerg	fi
116*70729907Sjoerg	$filt -- "$1" | $prog $flags -- - "$files"
1175ddb4360Smrg	status=$?
1185ddb4360Smrgelif [ $# -eq 2 ]; then
1195ddb4360Smrg	# Two files given, compare the two uncompressing as needed
12068128a56Sjoerg	check_suffix "$1" files filt
12168128a56Sjoerg	check_suffix "$2" files2 filt2
12268128a56Sjoerg	if [ -z "$filt" -a -z "$filt2" ]; then
123*70729907Sjoerg		$prog $flags -- "$1" "$2"
12468128a56Sjoerg	elif [ -z "$filt" -a -n "$filt2" -a "$1" != "-" ]; then
125*70729907Sjoerg		$filt2 -- "$2" | $prog $flags -- "$1" -
12668128a56Sjoerg	elif [ -n "$filt" -a -z "$filt2" -a "$2" != "-" ]; then
127*70729907Sjoerg		$filt -- "$1" | $prog $flags -- - "$2"
12868128a56Sjoerg	else
1295ddb4360Smrg		tmp=`mktemp -t z$prog.XXXXXXXXXX` || exit 1
1305ddb4360Smrg		trap "rm -f $tmp" 0 1 2 3 13 15
131*70729907Sjoerg		${filt2:-cat} -- "$2" > $tmp || exit $?
132*70729907Sjoerg		${filt:-cat} -- "$1" | $prog $flags -- - "$tmp"
1335ddb4360Smrg	fi
1345ddb4360Smrg	status=$?
1355ddb4360Smrgelse
1365ddb4360Smrg	echo "$USAGE" 1>&2
1375ddb4360Smrg	exit 1
1385ddb4360Smrgfi
1395ddb4360Smrg
1405ddb4360Smrgexit $status
141