#!/bin/sh

# lzgrep -- a wrapper around a grep program that decompresses files as needed
# Adapted to LZMA utils from gzip-1.3.3 + Red Hat's security patches
# Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
# Copyright (C) 1998, 2001 Free Software Foundation
# 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 2, 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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.

# Improve error handling, this is supported by bash but not all the other
# shells so we hide the possible error:
set -o pipefail > /dev/null 2> /dev/null

prog=`echo "$0" | sed 's|.*/||'`
case "$prog" in
	*egrep)	grep=${EGREP-egrep}	;;
	*fgrep)	grep=${FGREP-fgrep}	;;
	*)	grep=${GREP-grep}	;;
esac

pat=""
after_dash_dash=""
files_with_matches=0
files_without_matches=0
no_filename=0
with_filename=0

while test $# -ne 0; do
  case "$after_dash_dash$1" in
  --d* | --rec*)	echo >&2 "$0: $1: option not supported"; exit 1;;
  --files-with-*)	files_with_matches=1;;
  --files-witho*)	files_without_matches=1;;
  --no-f*)	no_filename=1;;
  --wi*)	with_filename=1;;
  --*)	;;
  -*)
	case "$1" in
	-*[dr]*) echo >&2 "$0: $1: option not supported"; exit 1;;
	esac
	case "$1" in
	-*H*)	with_filename=1;;
	esac
	case "$1" in
	-*h*)	no_filename=1;;
	esac
	case "$1" in
	-*L*)	files_without_matches=1;;
	esac
	case "$1" in
	-*l*)	files_with_matches=1;;
	esac;;
  esac
  case "$after_dash_dash$1" in
  -[ef])   opt="$opt $1"; shift; pat="$1"
           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
             grep=egrep
           fi;;
  -[ABCdm])opt="$opt $1 $2"; shift;;
  --)      opt="$opt $1"; after_dash_dash=1;;
  -*)	   opt="$opt $1";;
   *)      if test -z "$pat"; then
	     pat="$1"
	   else
	     break;
           fi;;
  esac
  shift
done

if test -z "$pat"; then
  echo "grep through lzma files"
  echo "usage: $prog [grep_options] pattern [files]"
  exit 1
fi

if test $# -eq 0; then
  lzma -dc | $grep $opt "$pat"
  exit $?
fi

res=0
trap break SIGPIPE
for i do
  lzma -dc "$i" |
    if test $files_with_matches -eq 1; then
      $grep $opt "$pat" > /dev/null && printf "%s\n" "$i"
    elif test $files_without_matches -eq 1; then
      $grep $opt "$pat" > /dev/null || printf "%s\n" "$i"
    elif test $with_filename -eq 0 && { test $# -eq 1 || test $no_filename -eq 1; }; then
      $grep $opt "$pat"
    else
      i=${i//\\/\\\\}
      i=${i//|/\\|}
      i=${i//&/\\&}
      i=`printf "%s" "$i" | tr '\n' ' '`
      if test $with_filename -eq 1; then
	sed_script="s|^[^:]*:|${i}:|"
      else
	sed_script="s|^|${i}:|"
      fi
      $grep $opt "$pat" | sed "$sed_script"
    fi
  r=$?
  test $res -lt $r && res=$r
  # SIGPIPE + 128
  test "$r" -eq 141 && exit $res
done
trap - SIGPIPE
exit $res
