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