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