#!@POSIX_SHELL@

# xzgrep -- a wrapper around a grep program that decompresses files as needed
# Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>

# Copyright (C) 1998, 2001, 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.

@enable_path_for_scripts@
#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, bzip2, and lzop it's OK to just unset the
# environment variables.
xz='@xz@ --format=auto'
unset GZIP BZIP BZIP2 LZOP

case ${0##*/} in
  *egrep*) prog=xzegrep; grep=${GREP:-egrep};;
  *fgrep*) prog=xzfgrep; grep=${GREP:-fgrep};;
  *)       prog=xzgrep; grep=${GREP:-grep};;
esac

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

usage="Usage: ${0##*/} [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

OPTIONs are the same as for '$grep'.

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$/'\''/
'
operands=
have_pat=0
files_with_matches=0
files_without_matches=0
no_filename=0
with_filename=0

while test $# -ne 0; do
  option=$1
  shift
  optarg=

  case $option in
  (-[0123456789abcdhHiIKLlnoqrRsTuUvVwxyzZ]?*)
    arg2=-\'$(expr "X${option}X" : 'X-.[0-9]*\(.*\)' | sed "$escape")
    eval "set -- $arg2 "'${1+"$@"}'
    option=$(expr "X$option" : 'X\(-.[0-9]*\)');;
  (--binary-*=* | --[lm]a*=* | --reg*=*)
    ;;
  (-[ABCDefm] | --binary-* | --file | --[lm]a* | --reg*)
    case ${1?"$option option requires an argument"} in
    (*\'*)
      optarg=" '"$(printf '%sX\n' "$1" | sed "$escape");;
    (*)
      optarg=" '$1'";;
    esac
    shift;;
  (--)
    break;;
  (-?*)
    ;;
  (*)
    case $option in
    (*\'*)
      operands="$operands '"$(printf '%sX\n' "$option" | sed "$escape");;
    (*)
      operands="$operands '$option'";;
    esac
    ${POSIXLY_CORRECT+break}
    continue;;
  esac

  case $option in
  (-[drRzZ] | --di* | --exc* | --inc* | --rec* | --nu*)
    printf >&2 '%s: %s: Option not supported\n' "$0" "$option"
    exit 2;;
  (-[ef]* | --file | --file=* | --reg*)
    have_pat=1;;
  (--h | --he | --hel | --help)
    echo "$usage" || exit 2
    exit;;
  (-H | --wi | --wit | --with | --with- | --with-f | --with-fi \
  | --with-fil | --with-file | --with-filen | --with-filena | --with-filenam \
  | --with-filename)
    with_filename=1
    continue;;
  (-l | --files-with-*)
    files_with_matches=1
    continue;;
  (-L | --files-witho*)
    files_without_matches=1
    continue;;
  (-h | --no-f*)
    no_filename=1;;
  (-V | --v | --ve | --ver | --vers | --versi | --versio | --version)
    echo "$version" || exit 2
    exit;;
  esac

  case $option in
  (*\'?*)
    option=\'$(expr "X${option}X" : 'X\(.*\)' | sed "$escape");;
  (*)
    option="'$option'";;
  esac

  grep="$grep $option$optarg"
done

if test $files_with_matches -eq 1 || test $files_without_matches -eq 1; then
  grep="$grep -q"
fi

eval "set -- $operands "'${1+"$@"}'

if test $have_pat -eq 0; then
  case ${1?"Missing pattern; try \`${0##*/} --help' for help"} in
  (*\'*)
    grep="$grep -- '"$(printf '%sX\n' "$1" | sed "$escape");;
  (*)
    grep="$grep -- '$1'";;
  esac
  shift
fi

if test $# -eq 0; then
  set -- -
fi

exec 3>&1

# res=1 means that no file matched yet
res=1

for i; do
  case $i in
    *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) uncompress="gzip -cdfq";;
    *[-.]bz2 | *[-.]tbz | *.tbz2) uncompress="bzip2 -cdfq";;
    *[-.]lzo | *[-.]tzo) uncompress="lzop -cdfq";;
    *) uncompress="$xz -cdfq";;
  esac
  # Fail if xz or grep (or sed) fails.
  xz_status=$(
    exec 5>&1
    ($uncompress -- "$i" 5>&-; echo $? >&5) 3>&- |
    if test $files_with_matches -eq 1; then
      eval "$grep" && { printf '%s\n' "$i" || exit 2; }
    elif test $files_without_matches -eq 1; then
      eval "$grep" || {
        r=$?
        if test $r -eq 1; then
          printf '%s\n' "$i" || r=2
        fi
        exit $r
      }
    elif test $with_filename -eq 0 &&
         { test $# -eq 1 || test $no_filename -eq 1; }; then
      eval "$grep"
    else
      case $i in
      (*'
'* | *'&'* | *'\'* | *'|'*)
        i=$(printf '%s\n' "$i" |
            sed '
              $!N
              $s/[&\|]/\\&/g
              $s/\n/\\n/g
            ');;
      esac
      sed_script="s|^|$i:|"

      # Fail if grep or sed fails.
      r=$(
        exec 4>&1
        (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
      ) || r=2
      exit $r
    fi >&3 5>&-
  )
  r=$?

  # fail occurred previously, nothing worse can happen
  test $res -gt 1 && continue

  test "$xz_status" -eq 0 || test "$xz_status" -eq 2 \
      || test "$(kill -l "$xz_status" 2> /dev/null)" = "PIPE" || r=2

  # still no match
  test $r -eq 1 && continue

  # 0 == match, >=2 == fail
  res=$r
done
exit $res
