#!@POSIX_SHELL@

# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation
# Copyright (C) 1993 Jean-loup Gailly

# Modified for XZ Utils by Andrew Dudman and Lasse Collin.

# 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.

#SET_PATH - This line is a placeholder to ease patching this script.

# Instead of unsetting XZ_OPT, just make sure that xz will use file format
# autodetection. This way memory usage limit and thread limit can be
# specified via XZ_OPT. With gzip and bzip2 it's OK to just unset the
# environment variables.
xz='@xz@ --format=auto'
unset GZIP BZIP BZIP2

case ${0##*/} in
  *cmp*) prog=xzcmp; cmp=${CMP:-cmp};;
  *)     prog=xzdiff; cmp=${DIFF:-diff};;
esac

version="$prog (@PACKAGE_NAME@) @VERSION@"

usage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2]
Compare FILE1 to FILE2, using their uncompressed contents if they are
compressed.  If FILE2 is omitted, then the files compared are FILE1 and
FILE1 from which the compression format suffix has been stripped.

Do comparisons like '$cmp' does.  OPTIONs are the same as for '$cmp'.

Report bugs to <@PACKAGE_BUGREPORT@>."

# 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*) printf '%s\n' "$usage" || exit 2; exit;;
    --v*) echo "$version" || exit 2; exit;;
    --) shift; break;;
    -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;;
    -?*) cmp="$cmp '$1'";;
    *) break;;
  esac
  shift
done
cmp="$cmp --"

for file; do
  test "X$file" = X- || <"$file" || exit 2
done

xz1=$xz
xz2=$xz
xz_status=0
exec 3>&1

if test $# -eq 1; then
  case $1 in
    *[-.]xz | *[-.]lzma | *.t[lx]z)
      ;;
    *[-.]bz2 | *.tbz | *.tbz2)
      xz1=$bzip2;;
    *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z)
      xz1=$gzip;;
    *)
      echo >&2 "$0: $1: Unknown compressed file name suffix"
      exit 2;;
  esac
  case $1 in
    *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma)
      FILE=`expr "X$1" : 'X\(.*\)[-.][abglmxzZ2]*$'`;;
    *.t[abglx]z)
      FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar;;
    *.tbz2)
      FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar;;
  esac
  xz_status=$(
    exec 4>&1
    ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3
  )
elif test $# -eq 2; then
  case $1 in
    *[-.]bz2 | *.tbz | *.tbz2) xz1=$bzip2;;
    *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=$gzip;;
  esac
  case $2 in
    *[-.]bz2 | *.tbz | *.tbz2) xz2=$bzip2;;
    *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=$gzip;;
  esac
  case $1 in
    *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
      case "$2" in
        *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
          if test "$1$2" = --; then
            xz_status=$(
              exec 4>&1
              ($xz1 -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
            xz_status=$(
              exec 4>&1
              ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
                ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
                eval "$cmp" /dev/fd/5 - >&3) 5<&0
            )
            cmp_status=$?
            case $xz_status in
              *[1-9]*) xz_status=1;;
              *) xz_status=0;;
            esac
            (exit $cmp_status)
          else
            F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog
            tmp=
            trap '
              test -n "$tmp" && rm -f "$tmp"
              (exit 2); exit 2
            ' HUP INT PIPE TERM 0
            tmp=`mktemp -t -- "$F.XXXXXX"` || exit 2
            $xz2 -cdfq -- "$2" > "$tmp" || exit 2
            xz_status=$(
              exec 4>&1
              ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
                eval "$cmp" - '"$tmp"' >&3
            )
            cmp_status=$?
            rm -f "$tmp" || xz_status=$?
            trap - HUP INT PIPE TERM 0
            (exit $cmp_status)
          fi;;
      *)
        xz_status=$(
          exec 4>&1
          ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
            eval "$cmp" - '"$2"' >&3
        );;
    esac;;
  *)
    case "$2" in
      *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
        xz_status=$(
          exec 4>&1
          ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- |
            eval "$cmp" '"$1"' - >&3
         );;
      *)
        eval "$cmp" '"$1"' '"$2"';;
    esac;;
  esac
else
  echo >&2 "$0: Invalid number of operands; try \`${0##*/} --help' for help"
  exit 2
fi

cmp_status=$?
test "$xz_status" -eq 0 || exit 2
exit $cmp_status
