Mercurial > vim
annotate src/regexp.h @ 16329:ee09f240ebcd
Added tag v8.1.1169 for changeset b576f2e069b73d828c14803284741b25d577c082
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 13 Apr 2019 22:45:05 +0200 |
parents | ffd834f893aa |
children | 3d6b282e2d6e |
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 | |
36 /* Which regexp engine to use? Needed for vim_regcomp(). | |
37 * Must match with 'regexpengine'. */ | |
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 { | |
6328 | 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 |
4444 | 79 char_u program[1]; /* actually longer.. */ |
80 } bt_regprog_T; | |
81 | |
82 /* | |
83 * Structure representing a NFA state. | |
84 * A NFA state may have no outgoing edge, when it is a NFA_MATCH state. | |
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; | |
4718
ec72bb4a0fc2
updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents:
4690
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 { | |
6328 | 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 |
4690
9d97a0c045ef
updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents:
4686
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 |
03375ccf28a2
updated for version 7.3.1133
Bram Moolenaar <bram@vim.org>
parents:
4718
diff
changeset
|
111 int reganch; /* pattern starts with ^ */ |
03375ccf28a2
updated for version 7.3.1133
Bram Moolenaar <bram@vim.org>
parents:
4718
diff
changeset
|
112 int regstart; /* char at start of pattern */ |
4805
66803af09906
updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents:
4785
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 |
4553
7b835b2969af
updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents:
4539
diff
changeset
|
115 int has_zend; /* pattern contains \ze */ |
4647
857f6c53f117
updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents:
4583
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; |
4561
4d81fdda8f35
updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents:
4553
diff
changeset
|
121 int nsubexp; /* number of () */ |
4444 | 122 int nstate; |
4837
05b8436873d4
updated for version 7.3.1165
Bram Moolenaar <bram@vim.org>
parents:
4805
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; | |
418 | 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 | |
7 | 176 #endif /* _REGEXP_H */ |