1#!/bin/sh 2# 3# Copyright (c) 2003 Thomas Klausner. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 25grep=grep 26zcat=zstdcat 27 28endofopts=0 29pattern_found=0 30grep_args="" 31hyphen=0 32silent=0 33 34prg=$(basename "$0") 35 36# handle being called 'zegrep' or 'zfgrep' 37case "${prg}" in 38 *zegrep) grep_args="-E";; 39 *zfgrep) grep_args="-F";; 40esac 41 42# skip all options and pass them on to grep taking care of options 43# with arguments, and if -e was supplied 44 45while [ "$#" -gt 0 ] && [ "${endofopts}" -eq 0 ]; do 46 case "$1" in 47 # from GNU grep-2.5.1 -- keep in sync! 48 -[ABCDXdefm]) 49 if [ "$#" -lt 2 ]; then 50 printf '%s: missing argument for %s flag\n' "${prg}" "$1" >&2 51 exit 1 52 fi 53 case "$1" in 54 -e) 55 pattern="$2" 56 pattern_found=1 57 shift 2 58 break 59 ;; 60 *) 61 ;; 62 esac 63 grep_args="${grep_args} $1 $2" 64 shift 2 65 ;; 66 --) 67 shift 68 endofopts=1 69 ;; 70 -) 71 hyphen=1 72 shift 73 ;; 74 -h) 75 silent=1 76 shift 77 ;; 78 -*) 79 grep_args="${grep_args} $1" 80 shift 81 ;; 82 *) 83 # pattern to grep for 84 endofopts=1 85 ;; 86 esac 87done 88 89# if no -e option was found, take next argument as grep-pattern 90if [ "${pattern_found}" -lt 1 ]; then 91 if [ "$#" -ge 1 ]; then 92 pattern="$1" 93 shift 94 elif [ "${hyphen}" -gt 0 ]; then 95 pattern="-" 96 else 97 printf '%s: missing pattern\n' "${prg}" >&2 98 exit 1 99 fi 100fi 101 102EXIT_CODE=0 103# call grep ... 104if [ "$#" -lt 1 ]; then 105 # ... on stdin 106 set -f # Disable file name generation (globbing). 107 # shellcheck disable=SC2086 108 "${zcat}" -fq - | "${grep}" ${grep_args} -- "${pattern}" - 109 EXIT_CODE=$? 110 set +f 111else 112 # ... on all files given on the command line 113 if [ "${silent}" -lt 1 ] && [ "$#" -gt 1 ]; then 114 grep_args="-H ${grep_args}" 115 fi 116 CUR_EXIT_CODE=0 117 EXIT_CODE=1 118 set -f 119 while [ "$#" -gt 0 ]; do 120 # shellcheck disable=SC2086 121 "${zcat}" -fq -- "$1" | "${grep}" --label="${1}" ${grep_args} -- "${pattern}" - 122 CUR_EXIT_CODE=$? 123 if [ "${CUR_EXIT_CODE}" -eq 0 ] && [ "${EXIT_CODE}" -ne 1 ]; then 124 EXIT_CODE=0 125 fi 126 shift 127 done 128 set +f 129fi 130 131exit "${EXIT_CODE}" 132