xref: /freebsd/sys/contrib/zstd/programs/zstdgrep (revision f3aff7c91bd451d300ffd37ddce5a1fdbe802123)
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)
39	grep_args="-E";;
40    *zfgrep)
41	grep_args="-F";;
42esac
43
44# skip all options and pass them on to grep taking care of options
45# with arguments, and if -e was supplied
46
47while [ $# -gt 0 -a ${endofopts} -eq 0 ]
48do
49    case $1 in
50    # from GNU grep-2.5.1 -- keep in sync!
51	-[ABCDXdefm])
52	    if [ $# -lt 2 ]
53		then
54		echo "${prg}: missing argument for $1 flag" >&2
55		exit 1
56	    fi
57	    case $1 in
58		-e)
59		    pattern="$2"
60		    pattern_found=1
61		    shift 2
62		    break
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
91done
92
93# if no -e option was found, take next argument as grep-pattern
94if [ ${pattern_found} -lt 1 ]
95then
96    if [ $# -ge 1 ]; then
97	pattern="$1"
98	shift
99    elif [ ${hyphen} -gt 0 ]; then
100	pattern="-"
101    else
102	echo "${prg}: missing pattern" >&2
103	exit 1
104    fi
105fi
106
107# call grep ...
108if [ $# -lt 1 ]
109then
110    # ... on stdin
111    ${zcat} -fq - | ${grep} ${grep_args} -- "${pattern}" -
112else
113    # ... on all files given on the command line
114    if [ ${silent} -lt 1 -a $# -gt 1 ]; then
115	grep_args="-H ${grep_args}"
116    fi
117    while [ $# -gt 0 ]
118    do
119	${zcat} -fq -- "$1" | ${grep} --label="${1}" ${grep_args} -- "${pattern}" -
120	shift
121    done
122fi
123
124exit 0
125