# zgrep -- 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, 2009, 2010 Free Software
-# Foundation
+# Copyright (C) 1998, 2001-2002, 2006-2007, 2009-2016 Free Software Foundation,
+# Inc.
# Copyright (C) 1993 Jean-loup Gailly
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-bindir=@bindir@
-case $1 in
---__bindir) bindir=${2?}; shift; shift;;
-esac
-PATH=$bindir:$PATH
-
grep='${GREP-'\''@GREP@'\''}'
version='zgrep (gzip) @VERSION@
-Copyright (C) 2010-2013 Free Software Foundation, Inc.
+Copyright (C) 2010-2016 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
-OPTIONs are the same as for 'grep'.
+OPTIONs are the same as for 'grep', except that the following 'grep'
+options are not supported: --dereference-recursive (-R), --directories (-d),
+--exclude, --exclude-from, --exclude-dir, --include, --null (-Z),
+--null-data (-z), and --recursive (-r).
Report bugs to <bug-gzip@gnu.org>."
files_without_matches=0
no_filename=0
with_filename=0
+pattmp=
while test $# -ne 0; do
option=$1
option=$(expr "X$option" : 'X\(-.[0-9]*\)');;
(--binary-*=* | --[lm]a*=* | --reg*=*)
;;
- (-[ABCDXdefm] | binary-* | --file | --[lm]a* | --reg*)
+ (-[ABCDXdefm] | --binary-* | --file | --[lm]a* | --reg*)
case ${1?"$option option requires an argument"} in
(*\'*)
optarg=" '"$(printf '%s\n' "$1" | sed "$escape");;
# The pattern is coming from a file rather than the command-line.
# If the file is actually stdin then we need to do a little
# magic, since we use stdin to pass the gzip output to grep.
- # Turn the -f option into an -e option by copying the file's
- # contents into OPTARG.
- case $optarg in
- (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'")
- option=-e
- optarg=" '"$(sed "$escape") || exit 2;;
- esac
+ # Similarly if it is not a regular file, since it might be read repeatedly.
+ # In either of these two cases, copy the pattern into a temporary file,
+ # and use that file instead. The pattern might contain null bytes,
+ # so we cannot simply switch to -e here.
+ if case $optarg in
+ (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'")
+ :;;
+ (*)
+ eval "test ! -f$optarg";;
+ esac
+ then
+ if test -n "$pattmp"; then
+ eval "cat --$optarg" >>"$pattmp" || exit 2
+ continue
+ fi
+ trap '
+ test -n "$pattmp" && rm -f "$pattmp"
+ (exit 2); exit 2
+ ' HUP INT PIPE TERM 0
+ if type mktemp >/dev/null 2>&1; then
+ pattmp=$(mktemp) || exit 2
+ else
+ set -C
+ pattmp=${TMPDIR-/tmp}/zgrep.$$
+ fi
+ eval "cat --$optarg" >"$pattmp" || exit 2
+ optarg=' "$pattmp"'
+ fi
have_pat=1;;
(--h | --he | --hel | --help)
echo "$usage" || exit 2
fi
exec 3>&1
-res=0
+res=1
for i
do
if test $r -eq 1; then
printf '%s\n' "$i" || r=2
fi
+ test 256 -le $r && r=$(expr 128 + $r % 128)
exit $r
}
elif test $with_filename -eq 0 &&
r=$(
exec 4>&1
(eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
- ) && exit $r
- r=$?
- test 1 -lt $r && exit $r || exit 2
+ ) || { r=$?; test $r -lt 2 && r=2; }
+ test 256 -le $r && r=$(expr 128 + $r % 128)
+ exit $r
fi >&3 5>&-
)
r=$?
- test 128 -lt $r && exit $r
- test "$gzip_status" -eq 0 || test "$gzip_status" -eq 2 || r=2
- test $res -lt $r && res=$r
+
+ # Ignore gzip status 2, as it is just a warning.
+ # gzip status 1 is an error, like grep status 2.
+ test $gzip_status -eq 2 && gzip_status=0
+ test $gzip_status -eq 1 && gzip_status=2
+
+ # Use the more serious of the grep and gzip statuses.
+ test $r -lt $gzip_status && r=$gzip_status
+
+ # Accumulate the greatest status, except consider 0 to be greater than 1.
+ if test $r -le 1 && test $res -le 1; then
+ test $r -lt $res
+ else
+ test $res -lt $r
+ fi && res=$r
+
+ # Exit immediately on a serious error.
+ test 126 -le $res && break
done
+
+if test -n "$pattmp"; then
+ rm -f "$pattmp" || {
+ r=$?
+ test $r -lt 2 && r=2
+ test $res -lt $r && res=$r
+ }
+ trap - HUP INT PIPE TERM 0
+fi
+
+test 128 -le $res && kill -$(expr $res % 128) $$
exit $res