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