X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=zgrep.in;h=5d9e6d10f7f1a193cc22a5305407049ab6c12d49;hb=744b66353096552f6a23a95bff7b088af24ac555;hp=5cc13b399c3d81e275937c6faa5d1f3f573b8378;hpb=0dd0c55c25126daeb203b68fdc1b9b92ae712326;p=debian%2Fgzip diff --git a/zgrep.in b/zgrep.in index 5cc13b3..5d9e6d1 100644 --- a/zgrep.in +++ b/zgrep.in @@ -3,12 +3,12 @@ # 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 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 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,27 +20,27 @@ # 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}' ;; +bindir=@bindir@ +case $1 in +--__bindir) bindir=${2?}; shift; shift;; esac +PATH=$bindir:$PATH + +grep='${GREP-grep}' -version="z$grep (gzip) @VERSION@ -Copyright (C) 2006 Free Software Foundation, Inc. +version='zgrep (gzip) @VERSION@ +Copyright (C) 2007, 2009-2010 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'. Report bugs to ." @@ -50,7 +50,9 @@ escape=' s/'\''/'\''\\'\'''\''/g $s/X$/'\''/ ' +operands= have_pat=0 +pat_on_stdin=0 files_with_matches=0 files_without_matches=0 no_filename=0 @@ -58,40 +60,71 @@ with_filename=0 while test $# -ne 0; do option=$1 + shift optarg= - case $1 in + case $option in (-[0123456789abcdhHiIKLlnoqrRsTuUvVwxyzZ]?*) - option=$(expr "X$1" : 'X\(-.[0-9]*\)') - arg2=-\'$(expr "X$1X" : 'X-.[0-9]*\(.*\)' | sed "$escape") - shift - eval "set X $arg2 "'${1+"$@"}';; + arg2=-\'$(expr "X${option}X" : '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 + case ${1?"$option option requires an argument"} in (*\'*) - optarg=" '"$(printf '%sX\n' "$2" | sed "$escape");; + optarg=" '"$(printf '%sX\n' "$1" | sed "$escape");; (*) - optarg=" '$2'";; + optarg=" '$1'";; esac shift;; (--) - shift break;; - (-*) + (-?*) ;; (*) - break;; + case $option in + (*\'*) + operands="$operands '"$(printf '%sX\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*) + # 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). + # So find a free fd and change the argument to then use this + # file descriptor for the pattern. + case $optarg in + (" '-'" | " '/dev/stdin'" | " '/dev/fd/0'") + pat_on_stdin=1 + eval 'test -e .' 2>/dev/null \ + && eval 'exists(){ test -e "$@"; }' \ + || eval 'exists(){ test -r "$@" || test -w "$@"; }' + # Start search from 6 since the script already uses 3 and 5 + fd=6 + pat_fd= + while : ; do + if ! exists /proc/$$/fd/$fd; then + pat_fd=$fd + break; + fi + fd=$(expr $fd + 1) + if test $fd = 255; then + printf >&2 '%s: no free file descriptor\n' "$0" + exit 2 + fi + done + optarg=/dev/fd/$pat_fd; + esac have_pat=1;; (--h | --he | --hel | --help) echo "$usage" || exit 2 @@ -122,6 +155,8 @@ 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 (*\'*) @@ -133,8 +168,7 @@ if test $have_pat -eq 0; then fi if test $# -eq 0; then - set X - - shift + set -- - fi exec 3>&1 @@ -145,42 +179,50 @@ do # Fail if gzip or grep (or sed) fails. gzip_status=$( exec 5>&1 + if test $pat_on_stdin -eq 1; then + eval "exec $pat_fd<&0" + fi (gzip -cdfq -- "$i" 5>&-; echo $? >&5) 3>&- | if test $files_with_matches -eq 1; then 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 + 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 - exit $r + exec 4>&1 + (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&- + ) && exit $r + r=$? + test $r -gt 128 && test $r -le 143 && exit $r || exit 2 fi >&3 5>&- ) r=$? + if test $r -gt 128 && test $r -le 143; then + kill -$(($r-128)) $$ + exit $r + fi test "$gzip_status" -eq 0 || test "$gzip_status" -eq 2 || r=2 test $res -lt $r && res=$r done