X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=zgrep.in;h=3efdb529b8f7dc384a001562ca13261183d70d8d;hb=92249085071a973e2c0621b0415b93d2e48bb00d;hp=154d17f4cea73a20179fdcb86a014fc670a9a465;hpb=d57728a6ca2413a7c564d8b7bb13d9e5a5a180f3;p=debian%2Fgzip diff --git a/zgrep.in b/zgrep.in index 154d17f..3efdb52 100644 --- a/zgrep.in +++ b/zgrep.in @@ -3,8 +3,8 @@ # zgrep -- a wrapper around a grep program that decompresses files as needed # Adapted from a version sent by Charles Levert -# Copyright (C) 1998, 2001, 2002, 2006, 2007, 2009, 2010 Free Software -# Foundation +# Copyright (C) 1998, 2001-2002, 2006-2007, 2009-2018 Free Software Foundation, +# Inc. # Copyright (C) 1993 Jean-loup Gailly @@ -22,18 +22,12 @@ # 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-2018 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of -the GNU General Public License . +the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. Written by Jean-loup Gailly.' @@ -42,7 +36,10 @@ 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'. +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 ." @@ -58,6 +55,7 @@ files_with_matches=0 files_without_matches=0 no_filename=0 with_filename=0 +pattmp= while test $# -ne 0; do option=$1 @@ -116,16 +114,42 @@ while test $# -ne 0; do # 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 + case $TMPDIR in + / | /*/) ;; + /*) TMPDIR=$TMPDIR/;; + *) TMPDIR=/tmp/;; + esac + if type mktemp >/dev/null 2>&1; then + pattmp=$(mktemp "${TMPDIR}zgrepXXXXXXXXX") || exit 2 + else + set -C + pattmp=${TMPDIR}zgrep$$ + fi + eval "cat --$optarg" >"$pattmp" || exit 2 + optarg=' "$pattmp"' + fi have_pat=1;; (--h | --he | --hel | --help) - echo "$usage" || exit 2 + printf '%s\n' "$usage" || exit 2 exit;; (-H | --wi | --wit | --with | --with- | --with-f | --with-fi \ | --with-fil | --with-file | --with-filen | --with-filena | --with-filenam \ @@ -139,7 +163,7 @@ while test $# -ne 0; do (-h | --no-f*) no_filename=1;; (-V | --v | --ve | --ver | --vers | --versi | --versio | --version) - echo "$version" || exit 2 + printf '%s\n' "$version" || exit 2 exit;; esac @@ -170,7 +194,7 @@ if test $# -eq 0; then fi exec 3>&1 -res=0 +res=1 for i do @@ -186,6 +210,7 @@ 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 && @@ -208,14 +233,40 @@ do 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