Mercurial > vim
annotate src/regexp.h @ 19712:714875349336
Added tag v8.2.0412 for changeset 831a3f3be6f4330efd5ab2846ee6627fe3daa5b4
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 19 Mar 2020 17:15:04 +0100 |
parents | 6e3dc2d630c2 |
children | 89c181c99e23 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
6328
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE | |
4 * | |
5 * This is NOT the original regular expression code as written by Henry | |
6 * Spencer. This code has been modified specifically for use with Vim, and | |
7 * should not be used apart from compiling Vim. If you want a good regular | |
8 * expression library, get the original code. | |
9 * | |
10 * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE | |
11 */ | |
12 | |
13 #ifndef _REGEXP_H | |
14 #define _REGEXP_H | |
15 | |
16 /* | |
17 * The number of sub-matches is limited to 10. | |
18 * The first one (index 0) is the whole match, referenced with "\0". | |
19 * The second one (index 1) is the first sub-match, referenced with "\1". | |
20 * This goes up to the tenth (index 9), referenced with "\9". | |
21 */ | |
22 #define NSUBEXP 10 | |
23 | |
24 /* | |
4444 | 25 * In the NFA engine: how many braces are allowed. |
26 * TODO(RE): Use dynamic memory allocation instead of static, like here | |
27 */ | |
28 #define NFA_MAX_BRACES 20 | |
29 | |
6328 | 30 /* |
31 * In the NFA engine: how many states are allowed | |
32 */ | |
33 #define NFA_MAX_STATES 100000 | |
34 #define NFA_TOO_EXPENSIVE -1 | |
35 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
36 // Which regexp engine to use? Needed for vim_regcomp(). |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
37 // Must match with 'regexpengine'. |
6328 | 38 #define AUTOMATIC_ENGINE 0 |
39 #define BACKTRACKING_ENGINE 1 | |
40 #define NFA_ENGINE 2 | |
41 | |
4444 | 42 typedef struct regengine regengine_T; |
43 | |
44 /* | |
7 | 45 * Structure returned by vim_regcomp() to pass on to vim_regexec(). |
4444 | 46 * This is the general structure. For the actual matcher, two specific |
47 * structures are used. See code below. | |
48 */ | |
49 typedef struct regprog | |
50 { | |
51 regengine_T *engine; | |
52 unsigned regflags; | |
14354
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
53 unsigned re_engine; // automatic, backtracking or nfa engine |
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
54 unsigned re_flags; // second argument for vim_regcomp() |
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
55 int re_in_use; // prog is being executed |
4444 | 56 } regprog_T; |
57 | |
58 /* | |
59 * Structure used by the back track matcher. | |
7 | 60 * These fields are only to be used in regexp.c! |
4444 | 61 * See regexp.c for an explanation. |
7 | 62 */ |
63 typedef struct | |
64 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
65 // These four members implement regprog_T |
4444 | 66 regengine_T *engine; |
67 unsigned regflags; | |
6328 | 68 unsigned re_engine; |
14354
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
69 unsigned re_flags; |
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
70 int re_in_use; |
4444 | 71 |
7 | 72 int regstart; |
73 char_u reganch; | |
74 char_u *regmust; | |
75 int regmlen; | |
4686
8db697ae406a
updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents:
4647
diff
changeset
|
76 #ifdef FEAT_SYN_HL |
4444 | 77 char_u reghasz; |
4686
8db697ae406a
updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents:
4647
diff
changeset
|
78 #endif |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
79 char_u program[1]; // actually longer.. |
4444 | 80 } bt_regprog_T; |
81 | |
82 /* | |
83 * Structure representing a NFA state. | |
16378
3d6b282e2d6e
patch 8.1.1194: typos and small problems in source files
Bram Moolenaar <Bram@vim.org>
parents:
14354
diff
changeset
|
84 * An NFA state may have no outgoing edge, when it is a NFA_MATCH state. |
4444 | 85 */ |
86 typedef struct nfa_state nfa_state_T; | |
87 struct nfa_state | |
88 { | |
89 int c; | |
90 nfa_state_T *out; | |
91 nfa_state_T *out1; | |
92 int id; | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
93 int lastlist[2]; // 0: normal, 1: recursive |
4583
321cfbef9431
updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents:
4571
diff
changeset
|
94 int val; |
4444 | 95 }; |
96 | |
97 /* | |
98 * Structure used by the NFA matcher. | |
99 */ | |
100 typedef struct | |
101 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
102 // These three members implement regprog_T |
4444 | 103 regengine_T *engine; |
7 | 104 unsigned regflags; |
6328 | 105 unsigned re_engine; |
14354
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
106 unsigned re_flags; |
ffd834f893aa
patch 8.1.0192: executing regexp recursively fails with a crash
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
107 int re_in_use; |
4444 | 108 |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
109 nfa_state_T *start; // points into state[] |
4772
03375ccf28a2
updated for version 7.3.1133
Bram Moolenaar <bram@vim.org>
parents:
4718
diff
changeset
|
110 |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
111 int reganch; // pattern starts with ^ |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
112 int regstart; // char at start of pattern |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
113 char_u *match_text; // plain text to match with |
4772
03375ccf28a2
updated for version 7.3.1133
Bram Moolenaar <bram@vim.org>
parents:
4718
diff
changeset
|
114 |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
115 int has_zend; // pattern contains \ze |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
116 int has_backref; // pattern contains \1 .. \9 |
4686
8db697ae406a
updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents:
4647
diff
changeset
|
117 #ifdef FEAT_SYN_HL |
8db697ae406a
updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents:
4647
diff
changeset
|
118 int reghasz; |
8db697ae406a
updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents:
4647
diff
changeset
|
119 #endif |
4690
9d97a0c045ef
updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents:
4686
diff
changeset
|
120 char_u *pattern; |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
121 int nsubexp; // number of () |
4444 | 122 int nstate; |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
123 nfa_state_T state[1]; // actually longer.. |
4444 | 124 } nfa_regprog_T; |
7 | 125 |
126 /* | |
127 * Structure to be used for single-line matching. | |
128 * Sub-match "no" starts at "startp[no]" and ends just before "endp[no]". | |
129 * When there is no match, the pointer is NULL. | |
130 */ | |
131 typedef struct | |
132 { | |
133 regprog_T *regprog; | |
134 char_u *startp[NSUBEXP]; | |
135 char_u *endp[NSUBEXP]; | |
136 int rm_ic; | |
137 } regmatch_T; | |
138 | |
139 /* | |
140 * Structure to be used for multi-line matching. | |
141 * Sub-match "no" starts in line "startpos[no].lnum" column "startpos[no].col" | |
142 * and ends in line "endpos[no].lnum" just before column "endpos[no].col". | |
143 * The line numbers are relative to the first line, thus startpos[0].lnum is | |
144 * always 0. | |
145 * When there is no match, the line number is -1. | |
146 */ | |
147 typedef struct | |
148 { | |
149 regprog_T *regprog; | |
150 lpos_T startpos[NSUBEXP]; | |
151 lpos_T endpos[NSUBEXP]; | |
152 int rmm_ic; | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
153 colnr_T rmm_maxcol; // when not zero: maximum column |
7 | 154 } regmmatch_T; |
155 | |
156 /* | |
157 * Structure used to store external references: "\z\(\)" to "\z\1". | |
158 * Use a reference count to avoid the need to copy this around. When it goes | |
159 * from 1 to zero the matches need to be freed. | |
160 */ | |
161 typedef struct | |
162 { | |
163 short refcnt; | |
164 char_u *matches[NSUBEXP]; | |
165 } reg_extmatch_T; | |
166 | |
4444 | 167 struct regengine |
168 { | |
169 regprog_T *(*regcomp)(char_u*, int); | |
4805
66803af09906
updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents:
4785
diff
changeset
|
170 void (*regfree)(regprog_T *); |
11521
578df034735d
patch 8.0.0643: when a pattern search is slow Vim becomes unusable
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
171 int (*regexec_nl)(regmatch_T *, char_u *, colnr_T, int); |
578df034735d
patch 8.0.0643: when a pattern search is slow Vim becomes unusable
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
172 long (*regexec_multi)(regmmatch_T *, win_T *, buf_T *, linenr_T, colnr_T, proftime_T *, int *); |
4444 | 173 char_u *expr; |
174 }; | |
175 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
176 #endif // _REGEXP_H |