New upstream version 1.8
[debian/gzip] / zgrep.in
index d09bfa7128cfa8d01c705caaf48c8fd3c223e085..7ce45ae8b3900afb12e6147c7039e04e297c3a18 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>
 
 # 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
 
 
 # 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.
 
 # 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@
 
 version='zgrep (gzip) @VERSION@
-Copyright (C) 2010-2012 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.
 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.
 
 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>."
 
 
 Report bugs to <bug-gzip@gnu.org>."
 
@@ -58,6 +55,7 @@ files_with_matches=0
 files_without_matches=0
 no_filename=0
 with_filename=0
 files_without_matches=0
 no_filename=0
 with_filename=0
+pattmp=
 
 while test $# -ne 0; do
   option=$1
 
 while test $# -ne 0; do
   option=$1
@@ -65,7 +63,7 @@ while test $# -ne 0; do
   optarg=
 
   case $option in
   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]*\)');;
     arg2=-\'$(expr "X$option" : 'X-.[0-9]*\(.*\)' | sed "$escape")
     eval "set -- $arg2 "'${1+"$@"}'
     option=$(expr "X$option" : 'X\(-.[0-9]*\)');;
@@ -116,13 +114,34 @@ 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.
     # 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
+      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
     have_pat=1;;
   (--h | --he | --hel | --help)
     echo "$usage" || exit 2
@@ -170,7 +189,7 @@ if test $# -eq 0; then
 fi
 
 exec 3>&1
 fi
 
 exec 3>&1
-res=0
+res=1
 
 for i
 do
 
 for i
 do
@@ -186,6 +205,7 @@ do
         if test $r -eq 1; then
           printf '%s\n' "$i" || r=2
         fi
         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 &&
         exit $r
       }
     elif test $with_filename -eq 0 &&
@@ -208,14 +228,40 @@ do
       r=$(
         exec 4>&1
         (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
       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=$?
     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
 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
 exit $res