Code

Merge branch 'maint'
[git.git] / grep.h
1 #ifndef GREP_H
2 #define GREP_H
4 enum grep_pat_token {
5         GREP_PATTERN,
6         GREP_PATTERN_HEAD,
7         GREP_PATTERN_BODY,
8         GREP_AND,
9         GREP_OPEN_PAREN,
10         GREP_CLOSE_PAREN,
11         GREP_NOT,
12         GREP_OR,
13 };
15 enum grep_context {
16         GREP_CONTEXT_HEAD,
17         GREP_CONTEXT_BODY,
18 };
20 enum grep_header_field {
21         GREP_HEADER_AUTHOR = 0,
22         GREP_HEADER_COMMITTER,
23 };
25 struct grep_pat {
26         struct grep_pat *next;
27         const char *origin;
28         int no;
29         enum grep_pat_token token;
30         const char *pattern;
31         enum grep_header_field field;
32         regex_t regexp;
33 };
35 enum grep_expr_node {
36         GREP_NODE_ATOM,
37         GREP_NODE_NOT,
38         GREP_NODE_AND,
39         GREP_NODE_OR,
40 };
42 struct grep_expr {
43         enum grep_expr_node node;
44         unsigned hit;
45         union {
46                 struct grep_pat *atom;
47                 struct grep_expr *unary;
48                 struct {
49                         struct grep_expr *left;
50                         struct grep_expr *right;
51                 } binary;
52         } u;
53 };
55 struct grep_opt {
56         struct grep_pat *pattern_list;
57         struct grep_pat **pattern_tail;
58         struct grep_expr *pattern_expression;
59         int prefix_length;
60         regex_t regexp;
61         unsigned linenum:1;
62         unsigned invert:1;
63         unsigned status_only:1;
64         unsigned name_only:1;
65         unsigned unmatch_name_only:1;
66         unsigned count:1;
67         unsigned word_regexp:1;
68         unsigned fixed:1;
69         unsigned all_match:1;
70 #define GREP_BINARY_DEFAULT     0
71 #define GREP_BINARY_NOMATCH     1
72 #define GREP_BINARY_TEXT        2
73         unsigned binary:2;
74         unsigned extended:1;
75         unsigned relative:1;
76         unsigned pathname:1;
77         unsigned null_following_name:1;
78         int regflags;
79         unsigned pre_context;
80         unsigned post_context;
81 };
83 extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
84 extern void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *);
85 extern void compile_grep_patterns(struct grep_opt *opt);
86 extern void free_grep_patterns(struct grep_opt *opt);
87 extern int grep_buffer(struct grep_opt *opt, const char *name, char *buf, unsigned long size);
89 #endif