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

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