13e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $NetBSD: grep.h,v 1.8 2012/05/06 22:27:00 joerg Exp $ */ 23e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $OpenBSD: grep.h,v 1.15 2010/04/05 03:03:55 tedu Exp $ */ 33e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $FreeBSD: head/usr.bin/grep/grep.h 211496 2010-08-19 09:28:59Z des $ */ 43e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 53e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/*- 63e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Copyright (c) 1999 James Howard and Dag-Erling Coïdan Smørgrav 73e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Copyright (c) 2008-2009 Gabor Kovesdan <gabor@FreeBSD.org> 83e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * All rights reserved. 93e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Redistribution and use in source and binary forms, with or without 113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * modification, are permitted provided that the following conditions 123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * are met: 133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 1. Redistributions of source code must retain the above copyright 143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * notice, this list of conditions and the following disclaimer. 153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 2. Redistributions in binary form must reproduce the above copyright 163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * notice, this list of conditions and the following disclaimer in the 173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * documentation and/or other materials provided with the distribution. 183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * SUCH DAMAGE. 303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifdef ANDROID 333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define WITHOUT_NLS 343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifndef ANDROID 373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <bzlib.h> 383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <limits.h> 403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <regex.h> 413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <stdbool.h> 423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <stdio.h> 433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifndef ANDROID 443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <zlib.h> 453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifdef WITHOUT_NLS 483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define getstr(n) errstr[n] 493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#else 503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <nl_types.h> 513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern nl_catd catalog; 533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define getstr(n) catgets(catalog, 1, n, errstr[n]) 543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern const char *errstr[]; 573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define VERSION "2.5.1-FreeBSD" 593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define GREP_FIXED 0 613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define GREP_BASIC 1 623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define GREP_EXTENDED 2 633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define BINFILE_BIN 0 653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define BINFILE_SKIP 1 663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define BINFILE_TEXT 2 673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define FILE_STDIO 0 693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define FILE_GZIP 1 703e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define FILE_BZIP 2 713e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 723e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define DIR_READ 0 733e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define DIR_SKIP 1 743e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define DIR_RECURSE 2 753e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 763e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define DEV_READ 0 773e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define DEV_SKIP 1 783e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 793e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define LINK_READ 0 803e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define LINK_EXPLICIT 1 813e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define LINK_SKIP 2 823e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 833e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define EXCL_PAT 0 843e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define INCL_PAT 1 853e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 863e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define MAX_LINE_MATCHES 32 873e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 883e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct file { 893e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int fd; 903e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bool binary; 913e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey}; 923e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 933e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct str { 943e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey off_t off; 953e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t len; 963e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey char *dat; 973e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey char *file; 983e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int line_no; 993e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey}; 1003e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1013e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct epat { 1023e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey char *pat; 1033e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int mode; 1043e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey}; 1053e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1063e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeytypedef struct { 1073e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t len; 1083e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey unsigned char *pattern; 1093e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int qsBc[UCHAR_MAX + 1]; 1103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* flags */ 1113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bool bol; 1123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bool eol; 1133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bool reversed; 1143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bool word; 1153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} fastgrep_t; 1163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* Flags passed to regcomp() and regexec() */ 1183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern int cflags, eflags; 1193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* Command line flags */ 1213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern bool Eflag, Fflag, Gflag, Hflag, Lflag, 1223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag, 1233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey qflag, sflag, vflag, wflag, xflag; 1243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern bool dexclude, dinclude, fexclude, finclude, lbflag, nullflag, nulldataflag; 1253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern unsigned char line_sep; 1263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern unsigned long long Aflag, Bflag, mcount; 1273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern char *label; 1283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern const char *color; 1293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern int binbehave, devbehave, dirbehave, filebehave, grepbehave, linkbehave; 1303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern bool notfound; 1323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern int tail; 1333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern unsigned int dpatterns, fpatterns, patterns; 1343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern char **pattern; 1353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern struct epat *dpattern, *fpattern; 1363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern regex_t *er_pattern, *r_pattern; 1373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern fastgrep_t *fg_pattern; 1383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* For regex errors */ 1403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define RE_ERROR_BUF 512 1413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyextern char re_error[RE_ERROR_BUF + 1]; /* Seems big enough */ 1423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* util.c */ 1443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeybool file_matching(const char *fname); 1453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyint procfile(const char *fn); 1463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyint grep_tree(char **argv); 1473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid *grep_malloc(size_t size); 1483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid *grep_calloc(size_t nmemb, size_t size); 1493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid *grep_realloc(void *ptr, size_t size); 1503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeychar *grep_strdup(const char *str); 1513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid printline(struct str *line, int sep, regmatch_t *matches, int m); 1523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* queue.c */ 1543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid enqueue(struct str *x); 1553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid printqueue(void); 1563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid clearqueue(void); 1573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* file.c */ 1593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid grep_close(struct file *f); 1603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct file *grep_open(const char *path); 1613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeychar *grep_fgetln(struct file *f, size_t *len); 1623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* fastgrep.c */ 1643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyint fastcomp(fastgrep_t *, const char *); 1653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid fgrepcomp(fastgrep_t *, const char *); 1663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyint grep_search(fastgrep_t *, const unsigned char *, size_t, regmatch_t *); 167