X-Git-Url: https://git.gag.com/?p=debian%2Fgzip;a=blobdiff_plain;f=zgrep.in;h=3efdb529b8f7dc384a001562ca13261183d70d8d;hp=5cca34555b141be0eb87da78184efbb97c087139;hb=659cae49714b93487242525dfa0e5737463d78d8;hpb=47dc1883f1f730f9576ae0e6090ead01732ff4ff diff --git a/zgrep.in b/zgrep.in index 5cca345..3efdb52 100644 --- a/zgrep.in +++ b/zgrep.in @@ -3,12 +3,14 @@ # 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 Free Software Foundation +# Copyright (C) 1998, 2001-2002, 2006-2007, 2009-2018 Free Software Foundation, +# Inc. + # 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 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, @@ -20,13 +22,12 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -PATH=BINDIR:$PATH -grep='${GREP-grep}' +grep='${GREP-'\''@GREP@'\''}' -version='z$grep (gzip) @VERSION@ -Copyright (C) 2007 Free Software Foundation, Inc. +version='zgrep (gzip) @VERSION@ +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.' @@ -35,15 +36,18 @@ 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 ." # sed script to escape all ' for the shell, and then (to handle trailing -# newlines correctly) turn trailing X on last line into '. +# newlines correctly) append ' to the last line. escape=' s/'\''/'\''\\'\'''\''/g - $s/X$/'\''/ + $s/$/'\''/ ' operands= have_pat=0 @@ -51,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 @@ -58,20 +63,32 @@ while test $# -ne 0; do optarg= case $option in - (-[0123456789abcdhHiIKLlnoqrRsTuUvVwxyzZ]?*) - arg2=-\'$(expr "X${option}X" : 'X-.[0-9]*\(.*\)' | sed "$escape") + (-[0123456789EFGHIKLPRTUVZabchilnoqrsuvwxyz]*[!0123456789]*) + arg2=-\'$(expr "X$option" : '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*) + (-[ABCDXdefm] | binary-* | --file | --[lm]a* | --reg*) case ${1?"$option option requires an argument"} in (*\'*) - optarg=" '"$(printf '%sX\n' "$1" | sed "$escape");; + optarg=" '"$(printf '%s\n' "$1" | sed "$escape");; (*) optarg=" '$1'";; esac shift;; + (-f?*\'*) + optarg=" '"$(expr "X$option" : 'X-f\(.*\)' | sed "$escape") + option=-f;; + (-f?*) + optarg=" '"$(expr "X$option" : 'X-f\(.*\)')\' + option=-f;; + (--file=*\'*) + optarg=" '"$(expr "X$option" : 'X--file=\(.*\)' | sed "$escape") + option=--file;; + (--file=*) + optarg=" '"$(expr "X$option" : 'X--file=\(.*\)')\' + option=--file;; (--) break;; (-?*) @@ -79,7 +96,7 @@ while test $# -ne 0; do (*) case $option in (*\'*) - operands="$operands '"$(printf '%sX\n' "$option" | sed "$escape");; + operands="$operands '"$(printf '%s\n' "$option" | sed "$escape");; (*) operands="$operands '$option'";; esac @@ -91,10 +108,48 @@ while test $# -ne 0; do (-[drRzZ] | --di* | --exc* | --inc* | --rec* | --nu*) printf >&2 '%s: %s: option not supported\n' "$0" "$option" exit 2;; - (-[ef]* | --file | --file=* | --reg*) + (-e* | --reg*) + have_pat=1;; + (-f | --file) + # 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. + # 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 \ @@ -108,13 +163,13 @@ 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 case $option in (*\'?*) - option=\'$(expr "X${option}X" : 'X\(.*\)' | sed "$escape");; + option=\'$(printf '%s\n' "$option" | sed "$escape");; (*) option="'$option'";; esac @@ -127,7 +182,7 @@ 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 -- '"$(printf '%s\n' "$1" | sed "$escape");; (*) grep="$grep -- '$1'";; esac @@ -139,7 +194,7 @@ if test $# -eq 0; then fi exec 3>&1 -res=0 +res=1 for i do @@ -151,38 +206,67 @@ do eval "$grep" >/dev/null && { printf '%s\n' "$i" || exit 2; } elif test $files_without_matches -eq 1; then eval "$grep" >/dev/null || { - r=$? - if test $r -eq 1; then - printf '%s\n' "$i" || r=2 - fi - exit $r + r=$? + 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 && - { test $# -eq 1 || test $no_filename -eq 1; }; then + { 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 - ');; + 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 + exec 4>&1 + (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&- + ) || { r=$?; test $r -lt 2 && r=2; } + test 256 -le $r && r=$(expr 128 + $r % 128) exit $r fi >&3 5>&- ) 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