Home | History | Annotate | Line # | Download | only in programs
zstdgrep revision 1.1.1.1
      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 
     25 grep=${GREP:-grep}
     26 zcat=${ZCAT:-zstdcat}
     27 
     28 endofopts=0
     29 pattern_found=0
     30 grep_args=""
     31 hyphen=0
     32 silent=0
     33 
     34 prog=${0##*/}
     35 
     36 # handle being called 'zegrep' or 'zfgrep'
     37 case $prog in
     38     *egrep*) prog=zegrep; grep_args='-E';;
     39     *fgrep*) prog=zfgrep; grep_args='-F';;
     40     *)       prog=zstdgrep;;
     41 esac
     42 
     43 # skip all options and pass them on to grep taking care of options
     44 # with arguments, and if -e was supplied
     45 
     46 while [ "$#" -gt 0 ] && [ "${endofopts}" -eq 0 ]; do
     47     case "$1" in
     48     # from GNU grep-2.5.1 -- keep in sync!
     49         -[ABCDXdefm])
     50             if [ "$#" -lt 2 ]; then
     51                 printf '%s: missing argument for %s flag\n' "${prog}" "$1" >&2
     52                 exit 1
     53             fi
     54             case "$1" in
     55                 -e)
     56                     pattern="$2"
     57                     pattern_found=1
     58                     shift 2
     59                     break
     60                     ;;
     61                 -f)
     62                     pattern_found=2
     63                     ;;
     64                 *)
     65                     ;;
     66             esac
     67             grep_args="${grep_args} $1 $2"
     68             shift 2
     69             ;;
     70         --)
     71             shift
     72             endofopts=1
     73             ;;
     74         -)
     75             hyphen=1
     76             shift
     77             ;;
     78         -h)
     79             silent=1
     80             shift
     81             ;;
     82         -*)
     83             grep_args="${grep_args} $1"
     84             shift
     85             ;;
     86         *)
     87             # pattern to grep for
     88             endofopts=1
     89             ;;
     90     esac
     91 done
     92 
     93 # if no -e option was found, take next argument as grep-pattern
     94 if [ "${pattern_found}" -lt 1 ]; then
     95     if [ "$#" -ge 1 ]; then
     96         pattern="$1"
     97         shift
     98     elif [ "${hyphen}" -gt 0 ]; then
     99         pattern="-"
    100     else
    101         printf '%s: missing pattern\n' "${prog}" >&2
    102         exit 1
    103     fi
    104 fi
    105 
    106 EXIT_CODE=0
    107 # call grep ...
    108 if [ "$#" -lt 1 ]; then
    109     # ... on stdin
    110     set -f # Disable file name generation (globbing).
    111     # shellcheck disable=SC2086
    112     "${zcat}" - | "${grep}" ${grep_args} -- "${pattern}" -
    113     EXIT_CODE=$?
    114     set +f
    115 else
    116     # ... on all files given on the command line
    117     if [ "${silent}" -lt 1 ] && [ "$#" -gt 1 ]; then
    118         grep_args="-H ${grep_args}"
    119     fi
    120     set -f
    121     while [ "$#" -gt 0 ]; do
    122         # shellcheck disable=SC2086
    123         if [ $pattern_found -eq 2 ]; then
    124             "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- -
    125         else
    126             "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- "${pattern}" -
    127         fi
    128         [ "$?" -ne 0 ] && EXIT_CODE=1
    129         shift
    130     done
    131     set +f
    132 fi
    133 
    134 exit "${EXIT_CODE}"
    135