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

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;;
  (-L | --files-witho*)
    files_without_matches=1;;
  (--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

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=0

for i; do
  case $i in
    *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) uncompress="gzip -cdfq";;
    *[-.]bz2 | *[-.]tbz | *.tbz2) uncompress="bzip2 -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" -q && { printf '%s\n' "$i" || exit 2; }
    elif test $files_without_matches -eq 1; then
      eval "$grep" -q || {
        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=$?
  test "$xz_status" -eq 0 || test "$xz_status" -eq 2 \
      || test "$(kill -l "$xz_status" 2> /dev/null)" = "PIPE" || r=2
  test $res -lt $r && res=$r
done
exit $res
