gzip: minor zgrep cleanup
[debian/gzip] / zgrep.in
index 68396dbfcbbbf8de623d53c5aa77b5c11f993e89..c24be57a4318a3dea22cfb6e6840e9bca84abb5e 100644 (file)
--- 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 <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}'
+grep='${GREP-'\''@GREP@'\''}'
 
 version='zgrep (gzip) @VERSION@
-Copyright (C) 2010 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.
@@ -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 <bug-gzip@gnu.org>."
 
@@ -65,7 +62,7 @@ while test $# -ne 0; do
   optarg=
 
   case $option in
-  (-[0123456789EFGHIKLPRTUVZabchilnoqrsuvwxyz]?*)
+  (-[0123456789EFGHIKLPRTUVZabchilnoqrsuvwxyz]*[!0123456789]*)
     arg2=-\'$(expr "X$option" : 'X-.[0-9]*\(.*\)' | sed "$escape")
     eval "set -- $arg2 "'${1+"$@"}'
     option=$(expr "X$option" : 'X\(-.[0-9]*\)');;
@@ -170,7 +167,7 @@ if test $# -eq 0; then
 fi
 
 exec 3>&1
-res=0
+res=1
 
 for i
 do
@@ -186,6 +183,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,17 +206,31 @@ do
       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
+      ) || { r=$?; test $r -lt 2 && r=2; }
+      test 256 -le $r && r=$(expr 128 + $r % 128)
+      exit $r
     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
+
+  # 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
+
+test 128 -le $res && kill -$(expr $res % 128) $$
 exit $res