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