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