X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=zgrep.in;h=7ce45ae8b3900afb12e6147c7039e04e297c3a18;hb=31831d686bc445a6715366487b9ca88d28929194;hp=5cc13b399c3d81e275937c6faa5d1f3f573b8378;hpb=0dd0c55c25126daeb203b68fdc1b9b92ae712326;p=debian%2Fgzip diff --git a/zgrep.in b/zgrep.in index 5cc13b3..7ce45ae 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 Free Software Foundation +# Copyright (C) 1998, 2001-2002, 2006-2007, 2009-2016 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,78 +22,126 @@ # 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"; export PATH - -case "$0" in -(*egrep) grep='${EGREP-egrep}' ;; -(*fgrep) grep='${FGREP-fgrep}' ;; -(*) grep='${GREP-grep}' ;; -esac +grep='${GREP-'\''@GREP@'\''}' -version="z$grep (gzip) @VERSION@ -Copyright (C) 2006 Free Software Foundation, Inc. +version='zgrep (gzip) @VERSION@ +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 . There is NO WARRANTY, to the extent permitted by law. -Written by Jean-loup Gailly." +Written by Jean-loup Gailly.' -usage="Usage: z$grep [OPTION]... [-e] PATTERN [FILE]... +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 files_with_matches=0 files_without_matches=0 no_filename=0 with_filename=0 +pattmp= while test $# -ne 0; do option=$1 + shift optarg= - case $1 in - (-[0123456789abcdhHiIKLlnoqrRsTuUvVwxyzZ]?*) - option=$(expr "X$1" : 'X\(-.[0-9]*\)') - arg2=-\'$(expr "X$1X" : 'X-.[0-9]*\(.*\)' | sed "$escape") - shift - eval "set X $arg2 "'${1+"$@"}';; + case $option in + (-[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*) - have_optarg=1 - case ${2?"$1 option requires an argument"} in + (-[ABCDXdefm] | binary-* | --file | --[lm]a* | --reg*) + case ${1?"$option option requires an argument"} in (*\'*) - optarg=" '"$(printf '%sX\n' "$2" | sed "$escape");; + optarg=" '"$(printf '%s\n' "$1" | sed "$escape");; (*) - optarg=" '$2'";; + 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;; (--) - shift break;; - (-*) + (-?*) ;; (*) - break;; + case $option in + (*\'*) + operands="$operands '"$(printf '%s\n' "$option" | sed "$escape");; + (*) + operands="$operands '$option'";; + esac + ${POSIXLY_CORRECT+break} + continue;; esac - shift 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*) + (-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 + 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 @@ -105,7 +155,7 @@ while test $# -ne 0; do files_with_matches=1;; (-L | --files-witho*) files_without_matches=1;; - (--no-f*) + (-h | --no-f*) no_filename=1;; (-V | --v | --ve | --ver | --vers | --versi | --versio | --version) echo "$version" || exit 2 @@ -114,7 +164,7 @@ while test $# -ne 0; do case $option in (*\'?*) - option=\'$(expr "X${option}X" : 'X\(.*\)' | sed "$escape");; + option=\'$(printf '%s\n' "$option" | sed "$escape");; (*) option="'$option'";; esac @@ -122,10 +172,12 @@ while test $# -ne 0; do 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 -- '"$(printf '%s\n' "$1" | sed "$escape");; (*) grep="$grep -- '$1'";; esac @@ -133,12 +185,11 @@ if test $have_pat -eq 0; then fi if test $# -eq 0; then - set X - - shift + set -- - fi exec 3>&1 -res=0 +res=1 for i do @@ -150,38 +201,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