X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=zdiff.in;h=f2f5435187dfadec6611c55ab843cf13cf3b0866;hb=3471e27de87bb81abd6aa67f4391d3fce9a35437;hp=74c92fb7a4f3afd0f839856470032d21ab22ca5b;hpb=be3ce2ded487aa2d3cdccefbca47ab6b72efbe60;p=debian%2Fgzip diff --git a/zdiff.in b/zdiff.in index 74c92fb..f2f5435 100644 --- a/zdiff.in +++ b/zdiff.in @@ -1,29 +1,38 @@ #!/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 ; cmp='${CMP-cmp}' ;; +# Copyright (C) 1998, 2002, 2006-2007, 2009-2016 Free Software Foundation, Inc. +# 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 3 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. + +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) 2009, 2011-2016 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,72 +41,121 @@ OPTIONs are the same as for '$prog'. Report bugs to ." -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;; - -*\'*) echo >&2 "$prog: $1: option contains apostrophe"; exit 2;; - -?*) cmp="$cmp '$1'"; shift;; + -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;; + -?*) cmp="$cmp '$1'";; *) break;; esac + shift done cmp="$cmp --" -for file; do +for file +do test "X$file" = X- || <"$file" || exit 2 done +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 -cd -- "$1" | eval "$cmp" - '"$FILE"';; + gzip_status=$( + exec 4>&1 + (gzip -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3 + );; *) - echo >&2 "$prog: $1: unknown compressed file extension" + echo >&2 "$0: $1: unknown compressed file extension" exit 2;; esac elif test $# -eq 2; then - case "$1" in - *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) + case "$1" in + *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) case "$2" in - *[-.]gz* | *[-.][zZ] | *.t[ga]z | -) - if test "$1$2" = --; then - gzip -cdfq - | eval "$cmp" - - - elif test -r /dev/fd/3 3/dev/null 2>&1; then - tmp=`mktemp -t -- "$F.XXXXXX"` || exit - else - set -C - tmp=${TMPDIR-/tmp}/$F.$$ - fi - gzip -cdfq -- "$2" > "$tmp" || exit - gzip -cdfq -- "$1" | eval "$cmp" - '"$tmp"' - STAT="$?" - rm -f "$tmp" || STAT=2 - trap - HUP INT PIPE TERM 0 - exit $STAT - fi;; - *) gzip -cdfq -- "$1" | eval "$cmp" - '"$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<&- &3) 5<&0 + ) + cmp_status=$? + case $gzip_status in + *[1-9]*) gzip_status=1;; + *) gzip_status=0;; + esac + (exit $cmp_status) + else + F=`expr "/$2" : '.*/\(.*\)[-.][zZtga]*$'` || F=$prog + tmp= + trap ' + test -n "$tmp" && rm -f "$tmp" + (exit 2); exit 2 + ' HUP INT PIPE TERM 0 + if type mktemp >/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 $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" | eval "$cmp" '"$1"' -;; - *) eval "$cmp" '"$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 + esac else - echo >&2 "$usage" - exit 2 + 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