1220422Sgabor/*	$NetBSD: grep.h,v 1.5 2011/02/27 17:33:37 joerg Exp $	*/
2210389Sgabor/*	$OpenBSD: grep.h,v 1.15 2010/04/05 03:03:55 tedu Exp $	*/
3210389Sgabor/*	$FreeBSD: stable/11/usr.bin/grep/grep.h 354628 2019-11-11 19:54:08Z kevans $	*/
4210389Sgabor
5210389Sgabor/*-
6330449Seadler * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
7330449Seadler *
8211496Sdes * Copyright (c) 1999 James Howard and Dag-Erling Co��dan Sm��rgrav
9210389Sgabor * Copyright (c) 2008-2009 Gabor Kovesdan <gabor@FreeBSD.org>
10210389Sgabor * All rights reserved.
11210389Sgabor *
12210389Sgabor * Redistribution and use in source and binary forms, with or without
13210389Sgabor * modification, are permitted provided that the following conditions
14210389Sgabor * are met:
15210389Sgabor * 1. Redistributions of source code must retain the above copyright
16210389Sgabor *    notice, this list of conditions and the following disclaimer.
17210389Sgabor * 2. Redistributions in binary form must reproduce the above copyright
18210389Sgabor *    notice, this list of conditions and the following disclaimer in the
19210389Sgabor *    documentation and/or other materials provided with the distribution.
20210389Sgabor *
21210389Sgabor * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22210389Sgabor * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23210389Sgabor * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24210389Sgabor * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25210389Sgabor * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26210389Sgabor * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27210389Sgabor * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28210389Sgabor * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29210389Sgabor * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30210389Sgabor * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31210389Sgabor * SUCH DAMAGE.
32210389Sgabor */
33210389Sgabor
34210389Sgabor#include <bzlib.h>
35210389Sgabor#include <limits.h>
36210389Sgabor#include <regex.h>
37210389Sgabor#include <stdbool.h>
38210389Sgabor#include <stdio.h>
39210389Sgabor#include <zlib.h>
40210389Sgabor
41322582Skevans#ifndef WITHOUT_FASTMATCH
42226035Sgabor#include "fastmatch.h"
43322582Skevans#endif
44226035Sgabor
45210389Sgabor#ifdef WITHOUT_NLS
46264744Spfg#define	getstr(n)	 errstr[n]
47210389Sgabor#else
48210389Sgabor#include <nl_types.h>
49210389Sgabor
50210389Sgaborextern nl_catd		 catalog;
51264744Spfg#define	getstr(n)	 catgets(catalog, 1, n, errstr[n])
52210389Sgabor#endif
53210389Sgabor
54210389Sgaborextern const char		*errstr[];
55210389Sgabor
56322625Skevans#define	VERSION		"2.6.0-FreeBSD"
57210389Sgabor
58264744Spfg#define	GREP_FIXED	0
59264744Spfg#define	GREP_BASIC	1
60264744Spfg#define	GREP_EXTENDED	2
61210389Sgabor
62323443Skevans#if !defined(REG_NOSPEC) && !defined(REG_LITERAL)
63323443Skevans#define WITH_INTERNAL_NOSPEC
64323443Skevans#endif
65323443Skevans
66264744Spfg#define	BINFILE_BIN	0
67264744Spfg#define	BINFILE_SKIP	1
68264744Spfg#define	BINFILE_TEXT	2
69210389Sgabor
70264744Spfg#define	FILE_STDIO	0
71264744Spfg#define	FILE_MMAP	1
72264744Spfg#define	FILE_GZIP	2
73264744Spfg#define	FILE_BZIP	3
74264744Spfg#define	FILE_XZ		4
75264744Spfg#define	FILE_LZMA	5
76210389Sgabor
77264744Spfg#define	DIR_READ	0
78264744Spfg#define	DIR_SKIP	1
79264744Spfg#define	DIR_RECURSE	2
80210389Sgabor
81264744Spfg#define	DEV_READ	0
82264744Spfg#define	DEV_SKIP	1
83210389Sgabor
84264744Spfg#define	LINK_READ	0
85264744Spfg#define	LINK_EXPLICIT	1
86264744Spfg#define	LINK_SKIP	2
87210389Sgabor
88264744Spfg#define	EXCL_PAT	0
89264744Spfg#define	INCL_PAT	1
90210389Sgabor
91322622Skevans#define	MAX_MATCHES	32
92210389Sgabor
93210389Sgaborstruct file {
94211463Sgabor	int		 fd;
95210389Sgabor	bool		 binary;
96210389Sgabor};
97210389Sgabor
98210389Sgaborstruct str {
99322610Skevans	off_t		 boff;
100210389Sgabor	off_t		 off;
101210389Sgabor	size_t		 len;
102210389Sgabor	char		*dat;
103210389Sgabor	char		*file;
104210389Sgabor	int		 line_no;
105210389Sgabor};
106210389Sgabor
107226035Sgaborstruct pat {
108226035Sgabor	char		*pat;
109226035Sgabor	int		 len;
110226035Sgabor};
111226035Sgabor
112210389Sgaborstruct epat {
113210389Sgabor	char		*pat;
114210389Sgabor	int		 mode;
115210389Sgabor};
116210389Sgabor
117354628Skevans/*
118354628Skevans * Parsing context; used to hold things like matches made and
119354628Skevans * other useful bits
120354628Skevans */
121354628Skevansstruct parsec {
122354628Skevans	regmatch_t	matches[MAX_MATCHES];		/* Matches made */
123354628Skevans	/* XXX TODO: This should be a chunk, not a line */
124354628Skevans	struct str	ln;				/* Current line */
125354628Skevans	size_t		lnstart;			/* Position in line */
126354628Skevans	size_t		matchidx;			/* Latest match index */
127354628Skevans	int		printed;			/* Metadata printed? */
128354628Skevans	bool		binary;				/* Binary file? */
129354628Skevans	bool		cntlines;			/* Count lines? */
130354628Skevans};
131354628Skevans
132210389Sgabor/* Flags passed to regcomp() and regexec() */
133210389Sgaborextern int	 cflags, eflags;
134210389Sgabor
135210389Sgabor/* Command line flags */
136210389Sgaborextern bool	 Eflag, Fflag, Gflag, Hflag, Lflag,
137210389Sgabor		 bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag,
138210389Sgabor		 qflag, sflag, vflag, wflag, xflag;
139211364Sgaborextern bool	 dexclude, dinclude, fexclude, finclude, lbflag, nullflag;
140322607Skevansextern long long Aflag, Bflag;
141226035Sgaborextern long long mcount;
142244493Seadlerextern long long mlimit;
143322560Skevansextern char	 fileeol;
144210461Sgaborextern char	*label;
145210461Sgaborextern const char *color;
146210389Sgaborextern int	 binbehave, devbehave, dirbehave, filebehave, grepbehave, linkbehave;
147210389Sgabor
148322587Skevansextern bool	 file_err, matchall;
149210578Sgaborextern unsigned int dpatterns, fpatterns, patterns;
150226035Sgaborextern struct pat *pattern;
151210578Sgaborextern struct epat *dpattern, *fpattern;
152210389Sgaborextern regex_t	*er_pattern, *r_pattern;
153322582Skevans#ifndef WITHOUT_FASTMATCH
154226035Sgaborextern fastmatch_t *fg_pattern;
155322582Skevans#endif
156210389Sgabor
157210389Sgabor/* For regex errors  */
158264744Spfg#define	RE_ERROR_BUF	512
159210389Sgaborextern char	 re_error[RE_ERROR_BUF + 1];	/* Seems big enough */
160210389Sgabor
161210389Sgabor/* util.c */
162210578Sgaborbool	 file_matching(const char *fname);
163354628Skevansbool	 procfile(const char *fn);
164354628Skevansbool	 grep_tree(char **argv);
165210389Sgaborvoid	*grep_malloc(size_t size);
166210389Sgaborvoid	*grep_calloc(size_t nmemb, size_t size);
167210389Sgaborvoid	*grep_realloc(void *ptr, size_t size);
168210578Sgaborchar	*grep_strdup(const char *str);
169322587Skevansvoid	 grep_printline(struct str *line, int sep);
170210389Sgabor
171210389Sgabor/* queue.c */
172322587Skevansbool	 enqueue(struct str *x);
173210389Sgaborvoid	 printqueue(void);
174210389Sgaborvoid	 clearqueue(void);
175210389Sgabor
176210389Sgabor/* file.c */
177210389Sgaborvoid		 grep_close(struct file *f);
178210389Sgaborstruct file	*grep_open(const char *path);
179354628Skevanschar		*grep_fgetln(struct file *f, struct parsec *pc);
180