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 124 /* 125 * NEEDSWORK: See if we can remove this field, because the repository 126 * should probably be per-source. That is, grep.c functions using this 127 * field should probably start using "repo" in "struct grep_source" 128 * instead. 129 * 130 * This is potentially the cause of at least one bug - "git grep" 131 * using the textconv attributes from the superproject on the 132 * submodules. See the failing "git grep --textconv" tests in 133 * t7814-grep-recurse-submodules.sh for more information. 134 */ 135 struct repository *repo; 136 137 const char *prefix; 138 int prefix_length; 139 regex_t regexp; 140 int linenum; 141 int columnnum; 142 int invert; 143 int ignore_case; 144 int status_only; 145 int name_only; 146 int unmatch_name_only; 147 int count; 148 int word_regexp; 149 int fixed; 150 int all_match; 151 #define GREP_BINARY_DEFAULT 0 152 #define GREP_BINARY_NOMATCH 1 153 #define GREP_BINARY_TEXT 2 154 int binary; 155 int allow_textconv; 156 int extended; 157 int use_reflog_filter; 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 int grep_config(const char *var, const char *value, void *); 184 void grep_init(struct grep_opt *, struct repository *repo, const char *prefix); 185 void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt); 186 187 void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t); 188 void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t); 189 void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *); 190 void compile_grep_patterns(struct grep_opt *opt); 191 void free_grep_patterns(struct grep_opt *opt); 192 int grep_buffer(struct grep_opt *opt, const char *buf, unsigned long size); 193 194 /* The field parameter is only used to filter header patterns 195 * (where appropriate). If filtering isn't desirable 196 * GREP_HEADER_FIELD_MAX should be supplied. 197 */ 198 int grep_next_match(struct grep_opt *opt, 199 const char *bol, const char *eol, 200 enum grep_context ctx, regmatch_t *pmatch, 201 enum grep_header_field field, int eflags); 202 203 struct grep_source { 204 char *name; 205 206 enum grep_source_type { 207 GREP_SOURCE_OID, 208 GREP_SOURCE_FILE, 209 GREP_SOURCE_BUF, 210 } type; 211 void *identifier; 212 struct repository *repo; /* if GREP_SOURCE_OID */ 213 214 const char *buf; 215 unsigned long size; 216 217 char *path; /* for attribute lookups */ 218 struct userdiff_driver *driver; 219 }; 220 221 void grep_source_init_file(struct grep_source *gs, const char *name, 222 const char *path); 223 void grep_source_init_oid(struct grep_source *gs, const char *name, 224 const char *path, const struct object_id *oid, 225 struct repository *repo); 226 void grep_source_clear_data(struct grep_source *gs); 227 void grep_source_clear(struct grep_source *gs); 228 void grep_source_load_driver(struct grep_source *gs, 229 struct index_state *istate); 230 231 232 int grep_source(struct grep_opt *opt, struct grep_source *gs); 233 234 struct grep_opt *grep_opt_dup(const struct grep_opt *opt); 235 236 /* 237 * Mutex used around access to the attributes machinery if 238 * opt->use_threads. Must be initialized/destroyed by callers! 239 */ 240 extern int grep_use_locks; 241 extern pthread_mutex_t grep_attr_mutex; 242 243 #endif 244