prepare to upload
[debian/gzip] / zdiff.in
index 6194cf914176d1f60c9be6c07e97d9e5917a1860..960bf86131dc6ed6d28dfc16e38dfab8ba680b76 100644 (file)
--- 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
 
 #!/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, 2009-2018 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@
 esac
 
 version="z$prog (gzip) @VERSION@
-Copyright (C) 2006 Free Software Foundation, Inc.
+Copyright (C) 2009, 2011-2017 Free Software Foundation, Inc.
 This is free software.  You may redistribute copies of it under the terms of
 This is free software.  You may redistribute copies of it under the terms of
-the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+the GNU General Public License <https://www.gnu.org/licenses/gpl.html>.
 There is NO WARRANTY, to the extent permitted by law.
 
 Written by Jean-loup Gailly."
 
 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.
 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 +41,127 @@ OPTIONs are the same as for '$prog'.
 
 Report bugs to <bug-gzip@gnu.org>."
 
 
 Report bugs to <bug-gzip@gnu.org>."
 
-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
 while :; do
   case $1 in
-  --h*) echo "$usage" || exit 2; exit;;
-  --v*) echo "$version" || exit 2; exit;;
+  --h*) printf '%s\n' "$usage"   || exit 2; exit;;
+  --v*) printf '%s\n' "$version" || exit 2; exit;;
   --) shift; break;;
   --) shift; break;;
-  -*) OPTIONS="$OPTIONS $ARG"; shift;;
+  -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;;
+  -?*) cmp="$cmp '$1'";;
+  *) break;;
   esac
   esac
+  shift
 done
 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
 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
+    );;
+  *)
+    printf >&2 '%s\n' "$0: $1: unknown compressed file extension"
+    exit 2;;
+  esac
 elif test $# -eq 2; then
 elif test $# -eq 2; then
-       case "$1" in
-        *[-.]gz* | *[-.][zZ] | *.t[ga]z)
+        case "$1" in
+        *[-.]gz* | *[-.][zZ] | *.t[ga]z | -)
                 case "$2" in
                 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
-                       trap - HUP INT PIPE TERM 0
-                       exit $STAT;;
-
-               *)      gzip -cdfq -- "$1" | $comp $OPTIONS - "$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 |
+                               eval "$cmp" /dev/fd/5 - >&3) 5<&0
+                        )
+                        cmp_status=$?
+                        case $gzip_status in
+                          *[1-9]*) gzip_status=1;;
+                          *) gzip_status=0;;
+                        esac
+                        (exit $cmp_status)
+                    else
+                        tmp=
+                        trap '
+                          test -n "$tmp" && rm -f "$tmp"
+                          (exit 2); exit 2
+                        ' HUP INT PIPE TERM 0
+                        case $TMPDIR in
+                          / | /*/) ;;
+                          /*) TMPDIR=$TMPDIR/;;
+                          *) TMPDIR=/tmp/;;
+                        esac
+                        if type mktemp >/dev/null 2>&1; then
+                          tmp=`mktemp "${TMPDIR}zdiffXXXXXXXXX"` ||
+                            exit 2
+                        else
+                          set -C
+                          tmp=${TMPDIR}zdiff$$
+                        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
                 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;;
-       esac
+        esac
 else
 else
-       echo "$usage"
-       exit 2
+        printf >&2 '%s\n' \
+          "$0: invalid number of operands; try \`$0 --help' for help"
+        exit 2
 fi
 fi
+
+cmp_status=$?
+test "$gzip_status" -eq 0 || exit 2
+exit $cmp_status