ce909697361125c28aa9ecbb401735d9ad47397d
   1#ifndef GREP_H
   2#define GREP_H
   3#include "color.h"
   4#ifdef USE_LIBPCRE1
   5#include <pcre.h>
   6#ifdef PCRE_CONFIG_JIT
   7#if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
   8#define GIT_PCRE1_USE_JIT
   9#endif
  10#endif
  11#ifndef PCRE_STUDY_JIT_COMPILE
  12#define PCRE_STUDY_JIT_COMPILE 0
  13#endif
  14#if PCRE_MAJOR <= 8 && PCRE_MINOR < 20
  15typedef int pcre_jit_stack;
  16#endif
  17#else
  18typedef int pcre;
  19typedef int pcre_extra;
  20typedef int pcre_jit_stack;
  21#endif
  22#include "kwset.h"
  23#include "thread-utils.h"
  24#include "userdiff.h"
  25
  26enum grep_pat_token {
  27        GREP_PATTERN,
  28        GREP_PATTERN_HEAD,
  29        GREP_PATTERN_BODY,
  30        GREP_AND,
  31        GREP_OPEN_PAREN,
  32        GREP_CLOSE_PAREN,
  33        GREP_NOT,
  34        GREP_OR
  35};
  36
  37enum grep_context {
  38        GREP_CONTEXT_HEAD,
  39        GREP_CONTEXT_BODY
  40};
  41
  42enum grep_header_field {
  43        GREP_HEADER_FIELD_MIN = 0,
  44        GREP_HEADER_AUTHOR = GREP_HEADER_FIELD_MIN,
  45        GREP_HEADER_COMMITTER,
  46        GREP_HEADER_REFLOG,
  47
  48        /* Must be at the end of the enum */
  49        GREP_HEADER_FIELD_MAX
  50};
  51
  52struct grep_pat {
  53        struct grep_pat *next;
  54        const char *origin;
  55        int no;
  56        enum grep_pat_token token;
  57        char *pattern;
  58        size_t patternlen;
  59        enum grep_header_field field;
  60        regex_t regexp;
  61        pcre *pcre1_regexp;
  62        pcre_extra *pcre1_extra_info;
  63        pcre_jit_stack *pcre1_jit_stack;
  64        const unsigned char *pcre1_tables;
  65        int pcre1_jit_on;
  66        kwset_t kws;
  67        unsigned fixed:1;
  68        unsigned ignore_case:1;
  69        unsigned word_regexp:1;
  70};
  71
  72enum grep_expr_node {
  73        GREP_NODE_ATOM,
  74        GREP_NODE_NOT,
  75        GREP_NODE_AND,
  76        GREP_NODE_TRUE,
  77        GREP_NODE_OR
  78};
  79
  80enum grep_pattern_type {
  81        GREP_PATTERN_TYPE_UNSPECIFIED = 0,
  82        GREP_PATTERN_TYPE_BRE,
  83        GREP_PATTERN_TYPE_ERE,
  84        GREP_PATTERN_TYPE_FIXED,
  85        GREP_PATTERN_TYPE_PCRE
  86};
  87
  88struct grep_expr {
  89        enum grep_expr_node node;
  90        unsigned hit;
  91        union {
  92                struct grep_pat *atom;
  93                struct grep_expr *unary;
  94                struct {
  95                        struct grep_expr *left;
  96                        struct grep_expr *right;
  97                } binary;
  98        } u;
  99};
 100
 101struct grep_opt {
 102        struct grep_pat *pattern_list;
 103        struct grep_pat **pattern_tail;
 104        struct grep_pat *header_list;
 105        struct grep_pat **header_tail;
 106        struct grep_expr *pattern_expression;
 107        const char *prefix;
 108        int prefix_length;
 109        regex_t regexp;
 110        int linenum;
 111        int invert;
 112        int ignore_case;
 113        int status_only;
 114        int name_only;
 115        int unmatch_name_only;
 116        int count;
 117        int word_regexp;
 118        int fixed;
 119        int all_match;
 120        int debug;
 121#define GREP_BINARY_DEFAULT     0
 122#define GREP_BINARY_NOMATCH     1
 123#define GREP_BINARY_TEXT        2
 124        int binary;
 125        int allow_textconv;
 126        int extended;
 127        int use_reflog_filter;
 128        int pcre1;
 129        int relative;
 130        int pathname;
 131        int null_following_name;
 132        int color;
 133        int max_depth;
 134        int funcname;
 135        int funcbody;
 136        int extended_regexp_option;
 137        int pattern_type_option;
 138        char color_context[COLOR_MAXLEN];
 139        char color_filename[COLOR_MAXLEN];
 140        char color_function[COLOR_MAXLEN];
 141        char color_lineno[COLOR_MAXLEN];
 142        char color_match_context[COLOR_MAXLEN];
 143        char color_match_selected[COLOR_MAXLEN];
 144        char color_selected[COLOR_MAXLEN];
 145        char color_sep[COLOR_MAXLEN];
 146        int regflags;
 147        unsigned pre_context;
 148        unsigned post_context;
 149        unsigned last_shown;
 150        int show_hunk_mark;
 151        int file_break;
 152        int heading;
 153        void *priv;
 154
 155        void (*output)(struct grep_opt *opt, const void *data, size_t size);
 156        void *output_priv;
 157};
 158
 159extern void init_grep_defaults(void);
 160extern int grep_config(const char *var, const char *value, void *);
 161extern void grep_init(struct grep_opt *, const char *prefix);
 162void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt);
 163
 164extern void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t);
 165extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
 166extern void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *);
 167extern void compile_grep_patterns(struct grep_opt *opt);
 168extern void free_grep_patterns(struct grep_opt *opt);
 169extern int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size);
 170
 171struct grep_source {
 172        char *name;
 173
 174        enum grep_source_type {
 175                GREP_SOURCE_SHA1,
 176                GREP_SOURCE_FILE,
 177                GREP_SOURCE_BUF,
 178                GREP_SOURCE_SUBMODULE,
 179        } type;
 180        void *identifier;
 181
 182        char *buf;
 183        unsigned long size;
 184
 185        char *path; /* for attribute lookups */
 186        struct userdiff_driver *driver;
 187};
 188
 189void grep_source_init(struct grep_source *gs, enum grep_source_type type,
 190                      const char *name, const char *path,
 191                      const void *identifier);
 192void grep_source_clear_data(struct grep_source *gs);
 193void grep_source_clear(struct grep_source *gs);
 194void grep_source_load_driver(struct grep_source *gs);
 195
 196
 197int grep_source(struct grep_opt *opt, struct grep_source *gs);
 198
 199extern struct grep_opt *grep_opt_dup(const struct grep_opt *opt);
 200extern int grep_threads_ok(const struct grep_opt *opt);
 201
 202#ifndef NO_PTHREADS
 203/*
 204 * Mutex used around access to the attributes machinery if
 205 * opt->use_threads.  Must be initialized/destroyed by callers!
 206 */
 207extern int grep_use_locks;
 208extern pthread_mutex_t grep_attr_mutex;
 209extern pthread_mutex_t grep_read_mutex;
 210
 211static inline void grep_read_lock(void)
 212{
 213        if (grep_use_locks)
 214                pthread_mutex_lock(&grep_read_mutex);
 215}
 216
 217static inline void grep_read_unlock(void)
 218{
 219        if (grep_use_locks)
 220                pthread_mutex_unlock(&grep_read_mutex);
 221}
 222
 223#else
 224#define grep_read_lock()
 225#define grep_read_unlock()
 226#endif
 227
 228#endif