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