The second batch
[git] / grep.h
1 #ifndef GREP_H
2 #define GREP_H
3 #include "color.h"
4 #ifdef USE_LIBPCRE2
5 #define PCRE2_CODE_UNIT_WIDTH 8
6 #include <pcre2.h>
7 #if (PCRE2_MAJOR >= 10 && PCRE2_MINOR >= 36) || PCRE2_MAJOR >= 11
8 #define GIT_PCRE2_VERSION_10_36_OR_HIGHER
9 #endif
10 #if (PCRE2_MAJOR >= 10 && PCRE2_MINOR >= 34) || PCRE2_MAJOR >= 11
11 #define GIT_PCRE2_VERSION_10_34_OR_HIGHER
12 #endif
13 #else
14 typedef int pcre2_code;
15 typedef int pcre2_match_data;
16 typedef int pcre2_compile_context;
17 typedef int pcre2_general_context;
18 #endif
19 #ifndef PCRE2_MATCH_INVALID_UTF
20 /* PCRE2_MATCH_* dummy also with !USE_LIBPCRE2, for test-pcre2-config.c */
21 #define PCRE2_MATCH_INVALID_UTF 0
22 #endif
23 #include "thread-utils.h"
24 #include "userdiff.h"
25
26 struct repository;
27
28 enum grep_pat_token {
29         GREP_PATTERN,
30         GREP_PATTERN_HEAD,
31         GREP_PATTERN_BODY,
32         GREP_AND,
33         GREP_OPEN_PAREN,
34         GREP_CLOSE_PAREN,
35         GREP_NOT,
36         GREP_OR
37 };
38
39 enum grep_context {
40         GREP_CONTEXT_HEAD,
41         GREP_CONTEXT_BODY
42 };
43
44 enum grep_header_field {
45         GREP_HEADER_FIELD_MIN = 0,
46         GREP_HEADER_AUTHOR = GREP_HEADER_FIELD_MIN,
47         GREP_HEADER_COMMITTER,
48         GREP_HEADER_REFLOG,
49
50         /* Must be at the end of the enum */
51         GREP_HEADER_FIELD_MAX
52 };
53
54 enum grep_color {
55         GREP_COLOR_CONTEXT,
56         GREP_COLOR_FILENAME,
57         GREP_COLOR_FUNCTION,
58         GREP_COLOR_LINENO,
59         GREP_COLOR_COLUMNNO,
60         GREP_COLOR_MATCH_CONTEXT,
61         GREP_COLOR_MATCH_SELECTED,
62         GREP_COLOR_SELECTED,
63         GREP_COLOR_SEP,
64         NR_GREP_COLORS
65 };
66
67 struct grep_pat {
68         struct grep_pat *next;
69         const char *origin;
70         int no;
71         enum grep_pat_token token;
72         char *pattern;
73         size_t patternlen;
74         enum grep_header_field field;
75         regex_t regexp;
76         pcre2_code *pcre2_pattern;
77         pcre2_match_data *pcre2_match_data;
78         pcre2_compile_context *pcre2_compile_context;
79         pcre2_general_context *pcre2_general_context;
80         const uint8_t *pcre2_tables;
81         uint32_t pcre2_jit_on;
82         unsigned fixed:1;
83         unsigned is_fixed:1;
84         unsigned ignore_case:1;
85         unsigned word_regexp:1;
86 };
87
88 enum grep_expr_node {
89         GREP_NODE_ATOM,
90         GREP_NODE_NOT,
91         GREP_NODE_AND,
92         GREP_NODE_TRUE,
93         GREP_NODE_OR
94 };
95
96 enum grep_pattern_type {
97         GREP_PATTERN_TYPE_UNSPECIFIED = 0,
98         GREP_PATTERN_TYPE_BRE,
99         GREP_PATTERN_TYPE_ERE,
100         GREP_PATTERN_TYPE_FIXED,
101         GREP_PATTERN_TYPE_PCRE
102 };
103
104 struct grep_expr {
105         enum grep_expr_node node;
106         unsigned hit;
107         union {
108                 struct grep_pat *atom;
109                 struct grep_expr *unary;
110                 struct {
111                         struct grep_expr *left;
112                         struct grep_expr *right;
113                 } binary;
114         } u;
115 };
116
117 struct grep_opt {
118         struct grep_pat *pattern_list;
119         struct grep_pat **pattern_tail;
120         struct grep_pat *header_list;
121         struct grep_pat **header_tail;
122         struct grep_expr *pattern_expression;
123         struct repository *repo;
124         const char *prefix;
125         int prefix_length;
126         regex_t regexp;
127         int linenum;
128         int columnnum;
129         int invert;
130         int ignore_case;
131         int status_only;
132         int name_only;
133         int unmatch_name_only;
134         int count;
135         int word_regexp;
136         int fixed;
137         int all_match;
138 #define GREP_BINARY_DEFAULT     0
139 #define GREP_BINARY_NOMATCH     1
140 #define GREP_BINARY_TEXT        2
141         int binary;
142         int allow_textconv;
143         int extended;
144         int use_reflog_filter;
145         int pcre2;
146         int relative;
147         int pathname;
148         int null_following_name;
149         int only_matching;
150         int color;
151         int max_depth;
152         int funcname;
153         int funcbody;
154         int extended_regexp_option;
155         int pattern_type_option;
156         int ignore_locale;
157         char colors[NR_GREP_COLORS][COLOR_MAXLEN];
158         unsigned pre_context;
159         unsigned post_context;
160         unsigned last_shown;
161         int show_hunk_mark;
162         int file_break;
163         int heading;
164         void *priv;
165
166         void (*output)(struct grep_opt *opt, const void *data, size_t size);
167         void *output_priv;
168 };
169
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
219 #endif