xref: /minix3/usr.bin/gzip/zdiff (revision 5a645f22a86f086849945a5dd6acbf59f38c913a)
1*5a645f22SBen Gras#!/bin/sh -
2*5a645f22SBen Gras#
3*5a645f22SBen Gras# $NetBSD: zdiff,v 1.5 2010/04/14 20:30:28 joerg Exp $
4*5a645f22SBen Gras#
5*5a645f22SBen Gras# $OpenBSD: zdiff,v 1.2 2003/07/29 07:42:44 otto Exp $
6*5a645f22SBen Gras#
7*5a645f22SBen Gras# Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
8*5a645f22SBen Gras# Copyright (c) 2010 Joerg Sonnenberger <joerg@NetBSD.org>
9*5a645f22SBen Gras#
10*5a645f22SBen Gras# Permission to use, copy, modify, and distribute this software for any
11*5a645f22SBen Gras# purpose with or without fee is hereby granted, provided that the above
12*5a645f22SBen Gras# copyright notice and this permission notice appear in all copies.
13*5a645f22SBen Gras#
14*5a645f22SBen Gras# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15*5a645f22SBen Gras# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16*5a645f22SBen Gras# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17*5a645f22SBen Gras# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18*5a645f22SBen Gras# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19*5a645f22SBen Gras# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20*5a645f22SBen Gras# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21*5a645f22SBen Gras#
22*5a645f22SBen Gras# Sponsored in part by the Defense Advanced Research Projects
23*5a645f22SBen Gras# Agency (DARPA) and Air Force Research Laboratory, Air Force
24*5a645f22SBen Gras# Materiel Command, USAF, under agreement number F39502-99-1-0512.
25*5a645f22SBen Gras#
26*5a645f22SBen Gras
27*5a645f22SBen Gras# Set $prog based on $0
28*5a645f22SBen Grascase $0 in
29*5a645f22SBen Gras	*cmp)	prog=cmp
30*5a645f22SBen Gras		;;
31*5a645f22SBen Gras	*)	prog=diff
32*5a645f22SBen Gras		;;
33*5a645f22SBen Grasesac
34*5a645f22SBen GrasUSAGE="usage: $0 [options] file1 [file2]"
35*5a645f22SBen Gras
36*5a645f22SBen Grascheck_suffix() {
37*5a645f22SBen Gras	case "$1" in
38*5a645f22SBen Gras	*[._-][Zz])
39*5a645f22SBen Gras		setvar $2 "${1%??}"
40*5a645f22SBen Gras		setvar $3 "gzip -cdqf"
41*5a645f22SBen Gras		;;
42*5a645f22SBen Gras	*[._-]bz)
43*5a645f22SBen Gras		setvar $2 "${1%???}"
44*5a645f22SBen Gras		setvar $3 "bzip2 -cdqf"
45*5a645f22SBen Gras		;;
46*5a645f22SBen Gras	*[._-]gz)
47*5a645f22SBen Gras		setvar $2 "${1%???}"
48*5a645f22SBen Gras		setvar $3 "gzip -cdqf"
49*5a645f22SBen Gras		;;
50*5a645f22SBen Gras	*[._-]xz)
51*5a645f22SBen Gras		setvar $2 "${1%???}"
52*5a645f22SBen Gras		setvar $3 "xz -cdqf"
53*5a645f22SBen Gras		;;
54*5a645f22SBen Gras	*[._-]bz2)
55*5a645f22SBen Gras		setvar $2 "${1%????}"
56*5a645f22SBen Gras		setvar $3 "bzip2 -cdqf"
57*5a645f22SBen Gras		;;
58*5a645f22SBen Gras	*[._-]lzma)
59*5a645f22SBen Gras		setvar $2 "${1%?????}"
60*5a645f22SBen Gras		setvar $3 "xz -cdqf"
61*5a645f22SBen Gras		;;
62*5a645f22SBen Gras	*.t[ag]z)
63*5a645f22SBen Gras		setvar $2 "${1%??}"ar
64*5a645f22SBen Gras		setvar $3 "gzip -cdqf"
65*5a645f22SBen Gras		;;
66*5a645f22SBen Gras	*.tbz)
67*5a645f22SBen Gras		setvar $2 "${1%??}"ar
68*5a645f22SBen Gras		setvar $3 "bzip2 -cdqf"
69*5a645f22SBen Gras		;;
70*5a645f22SBen Gras	*.tbz2)
71*5a645f22SBen Gras		setvar $2 "${1%???}"ar
72*5a645f22SBen Gras		setvar $3 "bzip2 -cdqf"
73*5a645f22SBen Gras		;;
74*5a645f22SBen Gras	*.t[lx]z)
75*5a645f22SBen Gras		setvar $2 "${1%??}"ar
76*5a645f22SBen Gras		setvar $3 "xz -cdqf"
77*5a645f22SBen Gras		;;
78*5a645f22SBen Gras	*)
79*5a645f22SBen Gras		setvar $2 "$1"
80*5a645f22SBen Gras		setvar $3 ""
81*5a645f22SBen Gras		;;
82*5a645f22SBen Gras	esac
83*5a645f22SBen Gras}
84*5a645f22SBen Gras
85*5a645f22SBen Gras
86*5a645f22SBen Gras# Pull out any command line flags so we can pass them to diff/cmp
87*5a645f22SBen Gras# XXX - assumes there is no optarg
88*5a645f22SBen Grasflags=
89*5a645f22SBen Graswhile test $# -ne 0; do
90*5a645f22SBen Gras	case "$1" in
91*5a645f22SBen Gras		--)
92*5a645f22SBen Gras			shift
93*5a645f22SBen Gras			break
94*5a645f22SBen Gras			;;
95*5a645f22SBen Gras		-)
96*5a645f22SBen Gras			break
97*5a645f22SBen Gras			;;
98*5a645f22SBen Gras		-*)
99*5a645f22SBen Gras			flags="$flags $1"
100*5a645f22SBen Gras			shift
101*5a645f22SBen Gras			;;
102*5a645f22SBen Gras		*)
103*5a645f22SBen Gras			break
104*5a645f22SBen Gras			;;
105*5a645f22SBen Gras	esac
106*5a645f22SBen Grasdone
107*5a645f22SBen Gras
108*5a645f22SBen Grasif [ $# -eq 1 ]; then
109*5a645f22SBen Gras	# One file given, compare compressed to uncompressed
110*5a645f22SBen Gras	files="$1"
111*5a645f22SBen Gras	check_suffix "$1" files filt
112*5a645f22SBen Gras	if [ -z "$filt" ]; then
113*5a645f22SBen Gras		echo "z$prog: unknown suffix" 1>&2
114*5a645f22SBen Gras		exit 1
115*5a645f22SBen Gras	fi
116*5a645f22SBen Gras	$filt -- "$1" | $prog $flags -- - "$files"
117*5a645f22SBen Gras	status=$?
118*5a645f22SBen Graselif [ $# -eq 2 ]; then
119*5a645f22SBen Gras	# Two files given, compare the two uncompressing as needed
120*5a645f22SBen Gras	check_suffix "$1" files filt
121*5a645f22SBen Gras	check_suffix "$2" files2 filt2
122*5a645f22SBen Gras	if [ -z "$filt" -a -z "$filt2" ]; then
123*5a645f22SBen Gras		$prog $flags -- "$1" "$2"
124*5a645f22SBen Gras	elif [ -z "$filt" -a -n "$filt2" -a "$1" != "-" ]; then
125*5a645f22SBen Gras		$filt2 -- "$2" | $prog $flags -- "$1" -
126*5a645f22SBen Gras	elif [ -n "$filt" -a -z "$filt2" -a "$2" != "-" ]; then
127*5a645f22SBen Gras		$filt -- "$1" | $prog $flags -- - "$2"
128*5a645f22SBen Gras	else
129*5a645f22SBen Gras		tmp=`mktemp -t z$prog.XXXXXXXXXX` || exit 1
130*5a645f22SBen Gras		trap "rm -f $tmp" 0 1 2 3 13 15
131*5a645f22SBen Gras		${filt2:-cat} -- "$2" > $tmp || exit $?
132*5a645f22SBen Gras		${filt:-cat} -- "$1" | $prog $flags -- - "$tmp"
133*5a645f22SBen Gras	fi
134*5a645f22SBen Gras	status=$?
135*5a645f22SBen Graselse
136*5a645f22SBen Gras	echo "$USAGE" 1>&2
137*5a645f22SBen Gras	exit 1
138*5a645f22SBen Grasfi
139*5a645f22SBen Gras
140*5a645f22SBen Grasexit $status
141