X-Git-Url: https://git.cworth.org/git?p=gzip;a=blobdiff_plain;f=zdiff.in;h=fda3259fe1a808d18d40e00e5337fc6b2aeebe55;hp=6194cf914176d1f60c9be6c07e97d9e5917a1860;hb=013796abf4c6be0bd130f541c0ece156156239c3;hpb=ce8afb6db89e58713e1758c1805abb5315b570ae diff --git a/zdiff.in b/zdiff.in index 6194cf9..fda3259 100644 --- a/zdiff.in +++ b/zdiff.in @@ -1,29 +1,40 @@ #!/bin/sh # sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh -# Zcmp and zdiff are used to invoke the cmp or the diff pro- -# gram on compressed files. All options specified are passed -# directly to cmp or diff. If only 1 file is specified, then -# the files compared are file1 and an uncompressed file1.gz. -# If two files are specified, then they are uncompressed (if -# necessary) and fed to cmp or diff. The exit status from cmp -# or diff is preserved. - -PATH="BINDIR:$PATH"; export PATH -case "$0" in - *cmp) prog=cmp ; comp=${CMP-cmp} ;; - *) prog=diff; comp=${DIFF-diff} ;; +# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation +# Copyright (C) 1993 Jean-loup Gailly + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +PATH=BINDIR:$PATH + +case $1 in + --__cmp) shift + prog=cmp; cmp='${CMP-cmp}' ;; + *) prog=diff; cmp='${DIFF-diff}';; esac version="z$prog (gzip) @VERSION@ -Copyright (C) 2006 Free Software Foundation, Inc. +Copyright (C) 2007 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. Written by Jean-loup Gailly." -usage="Usage: z$prog [OPTION]... FILE1 [FILE2] +usage="Usage: $0 [OPTION]... FILE1 [FILE2] Compare FILE1 to FILE2, using their uncompressed contents if they are compressed. If FILE2 is omitted, compare FILE1 to the uncompressed contents of FILE1.gz. Do comparisons like '$prog' does. @@ -32,50 +43,119 @@ OPTIONs are the same as for '$prog'. Report bugs to ." -OPTIONS= -FILES= +# sed script to escape all ' for the shell, and then (to handle trailing +# newlines correctly) turn trailing X on last line into '. +escape=' + s/'\''/'\''\\'\'''\''/g + $s/X$/'\''/ +' + while :; do case $1 in - --h*) echo "$usage" || exit 2; exit;; + --h*) printf '%s\n' "$usage" || exit 2; exit;; --v*) echo "$version" || exit 2; exit;; --) shift; break;; - -*) OPTIONS="$OPTIONS $ARG"; shift;; + -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;; + -?*) cmp="$cmp '$1'";; + *) break;; esac + shift done -for file; do - test -f "$file" || { - echo "$prog: $file not found or not a regular file" - exit 2 - } +cmp="$cmp --" + +for file +do + test "X$file" = X- || <"$file" || exit 2 done -if test $# -eq 1; then - FILE=`echo "$1" | sed 's/[-.][zZtga]*$//'` - gzip -cd -- "$1" | $comp $OPTIONS - "$FILE" +gzip_status=0 +exec 3>&1 + +if test $# -eq 1; then + case $1 in + *[-.]gz* | *[-.][zZ] | *.t[ga]z) + FILE=`expr "X$1" : 'X\(.*\)[-.][zZtga]*$'` + gzip_status=$( + exec 4>&1 + (gzip -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3 + );; + *) + echo >&2 "$0: $1: unknown compressed file extension" + exit 2;; + esac elif test $# -eq 2; then case "$1" in - *[-.]gz* | *[-.][zZ] | *.t[ga]z) + *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) case "$2" in - *[-.]gz* | *[-.][zZ] | *.t[ga]z) - F=`echo "$2" | sed 's|.*/||;s|[-.][zZtga]*||'` - set -C - trap 'rm -f /tmp/"$F".$$; exit 2' HUP INT PIPE TERM 0 - gzip -cdfq -- "$2" > /tmp/"$F".$$ || exit - gzip -cdfq -- "$1" | $comp $OPTIONS - /tmp/"$F".$$ - STAT="$?" - /bin/rm -f /tmp/"$F".$$ || STAT=2 + *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) + if test "$1$2" = --; then + gzip_status=$( + exec 4>&1 + (gzip -cdfq - 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - - >&3 + ) + elif + # Reject Solaris 8's buggy /bin/bash 2.03. + echo X | + (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) \ + 5<&0 + then + gzip_status=$( + exec 4>&1 + (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + ( (gzip -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- /dev/null 2>&1; then + tmp=`mktemp -t -- "$F.XXXXXX"` || exit 2 + else + set -C + tmp=${TMPDIR-/tmp}/$F.$$ + fi + gzip -cdfq -- "$2" > "$tmp" || exit 2 + gzip_status=$( + exec 4>&1 + (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - '"$tmp"' >&3 + ) + cmp_status=$? + rm -f "$tmp" || gzip_status=$? trap - HUP INT PIPE TERM 0 - exit $STAT;; - - *) gzip -cdfq -- "$1" | $comp $OPTIONS - "$2";; + (exit $cmp_status) + fi;; + *) + gzip_status=$( + exec 4>&1 + (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" - '"$2"' >&3 + );; esac;; *) case "$2" in - *[-.]gz* | *[-.][zZ] | *.t[ga]z) - gzip -cdfq -- "$2" | $comp $OPTIONS "$1" -;; - *) $comp $OPTIONS "$1" "$2";; + *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) + gzip_status=$( + exec 4>&1 + (gzip -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- | + eval "$cmp" '"$1"' - >&3 + );; + *) eval "$cmp" '"$1"' '"$2"';; esac;; esac else - echo "$usage" + echo >&2 "$0: invalid number of operands; try \`$0 --help' for help" exit 2 fi + +cmp_status=$? +test "$gzip_status" -eq 0 || exit 2 +exit $cmp_status