#include <bzlib.h>
#include <limits.h>
#include <regex.h>
#include <stdbool.h>
#include <stdio.h>
#include <zlib.h>
extern const char *errstr[];
#define VERSION "2.6.0-FreeBSD"
#define GREP_FIXED 0
#define GREP_BASIC 1
#define GREP_EXTENDED 2
#if !defined(REG_NOSPEC) && !defined(REG_LITERAL)
#define WITH_INTERNAL_NOSPEC
#endif
#define BINFILE_BIN 0
#define BINFILE_SKIP 1
#define BINFILE_TEXT 2
#define FILE_STDIO 0
#define FILE_MMAP 1
#define DIR_READ 0
#define DIR_SKIP 1
#define DIR_RECURSE 2
#define DEV_READ 0
#define DEV_SKIP 1
#define LINK_READ 0
#define LINK_EXPLICIT 1
#define LINK_SKIP 2
#define EXCL_PAT 0
#define INCL_PAT 1
#define MAX_MATCHES 32
struct file {
int fd;
bool binary;
};
struct str {
off_t boff;
off_t off;
size_t len;
char *dat;
char *file;
int line_no;
};
struct pat {
char *pat;
int len;
};
struct epat {
char *pat;
int mode;
};
struct parsec {
regmatch_t matches[MAX_MATCHES];
struct str ln;
size_t lnstart;
size_t matchidx;
int printed;
bool binary;
bool cntlines;
};
extern int cflags, eflags;
extern bool Eflag, Fflag, Gflag, Hflag, Lflag,
bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag,
qflag, sflag, vflag, wflag, xflag;
extern bool dexclude, dinclude, fexclude, finclude, lbflag, nullflag;
extern long long Aflag, Bflag;
extern long long mcount;
extern long long mlimit;
extern char fileeol;
extern char *label;
extern const char *color;
extern int binbehave, devbehave, dirbehave, filebehave, grepbehave, linkbehave;
extern bool file_err, matchall;
extern unsigned int dpatterns, fpatterns, patterns;
extern struct pat *pattern;
extern struct epat *dpattern, *fpattern;
extern regex_t *er_pattern, *r_pattern;
#define RE_ERROR_BUF 512
extern char re_error[RE_ERROR_BUF + 1];
bool file_matching(const char *fname);
bool procfile(const char *fn);
bool grep_tree(char **argv);
void *grep_malloc(size_t size);
void *grep_calloc(size_t nmemb, size_t size);
void *grep_realloc(void *ptr, size_t size);
char *grep_strdup(const char *str);
void grep_printline(struct str *line, int sep);
void initqueue(void);
bool enqueue(struct str *x);
void printqueue(void);
void clearqueue(void);
void grep_close(struct file *f);
struct file *grep_open(const char *path);
char *grep_fgetln(struct file *f, struct parsec *pc);