grep: refactor and simplify PCRE1 support
[git.git] / grep.h
blobff620d784a067b5dea73b1c0d5f5b6030abf7cfe
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"
21 struct repository;
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
34 enum grep_context {
35 GREP_CONTEXT_HEAD,
36 GREP_CONTEXT_BODY
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,
45 /* Must be at the end of the enum */
46 GREP_HEADER_FIELD_MAX
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
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;
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
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
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;
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;
165 void (*output)(struct grep_opt *opt, const void *data, size_t size);
166 void *output_priv;
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);
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);
181 struct grep_source {
182 char *name;
184 enum grep_source_type {
185 GREP_SOURCE_OID,
186 GREP_SOURCE_FILE,
187 GREP_SOURCE_BUF,
188 } type;
189 void *identifier;
191 char *buf;
192 unsigned long size;
194 char *path; /* for attribute lookups */
195 struct userdiff_driver *driver;
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);
207 int grep_source(struct grep_opt *opt, struct grep_source *gs);
209 struct grep_opt *grep_opt_dup(const struct grep_opt *opt);
210 int grep_threads_ok(const struct grep_opt *opt);
213 * Mutex used around access to the attributes machinery if
214 * opt->use_threads. Must be initialized/destroyed by callers!
216 extern int grep_use_locks;
217 extern pthread_mutex_t grep_attr_mutex;
218 extern pthread_mutex_t grep_read_mutex;
220 static inline void grep_read_lock(void)
222 if (grep_use_locks)
223 pthread_mutex_lock(&grep_read_mutex);
226 static inline void grep_read_unlock(void)
228 if (grep_use_locks)
229 pthread_mutex_unlock(&grep_read_mutex);
232 #endif