annotate src/regexp_nfa.c @ 4720:bd6bef0bd0fb v7.3.1107

updated for version 7.3.1107 Problem: Compiler warnings for unused variables. Solution: Put the variables inside #ifdef.
author Bram Moolenaar <bram@vim.org>
date Mon, 03 Jun 2013 19:41:06 +0200
parents ec72bb4a0fc2
children 3849c811cc0b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3 * NFA regular expression implementation.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5 * This file is included in "regexp.c".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
6 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
7
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
8 /*
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
9 * Logging of NFA engine.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
10 *
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
11 * The NFA engine can write four log files:
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
12 * - Error log: Contains NFA engine's fatal errors.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
13 * - Dump log: Contains compiled NFA state machine's information.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
14 * - Run log: Contains information of matching procedure.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
15 * - Debug log: Contains detailed information of matching procedure. Can be
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
16 * disabled by undefining NFA_REGEXP_DEBUG_LOG.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
17 * The first one can also be used without debug mode.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
18 * The last three are enabled when compiled as debug mode and individually
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
19 * disabled by commenting them out.
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
20 * The log files can get quite big!
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
21 * Do disable all of this when compiling Vim for debugging, undefine DEBUG in
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
22 * regexp.c
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
23 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
24 #ifdef DEBUG
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
25 # define NFA_REGEXP_ERROR_LOG "nfa_regexp_error.log"
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
26 # define ENABLE_LOG
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
27 # define NFA_REGEXP_DUMP_LOG "nfa_regexp_dump.log"
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
28 # define NFA_REGEXP_RUN_LOG "nfa_regexp_run.log"
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
29 # define NFA_REGEXP_DEBUG_LOG "nfa_regexp_debug.log"
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
30 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
31
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
32 enum
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
33 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
34 NFA_SPLIT = -1024,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
35 NFA_MATCH,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
36 NFA_SKIP_CHAR, /* matches a 0-length char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
37 NFA_END_NEG_RANGE, /* Used when expanding [^ab] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
38
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
39 NFA_CONCAT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
40 NFA_OR,
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
41 NFA_STAR, /* greedy * */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
42 NFA_STAR_NONGREEDY, /* non-greedy * */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
43 NFA_QUEST, /* greedy \? */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
44 NFA_QUEST_NONGREEDY, /* non-greedy \? */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
45 NFA_NOT, /* used for [^ab] negated char ranges */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
46
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
47 NFA_BOL, /* ^ Begin line */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
48 NFA_EOL, /* $ End line */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
49 NFA_BOW, /* \< Begin word */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
50 NFA_EOW, /* \> End word */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
51 NFA_BOF, /* \%^ Begin file */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
52 NFA_EOF, /* \%$ End file */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
53 NFA_NEWL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
54 NFA_ZSTART, /* Used for \zs */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
55 NFA_ZEND, /* Used for \ze */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
56 NFA_NOPEN, /* Start of subexpression marked with \%( */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
57 NFA_NCLOSE, /* End of subexpr. marked with \%( ... \) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
58 NFA_START_INVISIBLE,
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
59 NFA_START_INVISIBLE_BEFORE,
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
60 NFA_END_INVISIBLE,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
61 NFA_COMPOSING, /* Next nodes in NFA are part of the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
62 composing multibyte char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
63 NFA_END_COMPOSING, /* End of a composing char in the NFA */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
64
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
65 /* The following are used only in the postfix form, not in the NFA */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
66 NFA_PREV_ATOM_NO_WIDTH, /* Used for \@= */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
67 NFA_PREV_ATOM_NO_WIDTH_NEG, /* Used for \@! */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
68 NFA_PREV_ATOM_JUST_BEFORE, /* Used for \@<= */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
69 NFA_PREV_ATOM_JUST_BEFORE_NEG, /* Used for \@<! */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
70 NFA_PREV_ATOM_LIKE_PATTERN, /* Used for \@> */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
71
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
72 NFA_BACKREF1, /* \1 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
73 NFA_BACKREF2, /* \2 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
74 NFA_BACKREF3, /* \3 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
75 NFA_BACKREF4, /* \4 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
76 NFA_BACKREF5, /* \5 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
77 NFA_BACKREF6, /* \6 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
78 NFA_BACKREF7, /* \7 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
79 NFA_BACKREF8, /* \8 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
80 NFA_BACKREF9, /* \9 */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
81 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
82 NFA_ZREF1, /* \z1 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
83 NFA_ZREF2, /* \z2 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
84 NFA_ZREF3, /* \z3 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
85 NFA_ZREF4, /* \z4 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
86 NFA_ZREF5, /* \z5 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
87 NFA_ZREF6, /* \z6 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
88 NFA_ZREF7, /* \z7 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
89 NFA_ZREF8, /* \z8 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
90 NFA_ZREF9, /* \z9 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
91 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
92 NFA_SKIP, /* Skip characters */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
93
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
94 NFA_MOPEN,
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
95 NFA_MOPEN1,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
96 NFA_MOPEN2,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
97 NFA_MOPEN3,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
98 NFA_MOPEN4,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
99 NFA_MOPEN5,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
100 NFA_MOPEN6,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
101 NFA_MOPEN7,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
102 NFA_MOPEN8,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
103 NFA_MOPEN9,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
104
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
105 NFA_MCLOSE,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
106 NFA_MCLOSE1,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
107 NFA_MCLOSE2,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
108 NFA_MCLOSE3,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
109 NFA_MCLOSE4,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
110 NFA_MCLOSE5,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
111 NFA_MCLOSE6,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
112 NFA_MCLOSE7,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
113 NFA_MCLOSE8,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
114 NFA_MCLOSE9,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
115
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
116 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
117 NFA_ZOPEN,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
118 NFA_ZOPEN1,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
119 NFA_ZOPEN2,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
120 NFA_ZOPEN3,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
121 NFA_ZOPEN4,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
122 NFA_ZOPEN5,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
123 NFA_ZOPEN6,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
124 NFA_ZOPEN7,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
125 NFA_ZOPEN8,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
126 NFA_ZOPEN9,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
127
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
128 NFA_ZCLOSE,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
129 NFA_ZCLOSE1,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
130 NFA_ZCLOSE2,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
131 NFA_ZCLOSE3,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
132 NFA_ZCLOSE4,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
133 NFA_ZCLOSE5,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
134 NFA_ZCLOSE6,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
135 NFA_ZCLOSE7,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
136 NFA_ZCLOSE8,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
137 NFA_ZCLOSE9,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
138 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
139
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
140 /* NFA_FIRST_NL */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
141 NFA_ANY, /* Match any one character. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
142 NFA_ANYOF, /* Match any character in this string. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
143 NFA_ANYBUT, /* Match any character not in this string. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
144 NFA_IDENT, /* Match identifier char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
145 NFA_SIDENT, /* Match identifier char but no digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
146 NFA_KWORD, /* Match keyword char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
147 NFA_SKWORD, /* Match word char but no digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
148 NFA_FNAME, /* Match file name char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
149 NFA_SFNAME, /* Match file name char but no digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
150 NFA_PRINT, /* Match printable char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
151 NFA_SPRINT, /* Match printable char but no digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
152 NFA_WHITE, /* Match whitespace char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
153 NFA_NWHITE, /* Match non-whitespace char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
154 NFA_DIGIT, /* Match digit char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
155 NFA_NDIGIT, /* Match non-digit char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
156 NFA_HEX, /* Match hex char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
157 NFA_NHEX, /* Match non-hex char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
158 NFA_OCTAL, /* Match octal char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
159 NFA_NOCTAL, /* Match non-octal char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
160 NFA_WORD, /* Match word char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
161 NFA_NWORD, /* Match non-word char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
162 NFA_HEAD, /* Match head char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
163 NFA_NHEAD, /* Match non-head char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
164 NFA_ALPHA, /* Match alpha char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
165 NFA_NALPHA, /* Match non-alpha char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
166 NFA_LOWER, /* Match lowercase char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
167 NFA_NLOWER, /* Match non-lowercase char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
168 NFA_UPPER, /* Match uppercase char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
169 NFA_NUPPER, /* Match non-uppercase char */
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
170
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
171 NFA_CURSOR, /* Match cursor pos */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
172 NFA_LNUM, /* Match line number */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
173 NFA_LNUM_GT, /* Match > line number */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
174 NFA_LNUM_LT, /* Match < line number */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
175 NFA_COL, /* Match cursor column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
176 NFA_COL_GT, /* Match > cursor column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
177 NFA_COL_LT, /* Match < cursor column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
178 NFA_VCOL, /* Match cursor virtual column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
179 NFA_VCOL_GT, /* Match > cursor virtual column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
180 NFA_VCOL_LT, /* Match < cursor virtual column */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
181
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
182 NFA_FIRST_NL = NFA_ANY + ADD_NL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
183 NFA_LAST_NL = NFA_NUPPER + ADD_NL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
184
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
185 /* Character classes [:alnum:] etc */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
186 NFA_CLASS_ALNUM,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
187 NFA_CLASS_ALPHA,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
188 NFA_CLASS_BLANK,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
189 NFA_CLASS_CNTRL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
190 NFA_CLASS_DIGIT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
191 NFA_CLASS_GRAPH,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
192 NFA_CLASS_LOWER,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
193 NFA_CLASS_PRINT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
194 NFA_CLASS_PUNCT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
195 NFA_CLASS_SPACE,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
196 NFA_CLASS_UPPER,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
197 NFA_CLASS_XDIGIT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
198 NFA_CLASS_TAB,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
199 NFA_CLASS_RETURN,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
200 NFA_CLASS_BACKSPACE,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
201 NFA_CLASS_ESCAPE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
202 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
203
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
204 /* Keep in sync with classchars. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
205 static int nfa_classcodes[] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
206 NFA_ANY, NFA_IDENT, NFA_SIDENT, NFA_KWORD,NFA_SKWORD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
207 NFA_FNAME, NFA_SFNAME, NFA_PRINT, NFA_SPRINT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
208 NFA_WHITE, NFA_NWHITE, NFA_DIGIT, NFA_NDIGIT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
209 NFA_HEX, NFA_NHEX, NFA_OCTAL, NFA_NOCTAL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
210 NFA_WORD, NFA_NWORD, NFA_HEAD, NFA_NHEAD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
211 NFA_ALPHA, NFA_NALPHA, NFA_LOWER, NFA_NLOWER,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
212 NFA_UPPER, NFA_NUPPER
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
213 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
214
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
215 static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
216
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
217 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
218 * NFA errors can be of 3 types:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
219 * *** NFA runtime errors, when something unknown goes wrong. The NFA fails
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
220 * silently and revert the to backtracking engine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
221 * syntax_error = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
222 * *** Regexp syntax errors, when the input regexp is not syntactically correct.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
223 * The NFA engine displays an error message, and nothing else happens.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
224 * syntax_error = TRUE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
225 * *** Unsupported features, when the input regexp uses an operator that is not
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
226 * implemented in the NFA. The NFA engine fails silently, and reverts to the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
227 * old backtracking engine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
228 * syntax_error = FALSE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
229 * "The NFA fails" means that "compiling the regexp with the NFA fails":
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
230 * nfa_regcomp() returns FAIL.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
231 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
232 static int syntax_error = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
233
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
234 /* NFA regexp \ze operator encountered. */
4569
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
235 static int nfa_has_zend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
236
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
237 /* NFA regexp \1 .. \9 encountered. */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
238 static int nfa_has_backref;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
239
4720
bd6bef0bd0fb updated for version 7.3.1107
Bram Moolenaar <bram@vim.org>
parents: 4718
diff changeset
240 #ifdef FEAT_SYN_HL
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
241 /* NFA regexp has \z( ), set zsubexpr. */
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
242 static int nfa_has_zsubexpr;
4720
bd6bef0bd0fb updated for version 7.3.1107
Bram Moolenaar <bram@vim.org>
parents: 4718
diff changeset
243 #endif
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
244
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
245 /* Number of sub expressions actually being used during execution. 1 if only
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
246 * the whole match (subexpr 0) is used. */
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
247 static int nfa_nsubexpr;
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
248
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
249 static int *post_start; /* holds the postfix form of r.e. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
250 static int *post_end;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
251 static int *post_ptr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
252
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
253 static int nstate; /* Number of states in the NFA. Also used when
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
254 * executing. */
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
255 static int istate; /* Index in the state vector, used in alloc_state() */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
256
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
257 /* If not NULL match must end at this position */
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
258 static save_se_T *nfa_endp = NULL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
259
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
260 /* listid is global, so that it increases on recursive calls to
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
261 * nfa_regmatch(), which means we don't have to clear the lastlist field of
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
262 * all the states. */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
263 static int nfa_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
264 static int nfa_alt_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
265
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
266 /* 0 for first call to nfa_regmatch(), 1 for recursive call. */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
267 static int nfa_ll_index = 0;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
268
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
269 static int nfa_regcomp_start __ARGS((char_u*expr, int re_flags));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
270 static int nfa_recognize_char_class __ARGS((char_u *start, char_u *end, int extra_newl));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
271 static int nfa_emit_equi_class __ARGS((int c, int neg));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
272 static int nfa_regatom __ARGS((void));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
273 static int nfa_regpiece __ARGS((void));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
274 static int nfa_regconcat __ARGS((void));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
275 static int nfa_regbranch __ARGS((void));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
276 static int nfa_reg __ARGS((int paren));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
277 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
278 static void nfa_set_code __ARGS((int c));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
279 static void nfa_postfix_dump __ARGS((char_u *expr, int retval));
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
280 static void nfa_print_state __ARGS((FILE *debugf, nfa_state_T *state));
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
281 static void nfa_print_state2 __ARGS((FILE *debugf, nfa_state_T *state, garray_T *indent));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
282 static void nfa_dump __ARGS((nfa_regprog_T *prog));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
283 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
284 static int *re2post __ARGS((void));
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
285 static nfa_state_T *alloc_state __ARGS((int c, nfa_state_T *out, nfa_state_T *out1));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
286 static nfa_state_T *post2nfa __ARGS((int *postfix, int *end, int nfa_calc_size));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
287 static int check_char_class __ARGS((int class, int c));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
288 static void st_error __ARGS((int *postfix, int *end, int *p));
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
289 static void nfa_save_listids __ARGS((nfa_regprog_T *prog, int *list));
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
290 static void nfa_restore_listids __ARGS((nfa_regprog_T *prog, int *list));
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
291 static int nfa_re_num_cmp __ARGS((long_u val, int op, long_u pos));
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
292 static long nfa_regtry __ARGS((nfa_regprog_T *prog, colnr_T col));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
293 static long nfa_regexec_both __ARGS((char_u *line, colnr_T col));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
294 static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
295 static int nfa_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
296 static long nfa_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
297
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
298 /* helper functions used when doing re2post() ... regatom() parsing */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
299 #define EMIT(c) do { \
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
300 if (post_ptr >= post_end && realloc_post_list() == FAIL) \
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
301 return FAIL; \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
302 *post_ptr++ = c; \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
303 } while (0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
304
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
305 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
306 * Initialize internal variables before NFA compilation.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
307 * Return OK on success, FAIL otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
308 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
309 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
310 nfa_regcomp_start(expr, re_flags)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
311 char_u *expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
312 int re_flags; /* see vim_regcomp() */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
313 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
314 size_t postfix_size;
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
315 int nstate_max;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
316
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
317 nstate = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
318 istate = 0;
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
319 /* A reasonable estimation for maximum size */
4673
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
320 nstate_max = (int)(STRLEN(expr) + 1) * 25;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
321
4454
44b89b025cdf updated for version 7.3.975
Bram Moolenaar <bram@vim.org>
parents: 4450
diff changeset
322 /* Some items blow up in size, such as [A-z]. Add more space for that.
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
323 * When it is still not enough realloc_post_list() will be used. */
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
324 nstate_max += 1000;
4454
44b89b025cdf updated for version 7.3.975
Bram Moolenaar <bram@vim.org>
parents: 4450
diff changeset
325
44b89b025cdf updated for version 7.3.975
Bram Moolenaar <bram@vim.org>
parents: 4450
diff changeset
326 /* Size for postfix representation of expr. */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
327 postfix_size = sizeof(int) * nstate_max;
4454
44b89b025cdf updated for version 7.3.975
Bram Moolenaar <bram@vim.org>
parents: 4450
diff changeset
328
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
329 post_start = (int *)lalloc(postfix_size, TRUE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
330 if (post_start == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
331 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
332 vim_memset(post_start, 0, postfix_size);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
333 post_ptr = post_start;
4454
44b89b025cdf updated for version 7.3.975
Bram Moolenaar <bram@vim.org>
parents: 4450
diff changeset
334 post_end = post_start + nstate_max;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
335 nfa_has_zend = FALSE;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
336 nfa_has_backref = FALSE;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
337
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
338 /* shared with BT engine */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
339 regcomp_start(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
340
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
341 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
342 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
343
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
344 /*
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
345 * Allocate more space for post_start. Called when
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
346 * running above the estimated number of states.
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
347 */
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
348 static int
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
349 realloc_post_list()
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
350 {
4667
9e7ef781d494 updated for version 7.3.1081
Bram Moolenaar <bram@vim.org>
parents: 4661
diff changeset
351 int nstate_max = (int)(post_end - post_start);
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
352 int new_max = nstate_max + 1000;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
353 int *new_start;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
354 int *old_start;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
355
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
356 new_start = (int *)lalloc(new_max * sizeof(int), TRUE);
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
357 if (new_start == NULL)
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
358 return FAIL;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
359 mch_memmove(new_start, post_start, nstate_max * sizeof(int));
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
360 vim_memset(new_start + nstate_max, 0, 1000 * sizeof(int));
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
361 old_start = post_start;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
362 post_start = new_start;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
363 post_ptr = new_start + (post_ptr - old_start);
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
364 post_end = post_start + new_max;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
365 vim_free(old_start);
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
366 return OK;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
367 }
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
368
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
369 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
370 * Search between "start" and "end" and try to recognize a
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
371 * character class in expanded form. For example [0-9].
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
372 * On success, return the id the character class to be emitted.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
373 * On failure, return 0 (=FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
374 * Start points to the first char of the range, while end should point
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
375 * to the closing brace.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
376 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
377 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
378 nfa_recognize_char_class(start, end, extra_newl)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
379 char_u *start;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
380 char_u *end;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
381 int extra_newl;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
382 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
383 int i;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
384 /* Each of these variables takes up a char in "config[]",
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
385 * in the order they are here. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
386 int not = FALSE, af = FALSE, AF = FALSE, az = FALSE, AZ = FALSE,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
387 o7 = FALSE, o9 = FALSE, underscore = FALSE, newl = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
388 char_u *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
389 #define NCONFIGS 16
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
390 int classid[NCONFIGS] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
391 NFA_DIGIT, NFA_NDIGIT, NFA_HEX, NFA_NHEX,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
392 NFA_OCTAL, NFA_NOCTAL, NFA_WORD, NFA_NWORD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
393 NFA_HEAD, NFA_NHEAD, NFA_ALPHA, NFA_NALPHA,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
394 NFA_LOWER, NFA_NLOWER, NFA_UPPER, NFA_NUPPER
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
395 };
4450
09e1e574a52d updated for version 7.3.973
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
396 char_u myconfig[10];
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
397 char_u config[NCONFIGS][9] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
398 "000000100", /* digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
399 "100000100", /* non digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
400 "011000100", /* hex-digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
401 "111000100", /* non hex-digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
402 "000001000", /* octal-digit */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
403 "100001000", /* [^0-7] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
404 "000110110", /* [0-9A-Za-z_] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
405 "100110110", /* [^0-9A-Za-z_] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
406 "000110010", /* head of word */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
407 "100110010", /* not head of word */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
408 "000110000", /* alphabetic char a-z */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
409 "100110000", /* non alphabetic char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
410 "000100000", /* lowercase letter */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
411 "100100000", /* non lowercase */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
412 "000010000", /* uppercase */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
413 "100010000" /* non uppercase */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
414 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
415
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
416 if (extra_newl == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
417 newl = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
418
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
419 if (*end != ']')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
420 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
421 p = start;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
422 if (*p == '^')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
423 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
424 not = TRUE;
4720
bd6bef0bd0fb updated for version 7.3.1107
Bram Moolenaar <bram@vim.org>
parents: 4718
diff changeset
425 p++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
426 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
427
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
428 while (p < end)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
429 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
430 if (p + 2 < end && *(p + 1) == '-')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
431 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
432 switch (*p)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
433 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
434 case '0':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
435 if (*(p + 2) == '9')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
436 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
437 o9 = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
438 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
439 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
440 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
441 if (*(p + 2) == '7')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
442 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
443 o7 = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
444 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
445 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
446 case 'a':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
447 if (*(p + 2) == 'z')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
448 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
449 az = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
450 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
451 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
452 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
453 if (*(p + 2) == 'f')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
454 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
455 af = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
456 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
457 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
458 case 'A':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
459 if (*(p + 2) == 'Z')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
460 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
461 AZ = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
462 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
463 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
464 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
465 if (*(p + 2) == 'F')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
466 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
467 AF = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
468 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
469 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
470 /* FALLTHROUGH */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
471 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
472 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
473 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
474 p += 3;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
475 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
476 else if (p + 1 < end && *p == '\\' && *(p + 1) == 'n')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
477 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
478 newl = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
479 p += 2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
480 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
481 else if (*p == '_')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
482 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
483 underscore = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
484 p ++;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
485 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
486 else if (*p == '\n')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
487 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
488 newl = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
489 p ++;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
490 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
491 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
492 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
493 } /* while (p < end) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
494
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
495 if (p != end)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
496 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
497
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
498 /* build the config that represents the ranges we gathered */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
499 STRCPY(myconfig, "000000000");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
500 if (not == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
501 myconfig[0] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
502 if (af == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
503 myconfig[1] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
504 if (AF == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
505 myconfig[2] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
506 if (az == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
507 myconfig[3] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
508 if (AZ == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
509 myconfig[4] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
510 if (o7 == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
511 myconfig[5] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
512 if (o9 == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
513 myconfig[6] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
514 if (underscore == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
515 myconfig[7] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
516 if (newl == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
517 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
518 myconfig[8] = '1';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
519 extra_newl = ADD_NL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
520 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
521 /* try to recognize character classes */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
522 for (i = 0; i < NCONFIGS; i++)
4450
09e1e574a52d updated for version 7.3.973
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
523 if (STRNCMP(myconfig, config[i], 8) == 0)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
524 return classid[i] + extra_newl;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
525
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
526 /* fallthrough => no success so far */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
527 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
528
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
529 #undef NCONFIGS
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
530 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
531
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
532 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
533 * Produce the bytes for equivalence class "c".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
534 * Currently only handles latin1, latin9 and utf-8.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
535 * Emits bytes in postfix notation: 'a,b,NFA_OR,c,NFA_OR' is
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
536 * equivalent to 'a OR b OR c'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
537 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
538 * NOTE! When changing this function, also update reg_equi_class()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
539 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
540 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
541 nfa_emit_equi_class(c, neg)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
542 int c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
543 int neg;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
544 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
545 int first = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
546 int glue = neg == TRUE ? NFA_CONCAT : NFA_OR;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
547 #define EMIT2(c) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
548 EMIT(c); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
549 if (neg == TRUE) { \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
550 EMIT(NFA_NOT); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
551 } \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
552 if (first == FALSE) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
553 EMIT(glue); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
554 else \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
555 first = FALSE; \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
556
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
557 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
558 if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
559 || STRCMP(p_enc, "iso-8859-15") == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
560 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
561 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
562 switch (c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
563 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
564 case 'A': case '\300': case '\301': case '\302':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
565 case '\303': case '\304': case '\305':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
566 EMIT2('A'); EMIT2('\300'); EMIT2('\301');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
567 EMIT2('\302'); EMIT2('\303'); EMIT2('\304');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
568 EMIT2('\305');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
569 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
570
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
571 case 'C': case '\307':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
572 EMIT2('C'); EMIT2('\307');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
573 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
574
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
575 case 'E': case '\310': case '\311': case '\312': case '\313':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
576 EMIT2('E'); EMIT2('\310'); EMIT2('\311');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
577 EMIT2('\312'); EMIT2('\313');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
578 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
579
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
580 case 'I': case '\314': case '\315': case '\316': case '\317':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
581 EMIT2('I'); EMIT2('\314'); EMIT2('\315');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
582 EMIT2('\316'); EMIT2('\317');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
583 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
584
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
585 case 'N': case '\321':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
586 EMIT2('N'); EMIT2('\321');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
587 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
588
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
589 case 'O': case '\322': case '\323': case '\324': case '\325':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
590 case '\326':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
591 EMIT2('O'); EMIT2('\322'); EMIT2('\323');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
592 EMIT2('\324'); EMIT2('\325'); EMIT2('\326');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
593 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
594
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
595 case 'U': case '\331': case '\332': case '\333': case '\334':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
596 EMIT2('U'); EMIT2('\331'); EMIT2('\332');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
597 EMIT2('\333'); EMIT2('\334');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
598 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
599
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
600 case 'Y': case '\335':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
601 EMIT2('Y'); EMIT2('\335');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
602 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
603
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
604 case 'a': case '\340': case '\341': case '\342':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
605 case '\343': case '\344': case '\345':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
606 EMIT2('a'); EMIT2('\340'); EMIT2('\341');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
607 EMIT2('\342'); EMIT2('\343'); EMIT2('\344');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
608 EMIT2('\345');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
609 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
610
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
611 case 'c': case '\347':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
612 EMIT2('c'); EMIT2('\347');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
613 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
614
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
615 case 'e': case '\350': case '\351': case '\352': case '\353':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
616 EMIT2('e'); EMIT2('\350'); EMIT2('\351');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
617 EMIT2('\352'); EMIT2('\353');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
618 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
619
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
620 case 'i': case '\354': case '\355': case '\356': case '\357':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
621 EMIT2('i'); EMIT2('\354'); EMIT2('\355');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
622 EMIT2('\356'); EMIT2('\357');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
623 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
624
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
625 case 'n': case '\361':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
626 EMIT2('n'); EMIT2('\361');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
627 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
628
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
629 case 'o': case '\362': case '\363': case '\364': case '\365':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
630 case '\366':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
631 EMIT2('o'); EMIT2('\362'); EMIT2('\363');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
632 EMIT2('\364'); EMIT2('\365'); EMIT2('\366');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
633 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
634
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
635 case 'u': case '\371': case '\372': case '\373': case '\374':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
636 EMIT2('u'); EMIT2('\371'); EMIT2('\372');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
637 EMIT2('\373'); EMIT2('\374');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
638 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
639
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
640 case 'y': case '\375': case '\377':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
641 EMIT2('y'); EMIT2('\375'); EMIT2('\377');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
642 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
643
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
644 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
645 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
646 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
647 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
648
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
649 EMIT(c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
650 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
651 #undef EMIT2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
652 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
653
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
654 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
655 * Code to parse regular expression.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
656 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
657 * We try to reuse parsing functions in regexp.c to
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
658 * minimize surprise and keep the syntax consistent.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
659 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
660
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
661 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
662 * Parse the lowest level.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
663 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
664 * An atom can be one of a long list of items. Many atoms match one character
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
665 * in the text. It is often an ordinary character or a character class.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
666 * Braces can be used to make a pattern into an atom. The "\z(\)" construct
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
667 * is only for syntax highlighting.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
668 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
669 * atom ::= ordinary-atom
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
670 * or \( pattern \)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
671 * or \%( pattern \)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
672 * or \z( pattern \)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
673 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
674 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
675 nfa_regatom()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
676 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
677 int c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
678 int charclass;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
679 int equiclass;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
680 int collclass;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
681 int got_coll_char;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
682 char_u *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
683 char_u *endp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
684 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
685 char_u *old_regparse = regparse;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
686 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
687 int extra = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
688 int first;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
689 int emit_range;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
690 int negated;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
691 int result;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
692 int startc = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
693 int endc = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
694 int oldstartc = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
695 int cpo_lit; /* 'cpoptions' contains 'l' flag */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
696 int cpo_bsl; /* 'cpoptions' contains '\' flag */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
697 int glue; /* ID that will "glue" nodes together */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
698
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
699 cpo_lit = vim_strchr(p_cpo, CPO_LITERAL) != NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
700 cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
701
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
702 c = getchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
703 switch (c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
704 {
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
705 case NUL:
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
706 syntax_error = TRUE;
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
707 EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely"));
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
708
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
709 case Magic('^'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
710 EMIT(NFA_BOL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
711 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
712
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
713 case Magic('$'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
714 EMIT(NFA_EOL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
715 #if defined(FEAT_SYN_HL) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
716 had_eol = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
717 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
718 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
719
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
720 case Magic('<'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
721 EMIT(NFA_BOW);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
722 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
723
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
724 case Magic('>'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
725 EMIT(NFA_EOW);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
726 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
727
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
728 case Magic('_'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
729 c = no_Magic(getchr());
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
730 if (c == '^') /* "\_^" is start-of-line */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
731 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
732 EMIT(NFA_BOL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
733 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
734 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
735 if (c == '$') /* "\_$" is end-of-line */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
736 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
737 EMIT(NFA_EOL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
738 #if defined(FEAT_SYN_HL) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
739 had_eol = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
740 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
741 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
742 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
743
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
744 extra = ADD_NL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
745
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
746 /* "\_[" is collection plus newline */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
747 if (c == '[')
4517
9a2183bd8295 updated for version 7.3.1006
Bram Moolenaar <bram@vim.org>
parents: 4515
diff changeset
748 goto collection;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
749
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
750 /* "\_x" is character class plus newline */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
751 /*FALLTHROUGH*/
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
752
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
753 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
754 * Character classes.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
755 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
756 case Magic('.'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
757 case Magic('i'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
758 case Magic('I'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
759 case Magic('k'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
760 case Magic('K'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
761 case Magic('f'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
762 case Magic('F'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
763 case Magic('p'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
764 case Magic('P'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
765 case Magic('s'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
766 case Magic('S'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
767 case Magic('d'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
768 case Magic('D'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
769 case Magic('x'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
770 case Magic('X'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
771 case Magic('o'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
772 case Magic('O'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
773 case Magic('w'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
774 case Magic('W'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
775 case Magic('h'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
776 case Magic('H'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
777 case Magic('a'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
778 case Magic('A'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
779 case Magic('l'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
780 case Magic('L'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
781 case Magic('u'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
782 case Magic('U'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
783 p = vim_strchr(classchars, no_Magic(c));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
784 if (p == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
785 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
786 EMSGN("INTERNAL: Unknown character class char: %ld", c);
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
787 return FAIL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
788 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
789 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
790 /* When '.' is followed by a composing char ignore the dot, so that
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
791 * the composing char is matched here. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
792 if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr()))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
793 {
4535
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
794 old_regparse = regparse;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
795 c = getchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
796 goto nfa_do_multibyte;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
797 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
798 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
799 EMIT(nfa_classcodes[p - classchars]);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
800 if (extra == ADD_NL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
801 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
802 EMIT(NFA_NEWL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
803 EMIT(NFA_OR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
804 regflags |= RF_HASNL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
805 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
806 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
807
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
808 case Magic('n'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
809 if (reg_string)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
810 /* In a string "\n" matches a newline character. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
811 EMIT(NL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
812 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
813 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
814 /* In buffer text "\n" matches the end of a line. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
815 EMIT(NFA_NEWL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
816 regflags |= RF_HASNL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
817 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
818 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
819
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
820 case Magic('('):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
821 if (nfa_reg(REG_PAREN) == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
822 return FAIL; /* cascaded error */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
823 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
824
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
825 case Magic('|'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
826 case Magic('&'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
827 case Magic(')'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
828 syntax_error = TRUE;
4450
09e1e574a52d updated for version 7.3.973
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
829 EMSGN(_(e_misplaced), no_Magic(c));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
830 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
831
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
832 case Magic('='):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
833 case Magic('?'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
834 case Magic('+'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
835 case Magic('@'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
836 case Magic('*'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
837 case Magic('{'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
838 /* these should follow an atom, not form an atom */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
839 syntax_error = TRUE;
4450
09e1e574a52d updated for version 7.3.973
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
840 EMSGN(_(e_misplaced), no_Magic(c));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
841 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
842
4714
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
843 case Magic('~'):
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
844 {
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
845 char_u *lp;
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
846
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
847 /* Previous substitute pattern.
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
848 * Generated as "\%(pattern\)". */
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
849 if (reg_prev_sub == NULL)
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
850 {
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
851 EMSG(_(e_nopresub));
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
852 return FAIL;
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
853 }
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
854 for (lp = reg_prev_sub; *lp != NUL; mb_cptr_adv(lp))
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
855 {
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
856 EMIT(PTR2CHAR(lp));
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
857 if (lp != reg_prev_sub)
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
858 EMIT(NFA_CONCAT);
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
859 }
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
860 EMIT(NFA_NOPEN);
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
861 break;
fc4d7f02ea3a updated for version 7.3.1104
Bram Moolenaar <bram@vim.org>
parents: 4712
diff changeset
862 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
863
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
864 case Magic('1'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
865 case Magic('2'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
866 case Magic('3'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
867 case Magic('4'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
868 case Magic('5'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
869 case Magic('6'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
870 case Magic('7'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
871 case Magic('8'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
872 case Magic('9'):
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
873 EMIT(NFA_BACKREF1 + (no_Magic(c) - '1'));
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
874 nfa_has_backref = TRUE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
875 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
876
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
877 case Magic('z'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
878 c = no_Magic(getchr());
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
879 switch (c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
880 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
881 case 's':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
882 EMIT(NFA_ZSTART);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
883 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
884 case 'e':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
885 EMIT(NFA_ZEND);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
886 nfa_has_zend = TRUE;
4569
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
887 break;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
888 #ifdef FEAT_SYN_HL
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
889 case '1':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
890 case '2':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
891 case '3':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
892 case '4':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
893 case '5':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
894 case '6':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
895 case '7':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
896 case '8':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
897 case '9':
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
898 /* \z1...\z9 */
4688
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4686
diff changeset
899 if (reg_do_extmatch != REX_USE)
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4686
diff changeset
900 EMSG_RET_FAIL(_(e_z1_not_allowed));
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
901 EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
902 /* No need to set nfa_has_backref, the sub-matches don't
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
903 * change when \z1 .. \z9 maches or not. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
904 re_has_z = REX_USE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
905 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
906 case '(':
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
907 /* \z( */
4688
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4686
diff changeset
908 if (reg_do_extmatch != REX_SET)
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4686
diff changeset
909 EMSG_RET_FAIL(_(e_z_not_allowed));
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
910 if (nfa_reg(REG_ZPAREN) == FAIL)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
911 return FAIL; /* cascaded error */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
912 re_has_z = REX_SET;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
913 break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
914 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
915 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
916 syntax_error = TRUE;
4450
09e1e574a52d updated for version 7.3.973
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
917 EMSGN(_("E867: (NFA) Unknown operator '\\z%c'"),
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
918 no_Magic(c));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
919 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
920 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
921 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
922
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
923 case Magic('%'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
924 c = no_Magic(getchr());
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
925 switch (c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
926 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
927 /* () without a back reference */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
928 case '(':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
929 if (nfa_reg(REG_NPAREN) == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
930 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
931 EMIT(NFA_NOPEN);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
932 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
933
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
934 case 'd': /* %d123 decimal */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
935 case 'o': /* %o123 octal */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
936 case 'x': /* %xab hex 2 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
937 case 'u': /* %uabcd hex 4 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
938 case 'U': /* %U1234abcd hex 8 */
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
939 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
940 int nr;
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
941
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
942 switch (c)
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
943 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
944 case 'd': nr = getdecchrs(); break;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
945 case 'o': nr = getoctchrs(); break;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
946 case 'x': nr = gethexchrs(2); break;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
947 case 'u': nr = gethexchrs(4); break;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
948 case 'U': nr = gethexchrs(8); break;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
949 default: nr = -1; break;
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
950 }
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
951
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
952 if (nr < 0)
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
953 EMSG2_RET_FAIL(
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
954 _("E678: Invalid character after %s%%[dxouU]"),
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
955 reg_magic == MAGIC_ALL);
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
956 /* TODO: what if a composing character follows? */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
957 EMIT(nr);
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
958 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
959 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
960
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
961 /* Catch \%^ and \%$ regardless of where they appear in the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
962 * pattern -- regardless of whether or not it makes sense. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
963 case '^':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
964 EMIT(NFA_BOF);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
965 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
966
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
967 case '$':
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
968 EMIT(NFA_EOF);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
969 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
970
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
971 case '#':
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
972 EMIT(NFA_CURSOR);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
973 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
974
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
975 case 'V':
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
976 /* TODO: not supported yet */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
977 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
978 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
979
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
980 case '[':
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
981 /* TODO: \%[abc] not supported yet */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
982 return FAIL;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
983
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
984 default:
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
985 {
4655
779ca415f8e1 updated for version 7.3.1075
Bram Moolenaar <bram@vim.org>
parents: 4651
diff changeset
986 int n = 0;
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
987 int cmp = c;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
988
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
989 if (c == '<' || c == '>')
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
990 c = getchr();
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
991 while (VIM_ISDIGIT(c))
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
992 {
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
993 n = n * 10 + (c - '0');
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
994 c = getchr();
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
995 }
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
996 if (c == 'l' || c == 'c' || c == 'v')
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
997 {
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
998 EMIT(n);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
999 if (c == 'l')
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1000 EMIT(cmp == '<' ? NFA_LNUM_LT :
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1001 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1002 else if (c == 'c')
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1003 EMIT(cmp == '<' ? NFA_COL_LT :
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1004 cmp == '>' ? NFA_COL_GT : NFA_COL);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1005 else
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1006 EMIT(cmp == '<' ? NFA_VCOL_LT :
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1007 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1008 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1009 }
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1010 else if (c == '\'')
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1011 /* TODO: \%'m not supported yet */
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1012 return FAIL;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1013 }
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1014 syntax_error = TRUE;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1015 EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1016 no_Magic(c));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1017 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1018 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1019 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1020
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1021 case Magic('['):
4517
9a2183bd8295 updated for version 7.3.1006
Bram Moolenaar <bram@vim.org>
parents: 4515
diff changeset
1022 collection:
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1023 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1024 * Glue is emitted between several atoms from the [].
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1025 * It is either NFA_OR, or NFA_CONCAT.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1026 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1027 * [abc] expands to 'a b NFA_OR c NFA_OR' (in postfix notation)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1028 * [^abc] expands to 'a NFA_NOT b NFA_NOT NFA_CONCAT c NFA_NOT
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1029 * NFA_CONCAT NFA_END_NEG_RANGE NFA_CONCAT' (in postfix
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1030 * notation)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1031 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1032 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1033
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1034
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1035 /* Emit negation atoms, if needed.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1036 * The CONCAT below merges the NOT with the previous node. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1037 #define TRY_NEG() \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1038 if (negated == TRUE) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1039 { \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1040 EMIT(NFA_NOT); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1041 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1042
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1043 /* Emit glue between important nodes : CONCAT or OR. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1044 #define EMIT_GLUE() \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1045 if (first == FALSE) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1046 EMIT(glue); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1047 else \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1048 first = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1049
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1050 p = regparse;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1051 endp = skip_anyof(p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1052 if (*endp == ']')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1053 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1054 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1055 * Try to reverse engineer character classes. For example,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1056 * recognize that [0-9] stands for \d and [A-Za-z_] with \h,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1057 * and perform the necessary substitutions in the NFA.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1058 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1059 result = nfa_recognize_char_class(regparse, endp,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1060 extra == ADD_NL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1061 if (result != FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1062 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1063 if (result >= NFA_DIGIT && result <= NFA_NUPPER)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1064 EMIT(result);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1065 else /* must be char class + newline */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1066 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1067 EMIT(result - ADD_NL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1068 EMIT(NFA_NEWL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1069 EMIT(NFA_OR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1070 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1071 regparse = endp;
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1072 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1073 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1074 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1075 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1076 * Failed to recognize a character class. Use the simple
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1077 * version that turns [abc] into 'a' OR 'b' OR 'c'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1078 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1079 startc = endc = oldstartc = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1080 first = TRUE; /* Emitting first atom in this sequence? */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1081 negated = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1082 glue = NFA_OR;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1083 if (*regparse == '^') /* negated range */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1084 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1085 negated = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1086 glue = NFA_CONCAT;
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1087 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1088 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1089 if (*regparse == '-')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1090 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1091 startc = '-';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1092 EMIT(startc);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1093 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1094 EMIT_GLUE();
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1095 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1096 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1097 /* Emit the OR branches for each character in the [] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1098 emit_range = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1099 while (regparse < endp)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1100 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1101 oldstartc = startc;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1102 startc = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1103 got_coll_char = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1104 if (*regparse == '[')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1105 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1106 /* Check for [: :], [= =], [. .] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1107 equiclass = collclass = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1108 charclass = get_char_class(&regparse);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1109 if (charclass == CLASS_NONE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1110 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1111 equiclass = get_equi_class(&regparse);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1112 if (equiclass == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1113 collclass = get_coll_element(&regparse);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1114 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1115
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1116 /* Character class like [:alpha:] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1117 if (charclass != CLASS_NONE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1118 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1119 switch (charclass)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1120 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1121 case CLASS_ALNUM:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1122 EMIT(NFA_CLASS_ALNUM);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1123 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1124 case CLASS_ALPHA:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1125 EMIT(NFA_CLASS_ALPHA);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1126 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1127 case CLASS_BLANK:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1128 EMIT(NFA_CLASS_BLANK);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1129 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1130 case CLASS_CNTRL:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1131 EMIT(NFA_CLASS_CNTRL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1132 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1133 case CLASS_DIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1134 EMIT(NFA_CLASS_DIGIT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1135 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1136 case CLASS_GRAPH:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1137 EMIT(NFA_CLASS_GRAPH);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1138 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1139 case CLASS_LOWER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1140 EMIT(NFA_CLASS_LOWER);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1141 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1142 case CLASS_PRINT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1143 EMIT(NFA_CLASS_PRINT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1144 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1145 case CLASS_PUNCT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1146 EMIT(NFA_CLASS_PUNCT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1147 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1148 case CLASS_SPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1149 EMIT(NFA_CLASS_SPACE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1150 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1151 case CLASS_UPPER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1152 EMIT(NFA_CLASS_UPPER);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1153 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1154 case CLASS_XDIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1155 EMIT(NFA_CLASS_XDIGIT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1156 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1157 case CLASS_TAB:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1158 EMIT(NFA_CLASS_TAB);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1159 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1160 case CLASS_RETURN:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1161 EMIT(NFA_CLASS_RETURN);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1162 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1163 case CLASS_BACKSPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1164 EMIT(NFA_CLASS_BACKSPACE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1165 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1166 case CLASS_ESCAPE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1167 EMIT(NFA_CLASS_ESCAPE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1168 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1169 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1170 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1171 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1172 continue;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1173 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1174 /* Try equivalence class [=a=] and the like */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1175 if (equiclass != 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1176 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1177 result = nfa_emit_equi_class(equiclass, negated);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1178 if (result == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1179 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1180 /* should never happen */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1181 EMSG_RET_FAIL(_("E868: Error building NFA with equivalence class!"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1182 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1183 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1184 continue;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1185 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1186 /* Try collating class like [. .] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1187 if (collclass != 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1188 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1189 startc = collclass; /* allow [.a.]-x as a range */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1190 /* Will emit the proper atom at the end of the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1191 * while loop. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1192 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1193 }
4677
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1194 /* Try a range like 'a-x' or '\t-z'. Also allows '-' as a
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1195 * start character. */
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1196 if (*regparse == '-' && oldstartc != -1)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1197 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1198 emit_range = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1199 startc = oldstartc;
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1200 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1201 continue; /* reading the end of the range */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1202 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1203
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1204 /* Now handle simple and escaped characters.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1205 * Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1206 * accepts "\t", "\e", etc., but only when the 'l' flag in
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1207 * 'cpoptions' is not included.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1208 * Posix doesn't recognize backslash at all.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1209 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1210 if (*regparse == '\\'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1211 && !cpo_bsl
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1212 && regparse + 1 <= endp
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1213 && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1214 || (!cpo_lit
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1215 && vim_strchr(REGEXP_ABBR, regparse[1])
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1216 != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1217 )
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1218 )
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1219 {
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1220 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1221
4507
9dbbddb2ed10 updated for version 7.3.1001
Bram Moolenaar <bram@vim.org>
parents: 4503
diff changeset
1222 if (*regparse == 'n')
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1223 startc = reg_string ? NL : NFA_NEWL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1224 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1225 if (*regparse == 'd'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1226 || *regparse == 'o'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1227 || *regparse == 'x'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1228 || *regparse == 'u'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1229 || *regparse == 'U'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1230 )
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1231 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1232 /* TODO(RE) This needs more testing */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1233 startc = coll_get_char();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1234 got_coll_char = TRUE;
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1235 mb_ptr_back(old_regparse, regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1236 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1237 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1238 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1239 /* \r,\t,\e,\b */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1240 startc = backslash_trans(*regparse);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1241 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1242 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1243
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1244 /* Normal printable char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1245 if (startc == -1)
4677
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1246 startc = PTR2CHAR(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1247
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1248 /* Previous char was '-', so this char is end of range. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1249 if (emit_range)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1250 {
4677
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1251 endc = startc;
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1252 startc = oldstartc;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1253 if (startc > endc)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1254 EMSG_RET_FAIL(_(e_invrange));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1255 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1256 if (has_mbyte && ((*mb_char2len)(startc) > 1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1257 || (*mb_char2len)(endc) > 1))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1258 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1259 if (endc > startc + 256)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1260 EMSG_RET_FAIL(_(e_invrange));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1261 /* Emit the range. "startc" was already emitted, so
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1262 * skip it. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1263 for (c = startc + 1; c <= endc; c++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1264 {
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1265 EMIT(c);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1266 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1267 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1268 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1269 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1270 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1271 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1272 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1273 #ifdef EBCDIC
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1274 int alpha_only = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1275
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1276 /* for alphabetical range skip the gaps
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1277 * 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1278 if (isalpha(startc) && isalpha(endc))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1279 alpha_only = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1280 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1281 /* Emit the range. "startc" was already emitted, so
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1282 * skip it. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1283 for (c = startc + 1; c <= endc; c++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1284 #ifdef EBCDIC
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1285 if (!alpha_only || isalpha(startc))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1286 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1287 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1288 EMIT(c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1289 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1290 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1291 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1292 }
4677
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1293 emit_range = FALSE;
c1622ff9ed8d updated for version 7.3.1086
Bram Moolenaar <bram@vim.org>
parents: 4675
diff changeset
1294 startc = -1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1295 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1296 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1297 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1298 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1299 * This char (startc) is not part of a range. Just
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1300 * emit it.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1301 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1302 * Normally, simply emit startc. But if we get char
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1303 * code=0 from a collating char, then replace it with
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1304 * 0x0a.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1305 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1306 * This is needed to completely mimic the behaviour of
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1307 * the backtracking engine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1308 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1309 if (got_coll_char == TRUE && startc == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1310 EMIT(0x0a);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1311 else
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1312 EMIT(startc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1313 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1314 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1315 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1316
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1317 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1318 } /* while (p < endp) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1319
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1320 mb_ptr_back(old_regparse, regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1321 if (*regparse == '-') /* if last, '-' is just a char */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1322 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1323 EMIT('-');
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1324 TRY_NEG();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1325 EMIT_GLUE();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1326 }
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1327 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1328
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1329 /* skip the trailing ] */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1330 regparse = endp;
4573
37e444aeb33b updated for version 7.3.1034
Bram Moolenaar <bram@vim.org>
parents: 4571
diff changeset
1331 mb_ptr_adv(regparse);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1332 if (negated == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1333 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1334 /* Mark end of negated char range */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1335 EMIT(NFA_END_NEG_RANGE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1336 EMIT(NFA_CONCAT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1337 }
4615
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1338
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1339 /* \_[] also matches \n but it's not negated */
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1340 if (extra == ADD_NL)
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1341 {
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1342 EMIT(reg_string ? NL : NFA_NEWL);
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1343 EMIT(NFA_OR);
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1344 }
5679b8ddd8cc updated for version 7.3.1055
Bram Moolenaar <bram@vim.org>
parents: 4583
diff changeset
1345
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1346 return OK;
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1347 } /* if exists closing ] */
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1348
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1349 if (reg_strict)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1350 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1351 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1352 EMSG_RET_FAIL(_(e_missingbracket));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1353 }
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1354 /* FALLTHROUGH */
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1355
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1356 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1357 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1358 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1359 int plen;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1360
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1361 nfa_do_multibyte:
4543
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
1362 /* plen is length of current char with composing chars */
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
1363 if (enc_utf8 && ((*mb_char2len)(c)
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
1364 != (plen = (*mb_ptr2len)(old_regparse))
08ac46980953 updated for version 7.3.1019
Bram Moolenaar <bram@vim.org>
parents: 4541
diff changeset
1365 || utf_iscomposing(c)))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1366 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
1367 int i = 0;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
1368
4535
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
1369 /* A base character plus composing characters, or just one
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
1370 * or more composing characters.
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1371 * This requires creating a separate atom as if enclosing
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1372 * the characters in (), where NFA_COMPOSING is the ( and
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1373 * NFA_END_COMPOSING is the ). Note that right now we are
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1374 * building the postfix form, not the NFA itself;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1375 * a composing char could be: a, b, c, NFA_COMPOSING
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1376 * where 'b' and 'c' are chars with codes > 256. */
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1377 for (;;)
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1378 {
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1379 EMIT(c);
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1380 if (i > 0)
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1381 EMIT(NFA_CONCAT);
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
1382 if ((i += utf_char2len(c)) >= plen)
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1383 break;
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1384 c = utf_ptr2char(old_regparse + i);
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1385 }
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
1386 EMIT(NFA_COMPOSING);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1387 regparse = old_regparse + plen;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1388 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1389 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1390 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1391 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1392 c = no_Magic(c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1393 EMIT(c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1394 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1395 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1396 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1397 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1398
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1399 #undef TRY_NEG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1400 #undef EMIT_GLUE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1401
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1402 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1403 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1404
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1405 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1406 * Parse something followed by possible [*+=].
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1407 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1408 * A piece is an atom, possibly followed by a multi, an indication of how many
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1409 * times the atom can be matched. Example: "a*" matches any sequence of "a"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1410 * characters: "", "a", "aa", etc.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1411 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1412 * piece ::= atom
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1413 * or atom multi
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1414 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1415 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1416 nfa_regpiece()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1417 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1418 int i;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1419 int op;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1420 int ret;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1421 long minval, maxval;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1422 int greedy = TRUE; /* Braces are prefixed with '-' ? */
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1423 parse_state_T old_state;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1424 parse_state_T new_state;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1425 int c2;
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1426 int old_post_pos;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1427 int my_post_start;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1428 int quest;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1429
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1430 /* Save the current parse state, so that we can use it if <atom>{m,n} is
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1431 * next. */
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1432 save_parse_state(&old_state);
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1433
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1434 /* store current pos in the postfix form, for \{m,n} involving 0s */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1435 my_post_start = (int)(post_ptr - post_start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1436
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1437 ret = nfa_regatom();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1438 if (ret == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1439 return FAIL; /* cascaded error */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1440
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1441 op = peekchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1442 if (re_multi_type(op) == NOT_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1443 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1445 skipchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1446 switch (op)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1447 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1448 case Magic('*'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1449 EMIT(NFA_STAR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1450 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1451
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1452 case Magic('+'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1453 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1454 * Trick: Normally, (a*)\+ would match the whole input "aaa". The
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1455 * first and only submatch would be "aaa". But the backtracking
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1456 * engine interprets the plus as "try matching one more time", and
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1457 * a* matches a second time at the end of the input, the empty
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1458 * string.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1459 * The submatch will the empty string.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1460 *
4673
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1461 * In order to be consistent with the old engine, we replace
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1462 * <atom>+ with <atom><atom>*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1463 */
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1464 restore_parse_state(&old_state);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1465 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1466 if (nfa_regatom() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1467 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1468 EMIT(NFA_STAR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1469 EMIT(NFA_CONCAT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1470 skipchr(); /* skip the \+ */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1471 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1472
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1473 case Magic('@'):
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1474 c2 = getdecchrs();
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1475 op = no_Magic(getchr());
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1476 i = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1477 switch(op)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1478 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1479 case '=':
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1480 /* \@= */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1481 i = NFA_PREV_ATOM_NO_WIDTH;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1482 break;
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
1483 case '!':
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1484 /* \@! */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1485 i = NFA_PREV_ATOM_NO_WIDTH_NEG;
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
1486 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1487 case '<':
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1488 op = no_Magic(getchr());
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1489 if (op == '=')
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1490 /* \@<= */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1491 i = NFA_PREV_ATOM_JUST_BEFORE;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1492 else if (op == '!')
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1493 /* \@<! */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1494 i = NFA_PREV_ATOM_JUST_BEFORE_NEG;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1495 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1496 case '>':
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1497 /* \@> Not supported yet */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1498 /* i = NFA_PREV_ATOM_LIKE_PATTERN; */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1499 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1500 }
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1501 if (i == 0)
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1502 {
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1503 syntax_error = TRUE;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1504 EMSGN(_("E869: (NFA) Unknown operator '\\@%c'"), op);
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1505 return FAIL;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1506 }
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1507 EMIT(i);
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1508 if (i == NFA_PREV_ATOM_JUST_BEFORE
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1509 || i == NFA_PREV_ATOM_JUST_BEFORE_NEG)
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1510 EMIT(c2);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1511 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1512
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1513 case Magic('?'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1514 case Magic('='):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1515 EMIT(NFA_QUEST);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1516 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1517
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1518 case Magic('{'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1519 /* a{2,5} will expand to 'aaa?a?a?'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1520 * a{-1,3} will expand to 'aa??a??', where ?? is the nongreedy
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1521 * version of '?'
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1522 * \v(ab){2,3} will expand to '(ab)(ab)(ab)?', where all the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1523 * parenthesis have the same id
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1524 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1525
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1526 greedy = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1527 c2 = peekchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1528 if (c2 == '-' || c2 == Magic('-'))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1529 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1530 skipchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1531 greedy = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1532 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1533 if (!read_limits(&minval, &maxval))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1534 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1535 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1536 EMSG_RET_FAIL(_("E870: (NFA regexp) Error reading repetition limits"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1537 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1538 /* <atom>{0,inf}, <atom>{0,} and <atom>{} are equivalent to
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1539 * <atom>* */
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1540 if (minval == 0 && maxval == MAX_LIMIT)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1541 {
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1542 if (greedy)
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1543 /* \{}, \{0,} */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1544 EMIT(NFA_STAR);
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1545 else
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1546 /* \{-}, \{-0,} */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1547 EMIT(NFA_STAR_NONGREEDY);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1548 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1549 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1550
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1551 /* Special case: x{0} or x{-0} */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1552 if (maxval == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1553 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1554 /* Ignore result of previous call to nfa_regatom() */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1555 post_ptr = post_start + my_post_start;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1556 /* NFA_SKIP_CHAR has 0-length and works everywhere */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1557 EMIT(NFA_SKIP_CHAR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1558 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1559 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1560
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1561 /* Ignore previous call to nfa_regatom() */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1562 post_ptr = post_start + my_post_start;
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1563 /* Save parse state after the repeated atom and the \{} */
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1564 save_parse_state(&new_state);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1565
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1566 quest = (greedy == TRUE? NFA_QUEST : NFA_QUEST_NONGREEDY);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1567 for (i = 0; i < maxval; i++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1568 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1569 /* Goto beginning of the repeated atom */
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1570 restore_parse_state(&old_state);
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1571 old_post_pos = (int)(post_ptr - post_start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1572 if (nfa_regatom() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1573 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1574 /* after "minval" times, atoms are optional */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1575 if (i + 1 > minval)
4673
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1576 {
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1577 if (maxval == MAX_LIMIT)
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1578 {
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1579 if (greedy)
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1580 EMIT(NFA_STAR);
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1581 else
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1582 EMIT(NFA_STAR_NONGREEDY);
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1583 }
4673
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1584 else
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1585 EMIT(quest);
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1586 }
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1587 if (old_post_pos != my_post_start)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1588 EMIT(NFA_CONCAT);
4673
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1589 if (i + 1 > minval && maxval == MAX_LIMIT)
05d57d7c2d55 updated for version 7.3.1084
Bram Moolenaar <bram@vim.org>
parents: 4671
diff changeset
1590 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1591 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1592
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1593 /* Go to just after the repeated atom and the \{} */
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4677
diff changeset
1594 restore_parse_state(&new_state);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1595 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1596
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1597 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1598
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1599
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1600 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1601 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1602 } /* end switch */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1603
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1604 if (re_multi_type(peekchr()) != NOT_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1605 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1606 /* Can't have a multi follow a multi. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1607 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1608 EMSG_RET_FAIL(_("E871: (NFA regexp) Can't have a multi follow a multi !"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1609 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1610
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1611 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1612 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1613
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1614 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1615 * Parse one or more pieces, concatenated. It matches a match for the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1616 * first piece, followed by a match for the second piece, etc. Example:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1617 * "f[0-9]b", first matches "f", then a digit and then "b".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1618 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1619 * concat ::= piece
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1620 * or piece piece
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1621 * or piece piece piece
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1622 * etc.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1623 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1624 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1625 nfa_regconcat()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1626 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1627 int cont = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1628 int first = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1629
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1630 while (cont)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1631 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1632 switch (peekchr())
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1633 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1634 case NUL:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1635 case Magic('|'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1636 case Magic('&'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1637 case Magic(')'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1638 cont = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1639 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1640
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1641 case Magic('Z'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1642 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1643 regflags |= RF_ICOMBINE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1644 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1645 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1646 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1647 case Magic('c'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1648 regflags |= RF_ICASE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1649 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1650 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1651 case Magic('C'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1652 regflags |= RF_NOICASE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1653 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1654 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1655 case Magic('v'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1656 reg_magic = MAGIC_ALL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1657 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1658 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1659 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1660 case Magic('m'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1661 reg_magic = MAGIC_ON;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1662 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1663 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1664 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1665 case Magic('M'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1666 reg_magic = MAGIC_OFF;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1667 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1668 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1669 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1670 case Magic('V'):
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1671 reg_magic = MAGIC_NONE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1672 skipchr_keepstart();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1673 curchr = -1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1674 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1675
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1676 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1677 if (nfa_regpiece() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1678 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1679 if (first == FALSE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1680 EMIT(NFA_CONCAT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1681 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1682 first = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1683 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1684 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1685 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1686
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1687 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1688 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1689
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1690 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1691 * Parse a branch, one or more concats, separated by "\&". It matches the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1692 * last concat, but only if all the preceding concats also match at the same
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1693 * position. Examples:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1694 * "foobeep\&..." matches "foo" in "foobeep".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1695 * ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1696 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1697 * branch ::= concat
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1698 * or concat \& concat
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1699 * or concat \& concat \& concat
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1700 * etc.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1701 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1702 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1703 nfa_regbranch()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1704 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1705 int ch;
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1706 int old_post_pos;
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1707
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1708 old_post_pos = (int)(post_ptr - post_start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1709
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1710 /* First branch, possibly the only one */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1711 if (nfa_regconcat() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1712 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1713
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1714 ch = peekchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1715 /* Try next concats */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1716 while (ch == Magic('&'))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1717 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1718 skipchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1719 EMIT(NFA_NOPEN);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1720 EMIT(NFA_PREV_ATOM_NO_WIDTH);
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1721 old_post_pos = (int)(post_ptr - post_start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1722 if (nfa_regconcat() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1723 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1724 /* if concat is empty, skip a input char. But do emit a node */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1725 if (old_post_pos == (int)(post_ptr - post_start))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1726 EMIT(NFA_SKIP_CHAR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1727 EMIT(NFA_CONCAT);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1728 ch = peekchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1729 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1730
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1731 /* Even if a branch is empty, emit one node for it */
4651
f10f63aaec5c updated for version 7.3.1073
Bram Moolenaar <bram@vim.org>
parents: 4649
diff changeset
1732 if (old_post_pos == (int)(post_ptr - post_start))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1733 EMIT(NFA_SKIP_CHAR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1734
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1735 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1736 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1737
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1738 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1739 * Parse a pattern, one or more branches, separated by "\|". It matches
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1740 * anything that matches one of the branches. Example: "foo\|beep" matches
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1741 * "foo" and matches "beep". If more than one branch matches, the first one
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1742 * is used.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1743 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1744 * pattern ::= branch
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1745 * or branch \| branch
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1746 * or branch \| branch \| branch
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1747 * etc.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1748 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1749 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1750 nfa_reg(paren)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1751 int paren; /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1752 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1753 int parno = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1754
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1755 if (paren == REG_PAREN)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1756 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1757 if (regnpar >= NSUBEXP) /* Too many `(' */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1758 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1759 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1760 EMSG_RET_FAIL(_("E872: (NFA regexp) Too many '('"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1761 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1762 parno = regnpar++;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1763 }
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1764 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1765 else if (paren == REG_ZPAREN)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1766 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1767 /* Make a ZOPEN node. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1768 if (regnzpar >= NSUBEXP)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1769 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1770 syntax_error = TRUE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1771 EMSG_RET_FAIL(_("E879: (NFA regexp) Too many \\z("));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1772 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1773 parno = regnzpar++;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1774 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1775 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1776
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1777 if (nfa_regbranch() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1778 return FAIL; /* cascaded error */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1779
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1780 while (peekchr() == Magic('|'))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1781 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1782 skipchr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1783 if (nfa_regbranch() == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1784 return FAIL; /* cascaded error */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1785 EMIT(NFA_OR);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1786 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1787
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1788 /* Check for proper termination. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1789 if (paren != REG_NOPAREN && getchr() != Magic(')'))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1790 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1791 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1792 if (paren == REG_NPAREN)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1793 EMSG2_RET_FAIL(_(e_unmatchedpp), reg_magic == MAGIC_ALL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1794 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1795 EMSG2_RET_FAIL(_(e_unmatchedp), reg_magic == MAGIC_ALL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1796 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1797 else if (paren == REG_NOPAREN && peekchr() != NUL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1798 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1799 syntax_error = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1800 if (peekchr() == Magic(')'))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1801 EMSG2_RET_FAIL(_(e_unmatchedpar), reg_magic == MAGIC_ALL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1802 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1803 EMSG_RET_FAIL(_("E873: (NFA regexp) proper termination error"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1804 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1805 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1806 * Here we set the flag allowing back references to this set of
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1807 * parentheses.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1808 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1809 if (paren == REG_PAREN)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1810 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1811 had_endbrace[parno] = TRUE; /* have seen the close paren */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1812 EMIT(NFA_MOPEN + parno);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1813 }
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1814 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1815 else if (paren == REG_ZPAREN)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1816 EMIT(NFA_ZOPEN + parno);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1817 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1818
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1819 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1820 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1821
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1822 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1823 static char_u code[50];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1824
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1825 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1826 nfa_set_code(c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1827 int c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1828 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1829 int addnl = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1830
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1831 if (c >= NFA_FIRST_NL && c <= NFA_LAST_NL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1832 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1833 addnl = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1834 c -= ADD_NL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1835 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1836
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1837 STRCPY(code, "");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1838 switch (c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1839 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1840 case NFA_MATCH: STRCPY(code, "NFA_MATCH "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1841 case NFA_SPLIT: STRCPY(code, "NFA_SPLIT "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1842 case NFA_CONCAT: STRCPY(code, "NFA_CONCAT "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1843 case NFA_NEWL: STRCPY(code, "NFA_NEWL "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1844 case NFA_ZSTART: STRCPY(code, "NFA_ZSTART"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1845 case NFA_ZEND: STRCPY(code, "NFA_ZEND"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1846
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1847 case NFA_BACKREF1: STRCPY(code, "NFA_BACKREF1"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1848 case NFA_BACKREF2: STRCPY(code, "NFA_BACKREF2"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1849 case NFA_BACKREF3: STRCPY(code, "NFA_BACKREF3"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1850 case NFA_BACKREF4: STRCPY(code, "NFA_BACKREF4"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1851 case NFA_BACKREF5: STRCPY(code, "NFA_BACKREF5"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1852 case NFA_BACKREF6: STRCPY(code, "NFA_BACKREF6"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1853 case NFA_BACKREF7: STRCPY(code, "NFA_BACKREF7"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1854 case NFA_BACKREF8: STRCPY(code, "NFA_BACKREF8"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1855 case NFA_BACKREF9: STRCPY(code, "NFA_BACKREF9"); break;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1856 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1857 case NFA_ZREF1: STRCPY(code, "NFA_ZREF1"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1858 case NFA_ZREF2: STRCPY(code, "NFA_ZREF2"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1859 case NFA_ZREF3: STRCPY(code, "NFA_ZREF3"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1860 case NFA_ZREF4: STRCPY(code, "NFA_ZREF4"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1861 case NFA_ZREF5: STRCPY(code, "NFA_ZREF5"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1862 case NFA_ZREF6: STRCPY(code, "NFA_ZREF6"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1863 case NFA_ZREF7: STRCPY(code, "NFA_ZREF7"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1864 case NFA_ZREF8: STRCPY(code, "NFA_ZREF8"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1865 case NFA_ZREF9: STRCPY(code, "NFA_ZREF9"); break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1866 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1867 case NFA_SKIP: STRCPY(code, "NFA_SKIP"); break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
1868
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1869 case NFA_PREV_ATOM_NO_WIDTH:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1870 STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH"); break;
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1871 case NFA_PREV_ATOM_NO_WIDTH_NEG:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
1872 STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH_NEG"); break;
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1873 case NFA_PREV_ATOM_JUST_BEFORE:
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1874 STRCPY(code, "NFA_PREV_ATOM_JUST_BEFORE"); break;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1875 case NFA_PREV_ATOM_JUST_BEFORE_NEG:
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1876 STRCPY(code, "NFA_PREV_ATOM_JUST_BEFORE_NEG"); break;
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
1877 case NFA_NOPEN: STRCPY(code, "NFA_NOPEN"); break;
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
1878 case NFA_NCLOSE: STRCPY(code, "NFA_NCLOSE"); break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1879 case NFA_START_INVISIBLE: STRCPY(code, "NFA_START_INVISIBLE"); break;
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1880 case NFA_START_INVISIBLE_BEFORE:
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
1881 STRCPY(code, "NFA_START_INVISIBLE_BEFORE"); break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1882 case NFA_END_INVISIBLE: STRCPY(code, "NFA_END_INVISIBLE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1883
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1884 case NFA_COMPOSING: STRCPY(code, "NFA_COMPOSING"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1885 case NFA_END_COMPOSING: STRCPY(code, "NFA_END_COMPOSING"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1886
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1887 case NFA_MOPEN:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1888 case NFA_MOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1889 case NFA_MOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1890 case NFA_MOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1891 case NFA_MOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1892 case NFA_MOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1893 case NFA_MOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1894 case NFA_MOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1895 case NFA_MOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1896 case NFA_MOPEN9:
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1897 STRCPY(code, "NFA_MOPEN(x)");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1898 code[10] = c - NFA_MOPEN + '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1899 break;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1900 case NFA_MCLOSE:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1901 case NFA_MCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1902 case NFA_MCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1903 case NFA_MCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1904 case NFA_MCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1905 case NFA_MCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1906 case NFA_MCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1907 case NFA_MCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1908 case NFA_MCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1909 case NFA_MCLOSE9:
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1910 STRCPY(code, "NFA_MCLOSE(x)");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1911 code[11] = c - NFA_MCLOSE + '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1912 break;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1913 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1914 case NFA_ZOPEN:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1915 case NFA_ZOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1916 case NFA_ZOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1917 case NFA_ZOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1918 case NFA_ZOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1919 case NFA_ZOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1920 case NFA_ZOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1921 case NFA_ZOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1922 case NFA_ZOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1923 case NFA_ZOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1924 STRCPY(code, "NFA_ZOPEN(x)");
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1925 code[10] = c - NFA_ZOPEN + '0';
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1926 break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1927 case NFA_ZCLOSE:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1928 case NFA_ZCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1929 case NFA_ZCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1930 case NFA_ZCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1931 case NFA_ZCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1932 case NFA_ZCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1933 case NFA_ZCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1934 case NFA_ZCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1935 case NFA_ZCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1936 case NFA_ZCLOSE9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1937 STRCPY(code, "NFA_ZCLOSE(x)");
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1938 code[11] = c - NFA_ZCLOSE + '0';
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1939 break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
1940 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1941 case NFA_EOL: STRCPY(code, "NFA_EOL "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1942 case NFA_BOL: STRCPY(code, "NFA_BOL "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1943 case NFA_EOW: STRCPY(code, "NFA_EOW "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1944 case NFA_BOW: STRCPY(code, "NFA_BOW "); break;
4671
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
1945 case NFA_EOF: STRCPY(code, "NFA_EOF "); break;
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
1946 case NFA_BOF: STRCPY(code, "NFA_BOF "); break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1947 case NFA_STAR: STRCPY(code, "NFA_STAR "); break;
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1948 case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1949 case NFA_QUEST: STRCPY(code, "NFA_QUEST"); break;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
1950 case NFA_QUEST_NONGREEDY: STRCPY(code, "NFA_QUEST_NON_GREEDY"); break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1951 case NFA_NOT: STRCPY(code, "NFA_NOT "); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1952 case NFA_SKIP_CHAR: STRCPY(code, "NFA_SKIP_CHAR"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1953 case NFA_OR: STRCPY(code, "NFA_OR"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1954 case NFA_END_NEG_RANGE: STRCPY(code, "NFA_END_NEG_RANGE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1955 case NFA_CLASS_ALNUM: STRCPY(code, "NFA_CLASS_ALNUM"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1956 case NFA_CLASS_ALPHA: STRCPY(code, "NFA_CLASS_ALPHA"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1957 case NFA_CLASS_BLANK: STRCPY(code, "NFA_CLASS_BLANK"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1958 case NFA_CLASS_CNTRL: STRCPY(code, "NFA_CLASS_CNTRL"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1959 case NFA_CLASS_DIGIT: STRCPY(code, "NFA_CLASS_DIGIT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1960 case NFA_CLASS_GRAPH: STRCPY(code, "NFA_CLASS_GRAPH"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1961 case NFA_CLASS_LOWER: STRCPY(code, "NFA_CLASS_LOWER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1962 case NFA_CLASS_PRINT: STRCPY(code, "NFA_CLASS_PRINT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1963 case NFA_CLASS_PUNCT: STRCPY(code, "NFA_CLASS_PUNCT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1964 case NFA_CLASS_SPACE: STRCPY(code, "NFA_CLASS_SPACE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1965 case NFA_CLASS_UPPER: STRCPY(code, "NFA_CLASS_UPPER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1966 case NFA_CLASS_XDIGIT: STRCPY(code, "NFA_CLASS_XDIGIT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1967 case NFA_CLASS_TAB: STRCPY(code, "NFA_CLASS_TAB"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1968 case NFA_CLASS_RETURN: STRCPY(code, "NFA_CLASS_RETURN"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1969 case NFA_CLASS_BACKSPACE: STRCPY(code, "NFA_CLASS_BACKSPACE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1970 case NFA_CLASS_ESCAPE: STRCPY(code, "NFA_CLASS_ESCAPE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1971
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1972 case NFA_ANY: STRCPY(code, "NFA_ANY"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1973 case NFA_IDENT: STRCPY(code, "NFA_IDENT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1974 case NFA_SIDENT:STRCPY(code, "NFA_SIDENT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1975 case NFA_KWORD: STRCPY(code, "NFA_KWORD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1976 case NFA_SKWORD:STRCPY(code, "NFA_SKWORD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1977 case NFA_FNAME: STRCPY(code, "NFA_FNAME"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1978 case NFA_SFNAME:STRCPY(code, "NFA_SFNAME"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1979 case NFA_PRINT: STRCPY(code, "NFA_PRINT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1980 case NFA_SPRINT:STRCPY(code, "NFA_SPRINT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1981 case NFA_WHITE: STRCPY(code, "NFA_WHITE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1982 case NFA_NWHITE:STRCPY(code, "NFA_NWHITE"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1983 case NFA_DIGIT: STRCPY(code, "NFA_DIGIT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1984 case NFA_NDIGIT:STRCPY(code, "NFA_NDIGIT"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1985 case NFA_HEX: STRCPY(code, "NFA_HEX"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1986 case NFA_NHEX: STRCPY(code, "NFA_NHEX"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1987 case NFA_OCTAL: STRCPY(code, "NFA_OCTAL"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1988 case NFA_NOCTAL:STRCPY(code, "NFA_NOCTAL"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1989 case NFA_WORD: STRCPY(code, "NFA_WORD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1990 case NFA_NWORD: STRCPY(code, "NFA_NWORD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1991 case NFA_HEAD: STRCPY(code, "NFA_HEAD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1992 case NFA_NHEAD: STRCPY(code, "NFA_NHEAD"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1993 case NFA_ALPHA: STRCPY(code, "NFA_ALPHA"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1994 case NFA_NALPHA:STRCPY(code, "NFA_NALPHA"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1995 case NFA_LOWER: STRCPY(code, "NFA_LOWER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1996 case NFA_NLOWER:STRCPY(code, "NFA_NLOWER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1997 case NFA_UPPER: STRCPY(code, "NFA_UPPER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1998 case NFA_NUPPER:STRCPY(code, "NFA_NUPPER"); break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1999
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2000 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2001 STRCPY(code, "CHAR(x)");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2002 code[5] = c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2003 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2004
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2005 if (addnl == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2006 STRCAT(code, " + NEWLINE ");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2007
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2008 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2009
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2010 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2011 static FILE *log_fd;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2012
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2013 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2014 * Print the postfix notation of the current regexp.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2015 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2016 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2017 nfa_postfix_dump(expr, retval)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2018 char_u *expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2019 int retval;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2020 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2021 int *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2022 FILE *f;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2023
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2024 f = fopen(NFA_REGEXP_DUMP_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2025 if (f != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2026 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2027 fprintf(f, "\n-------------------------\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2028 if (retval == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2029 fprintf(f, ">>> NFA engine failed ... \n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2030 else if (retval == OK)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2031 fprintf(f, ">>> NFA engine succeeded !\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2032 fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
2033 for (p = post_start; *p && p < post_end; p++)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2034 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2035 nfa_set_code(*p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2036 fprintf(f, "%s, ", code);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2037 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2038 fprintf(f, "\"\nPostfix notation (int): ");
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
2039 for (p = post_start; *p && p < post_end; p++)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2040 fprintf(f, "%d ", *p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2041 fprintf(f, "\n\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2042 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2043 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2044 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2045
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2046 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2047 * Print the NFA starting with a root node "state".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2048 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2049 static void
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2050 nfa_print_state(debugf, state)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2051 FILE *debugf;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2052 nfa_state_T *state;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2053 {
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2054 garray_T indent;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2055
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2056 ga_init2(&indent, 1, 64);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2057 ga_append(&indent, '\0');
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2058 nfa_print_state2(debugf, state, &indent);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2059 ga_clear(&indent);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2060 }
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2061
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2062 static void
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2063 nfa_print_state2(debugf, state, indent)
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2064 FILE *debugf;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2065 nfa_state_T *state;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2066 garray_T *indent;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2067 {
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2068 char_u *p;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2069
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2070 if (state == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2071 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2072
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2073 fprintf(debugf, "(%2d)", abs(state->id));
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2074
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2075 /* Output indent */
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2076 p = (char_u *)indent->ga_data;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2077 if (indent->ga_len >= 3)
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2078 {
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2079 int last = indent->ga_len - 3;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2080 char_u save[2];
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2081
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2082 STRNCPY(save, &p[last], 2);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2083 STRNCPY(&p[last], "+-", 2);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2084 fprintf(debugf, " %s", p);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2085 STRNCPY(&p[last], save, 2);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2086 }
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2087 else
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2088 fprintf(debugf, " %s", p);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2089
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2090 nfa_set_code(state->c);
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2091 fprintf(debugf, "%s%s (%d) (id=%d)\n",
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2092 state->negated ? "NOT " : "", code, state->c, abs(state->id));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2093 if (state->id < 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2094 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2095
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2096 state->id = abs(state->id) * -1;
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2097
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2098 /* grow indent for state->out */
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2099 indent->ga_len -= 1;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2100 if (state->out1)
4537
5cc98a5898cf updated for version 7.3.1016
Bram Moolenaar <bram@vim.org>
parents: 4535
diff changeset
2101 ga_concat(indent, (char_u *)"| ");
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2102 else
4537
5cc98a5898cf updated for version 7.3.1016
Bram Moolenaar <bram@vim.org>
parents: 4535
diff changeset
2103 ga_concat(indent, (char_u *)" ");
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2104 ga_append(indent, '\0');
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2105
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2106 nfa_print_state2(debugf, state->out, indent);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2107
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2108 /* replace last part of indent for state->out1 */
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2109 indent->ga_len -= 3;
4537
5cc98a5898cf updated for version 7.3.1016
Bram Moolenaar <bram@vim.org>
parents: 4535
diff changeset
2110 ga_concat(indent, (char_u *)" ");
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2111 ga_append(indent, '\0');
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2112
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2113 nfa_print_state2(debugf, state->out1, indent);
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2114
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2115 /* shrink indent */
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2116 indent->ga_len -= 3;
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2117 ga_append(indent, '\0');
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2118 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2119
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2120 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2121 * Print the NFA state machine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2122 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2123 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2124 nfa_dump(prog)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2125 nfa_regprog_T *prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2126 {
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2127 FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2128
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2129 if (debugf != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2130 {
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
2131 nfa_print_state(debugf, prog->start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2132 fclose(debugf);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2133 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2134 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2135 #endif /* ENABLE_LOG */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2136 #endif /* DEBUG */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2137
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2138 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2139 * Parse r.e. @expr and convert it into postfix form.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2140 * Return the postfix string on success, NULL otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2141 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2142 static int *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2143 re2post()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2144 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2145 if (nfa_reg(REG_NOPAREN) == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2146 return NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2147 EMIT(NFA_MOPEN);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2148 return post_start;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2149 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2150
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2151 /* NB. Some of the code below is inspired by Russ's. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2152
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2153 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2154 * Represents an NFA state plus zero or one or two arrows exiting.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2155 * if c == MATCH, no arrows out; matching state.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2156 * If c == SPLIT, unlabeled arrows to out and out1 (if != NULL).
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2157 * If c < 256, labeled arrow with character c to out.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2158 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2159
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2160 static nfa_state_T *state_ptr; /* points to nfa_prog->state */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2161
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2162 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2163 * Allocate and initialize nfa_state_T.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2164 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2165 static nfa_state_T *
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2166 alloc_state(c, out, out1)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2167 int c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2168 nfa_state_T *out;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2169 nfa_state_T *out1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2170 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2171 nfa_state_T *s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2172
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2173 if (istate >= nstate)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2174 return NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2175
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2176 s = &state_ptr[istate++];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2177
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2178 s->c = c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2179 s->out = out;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2180 s->out1 = out1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2181
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2182 s->id = istate;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
2183 s->lastlist[0] = 0;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
2184 s->lastlist[1] = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2185 s->negated = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2186
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2187 return s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2188 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2189
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2190 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2191 * A partially built NFA without the matching state filled in.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2192 * Frag_T.start points at the start state.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2193 * Frag_T.out is a list of places that need to be set to the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2194 * next state for this fragment.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2195 */
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2196
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2197 /* Since the out pointers in the list are always
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2198 * uninitialized, we use the pointers themselves
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2199 * as storage for the Ptrlists. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2200 typedef union Ptrlist Ptrlist;
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2201 union Ptrlist
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2202 {
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2203 Ptrlist *next;
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2204 nfa_state_T *s;
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2205 };
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2206
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2207 struct Frag
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2208 {
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
2209 nfa_state_T *start;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2210 Ptrlist *out;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2211 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2212 typedef struct Frag Frag_T;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2213
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2214 static Frag_T frag __ARGS((nfa_state_T *start, Ptrlist *out));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2215 static Ptrlist *list1 __ARGS((nfa_state_T **outp));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2216 static void patch __ARGS((Ptrlist *l, nfa_state_T *s));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2217 static Ptrlist *append __ARGS((Ptrlist *l1, Ptrlist *l2));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2218 static void st_push __ARGS((Frag_T s, Frag_T **p, Frag_T *stack_end));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2219 static Frag_T st_pop __ARGS((Frag_T **p, Frag_T *stack));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2220
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2221 /*
4456
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2222 * Initialize a Frag_T struct and return it.
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2223 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2224 static Frag_T
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2225 frag(start, out)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2226 nfa_state_T *start;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2227 Ptrlist *out;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2228 {
4456
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2229 Frag_T n;
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2230
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2231 n.start = start;
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2232 n.out = out;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2233 return n;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2234 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2235
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2236 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2237 * Create singleton list containing just outp.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2238 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2239 static Ptrlist *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2240 list1(outp)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2241 nfa_state_T **outp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2242 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2243 Ptrlist *l;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2244
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2245 l = (Ptrlist *)outp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2246 l->next = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2247 return l;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2248 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2249
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2250 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2251 * Patch the list of states at out to point to start.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2252 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2253 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2254 patch(l, s)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2255 Ptrlist *l;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2256 nfa_state_T *s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2257 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2258 Ptrlist *next;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2259
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2260 for (; l; l = next)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2261 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2262 next = l->next;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2263 l->s = s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2264 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2265 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2266
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2267
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2268 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2269 * Join the two lists l1 and l2, returning the combination.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2270 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2271 static Ptrlist *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2272 append(l1, l2)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2273 Ptrlist *l1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2274 Ptrlist *l2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2275 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2276 Ptrlist *oldl1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2277
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2278 oldl1 = l1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2279 while (l1->next)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2280 l1 = l1->next;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2281 l1->next = l2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2282 return oldl1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2283 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2284
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2285 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2286 * Stack used for transforming postfix form into NFA.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2287 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2288 static Frag_T empty;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2289
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2290 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2291 st_error(postfix, end, p)
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2292 int *postfix UNUSED;
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2293 int *end UNUSED;
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2294 int *p UNUSED;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2295 {
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2296 #ifdef NFA_REGEXP_ERROR_LOG
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2297 FILE *df;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2298 int *p2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2299
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2300 df = fopen(NFA_REGEXP_ERROR_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2301 if (df)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2302 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2303 fprintf(df, "Error popping the stack!\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2304 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2305 fprintf(df, "Current regexp is \"%s\"\n", nfa_regengine.expr);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2306 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2307 fprintf(df, "Postfix form is: ");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2308 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2309 for (p2 = postfix; p2 < end; p2++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2310 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2311 nfa_set_code(*p2);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2312 fprintf(df, "%s, ", code);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2313 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2314 nfa_set_code(*p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2315 fprintf(df, "\nCurrent position is: ");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2316 for (p2 = postfix; p2 <= p; p2 ++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2317 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2318 nfa_set_code(*p2);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2319 fprintf(df, "%s, ", code);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2320 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2321 #else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2322 for (p2 = postfix; p2 < end; p2++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2323 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2324 fprintf(df, "%d, ", *p2);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2325 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2326 fprintf(df, "\nCurrent position is: ");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2327 for (p2 = postfix; p2 <= p; p2 ++)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2328 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2329 fprintf(df, "%d, ", *p2);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2330 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2331 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2332 fprintf(df, "\n--------------------------\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2333 fclose(df);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2334 }
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2335 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2336 EMSG(_("E874: (NFA) Could not pop the stack !"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2337 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2338
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2339 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2340 * Push an item onto the stack.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2341 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2342 static void
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2343 st_push(s, p, stack_end)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2344 Frag_T s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2345 Frag_T **p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2346 Frag_T *stack_end;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2347 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2348 Frag_T *stackp = *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2349
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2350 if (stackp >= stack_end)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2351 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2352 *stackp = s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2353 *p = *p + 1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2354 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2355
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2356 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2357 * Pop an item from the stack.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2358 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2359 static Frag_T
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2360 st_pop(p, stack)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2361 Frag_T **p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2362 Frag_T *stack;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2363 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2364 Frag_T *stackp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2365
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2366 *p = *p - 1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2367 stackp = *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2368 if (stackp < stack)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2369 return empty;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2370 return **p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2371 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2372
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2373 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2374 * Convert a postfix form into its equivalent NFA.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2375 * Return the NFA start state on success, NULL otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2376 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2377 static nfa_state_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2378 post2nfa(postfix, end, nfa_calc_size)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2379 int *postfix;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2380 int *end;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2381 int nfa_calc_size;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2382 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2383 int *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2384 int mopen;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2385 int mclose;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2386 Frag_T *stack = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2387 Frag_T *stackp = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2388 Frag_T *stack_end = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2389 Frag_T e1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2390 Frag_T e2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2391 Frag_T e;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2392 nfa_state_T *s;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2393 nfa_state_T *s1;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2394 nfa_state_T *matchstate;
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2395 nfa_state_T *ret = NULL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2396
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2397 if (postfix == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2398 return NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2399
4456
015a8fabf900 updated for version 7.3.976
Bram Moolenaar <bram@vim.org>
parents: 4454
diff changeset
2400 #define PUSH(s) st_push((s), &stackp, stack_end)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2401 #define POP() st_pop(&stackp, stack); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2402 if (stackp < stack) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2403 { \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2404 st_error(postfix, end, p); \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2405 return NULL; \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2406 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2407
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2408 if (nfa_calc_size == FALSE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2409 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2410 /* Allocate space for the stack. Max states on the stack : nstate */
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2411 stack = (Frag_T *)lalloc((nstate + 1) * sizeof(Frag_T), TRUE);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2412 stackp = stack;
4462
a63361b90979 updated for version 7.3.979
Bram Moolenaar <bram@vim.org>
parents: 4460
diff changeset
2413 stack_end = stack + (nstate + 1);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2414 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2415
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2416 for (p = postfix; p < end; ++p)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2417 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2418 switch (*p)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2419 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2420 case NFA_CONCAT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2421 /* Catenation.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2422 * Pay attention: this operator does not exist
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2423 * in the r.e. itself (it is implicit, really).
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2424 * It is added when r.e. is translated to postfix
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2425 * form in re2post().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2426 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2427 * No new state added here. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2428 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2429 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2430 /* nstate += 0; */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2431 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2432 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2433 e2 = POP();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2434 e1 = POP();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2435 patch(e1.out, e2.start);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2436 PUSH(frag(e1.start, e2.out));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2437 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2438
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2439 case NFA_NOT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2440 /* Negation of a character */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2441 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2442 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2443 /* nstate += 0; */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2444 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2445 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2446 e1 = POP();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2447 e1.start->negated = TRUE;
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2448 #ifdef FEAT_MBYTE
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2449 if (e1.start->c == NFA_COMPOSING)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2450 e1.start->out1->negated = TRUE;
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2451 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2452 PUSH(e1);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2453 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2454
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2455 case NFA_OR:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2456 /* Alternation */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2457 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2458 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2459 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2460 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2461 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2462 e2 = POP();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2463 e1 = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2464 s = alloc_state(NFA_SPLIT, e1.start, e2.start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2465 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2466 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2467 PUSH(frag(s, append(e1.out, e2.out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2468 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2469
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2470 case NFA_STAR:
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2471 /* Zero or more, prefer more */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2472 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2473 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2474 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2475 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2476 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2477 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2478 s = alloc_state(NFA_SPLIT, e.start, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2479 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2480 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2481 patch(e.out, s);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2482 PUSH(frag(s, list1(&s->out1)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2483 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2484
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2485 case NFA_STAR_NONGREEDY:
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2486 /* Zero or more, prefer zero */
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2487 if (nfa_calc_size == TRUE)
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2488 {
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2489 nstate++;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2490 break;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2491 }
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2492 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2493 s = alloc_state(NFA_SPLIT, NULL, e.start);
4675
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2494 if (s == NULL)
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2495 goto theend;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2496 patch(e.out, s);
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2497 PUSH(frag(s, list1(&s->out)));
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2498 break;
811a4c9b51d8 updated for version 7.3.1085
Bram Moolenaar <bram@vim.org>
parents: 4673
diff changeset
2499
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2500 case NFA_QUEST:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2501 /* one or zero atoms=> greedy match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2502 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2503 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2504 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2505 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2506 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2507 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2508 s = alloc_state(NFA_SPLIT, e.start, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2509 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2510 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2511 PUSH(frag(s, append(e.out, list1(&s->out1))));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2512 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2513
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2514 case NFA_QUEST_NONGREEDY:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2515 /* zero or one atoms => non-greedy match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2516 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2517 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2518 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2519 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2520 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2521 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2522 s = alloc_state(NFA_SPLIT, NULL, e.start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2523 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2524 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2525 PUSH(frag(s, append(e.out, list1(&s->out))));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2526 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2527
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2528 case NFA_SKIP_CHAR:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2529 /* Symbol of 0-length, Used in a repetition
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2530 * with max/min count of 0 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2531 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2532 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2533 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2534 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2535 }
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2536 s = alloc_state(NFA_SKIP_CHAR, NULL, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2537 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2538 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2539 PUSH(frag(s, list1(&s->out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2540 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2541
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2542 case NFA_PREV_ATOM_NO_WIDTH:
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2543 case NFA_PREV_ATOM_NO_WIDTH_NEG:
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2544 case NFA_PREV_ATOM_JUST_BEFORE:
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2545 case NFA_PREV_ATOM_JUST_BEFORE_NEG:
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
2546 /* The \@= operator: match the preceding atom with zero width.
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2547 * The \@! operator: no match for the preceding atom.
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2548 * The \@<= operator: match for the preceding atom.
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2549 * The \@<! operator: no match for the preceding atom.
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2550 * Surrounds the preceding atom with START_INVISIBLE and
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
2551 * END_INVISIBLE, similarly to MOPEN. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2552
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2553 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2554 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2555 nstate += 2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2556 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2557 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2558 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2559 s1 = alloc_state(NFA_END_INVISIBLE, NULL, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2560 if (s1 == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2561 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2562 patch(e.out, s1);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2563
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2564 s = alloc_state(NFA_START_INVISIBLE, e.start, s1);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2565 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2566 goto theend;
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2567 if (*p == NFA_PREV_ATOM_NO_WIDTH_NEG
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2568 || *p == NFA_PREV_ATOM_JUST_BEFORE_NEG)
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2569 {
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2570 s->negated = TRUE;
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2571 s1->negated = TRUE;
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2572 }
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2573 if (*p == NFA_PREV_ATOM_JUST_BEFORE
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2574 || *p == NFA_PREV_ATOM_JUST_BEFORE_NEG)
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2575 {
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2576 s->val = *++p; /* get the count */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2577 ++s->c; /* NFA_START_INVISIBLE -> NFA_START_INVISIBLE_BEFORE */
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
2578 }
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
2579
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2580 PUSH(frag(s, list1(&s1->out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2581 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2582
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2583 #ifdef FEAT_MBYTE
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2584 case NFA_COMPOSING: /* char with composing char */
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2585 #if 0
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2586 /* TODO */
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2587 if (regflags & RF_ICOMBINE)
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2588 {
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
2589 /* use the base character only */
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2590 }
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2591 #endif
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2592 /* FALLTHROUGH */
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2593 #endif
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2594
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2595 case NFA_MOPEN: /* \( \) Submatch */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2596 case NFA_MOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2597 case NFA_MOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2598 case NFA_MOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2599 case NFA_MOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2600 case NFA_MOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2601 case NFA_MOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2602 case NFA_MOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2603 case NFA_MOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2604 case NFA_MOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2605 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2606 case NFA_ZOPEN: /* \z( \) Submatch */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2607 case NFA_ZOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2608 case NFA_ZOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2609 case NFA_ZOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2610 case NFA_ZOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2611 case NFA_ZOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2612 case NFA_ZOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2613 case NFA_ZOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2614 case NFA_ZOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2615 case NFA_ZOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2616 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2617 case NFA_NOPEN: /* \%( \) "Invisible Submatch" */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2618 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2619 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2620 nstate += 2;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2621 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2622 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2623
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2624 mopen = *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2625 switch (*p)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2626 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2627 case NFA_NOPEN: mclose = NFA_NCLOSE; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2628 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2629 case NFA_ZOPEN: mclose = NFA_ZCLOSE; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2630 case NFA_ZOPEN1: mclose = NFA_ZCLOSE1; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2631 case NFA_ZOPEN2: mclose = NFA_ZCLOSE2; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2632 case NFA_ZOPEN3: mclose = NFA_ZCLOSE3; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2633 case NFA_ZOPEN4: mclose = NFA_ZCLOSE4; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2634 case NFA_ZOPEN5: mclose = NFA_ZCLOSE5; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2635 case NFA_ZOPEN6: mclose = NFA_ZCLOSE6; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2636 case NFA_ZOPEN7: mclose = NFA_ZCLOSE7; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2637 case NFA_ZOPEN8: mclose = NFA_ZCLOSE8; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2638 case NFA_ZOPEN9: mclose = NFA_ZCLOSE9; break;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2639 #endif
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2640 #ifdef FEAT_MBYTE
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2641 case NFA_COMPOSING: mclose = NFA_END_COMPOSING; break;
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2642 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2643 default:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2644 /* NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2645 mclose = *p + NSUBEXP;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2646 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2647 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2648
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2649 /* Allow "NFA_MOPEN" as a valid postfix representation for
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2650 * the empty regexp "". In this case, the NFA will be
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2651 * NFA_MOPEN -> NFA_MCLOSE. Note that this also allows
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2652 * empty groups of parenthesis, and empty mbyte chars */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2653 if (stackp == stack)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2654 {
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2655 s = alloc_state(mopen, NULL, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2656 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2657 goto theend;
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2658 s1 = alloc_state(mclose, NULL, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2659 if (s1 == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2660 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2661 patch(list1(&s->out), s1);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2662 PUSH(frag(s, list1(&s1->out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2663 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2664 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2665
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2666 /* At least one node was emitted before NFA_MOPEN, so
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2667 * at least one node will be between NFA_MOPEN and NFA_MCLOSE */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2668 e = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2669 s = alloc_state(mopen, e.start, NULL); /* `(' */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2670 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2671 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2672
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2673 s1 = alloc_state(mclose, NULL, NULL); /* `)' */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2674 if (s1 == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2675 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2676 patch(e.out, s1);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2677
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2678 #ifdef FEAT_MBYTE
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2679 if (mopen == NFA_COMPOSING)
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
2680 /* COMPOSING->out1 = END_COMPOSING */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2681 patch(list1(&s->out1), s1);
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
2682 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2683
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2684 PUSH(frag(s, list1(&s1->out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2685 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2686
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2687 case NFA_BACKREF1:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2688 case NFA_BACKREF2:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2689 case NFA_BACKREF3:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2690 case NFA_BACKREF4:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2691 case NFA_BACKREF5:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2692 case NFA_BACKREF6:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2693 case NFA_BACKREF7:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2694 case NFA_BACKREF8:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2695 case NFA_BACKREF9:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2696 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2697 case NFA_ZREF1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2698 case NFA_ZREF2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2699 case NFA_ZREF3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2700 case NFA_ZREF4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2701 case NFA_ZREF5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2702 case NFA_ZREF6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2703 case NFA_ZREF7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2704 case NFA_ZREF8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2705 case NFA_ZREF9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2706 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2707 if (nfa_calc_size == TRUE)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2708 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2709 nstate += 2;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2710 break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2711 }
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2712 s = alloc_state(*p, NULL, NULL);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2713 if (s == NULL)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2714 goto theend;
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2715 s1 = alloc_state(NFA_SKIP, NULL, NULL);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2716 if (s1 == NULL)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2717 goto theend;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2718 patch(list1(&s->out), s1);
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2719 PUSH(frag(s, list1(&s1->out)));
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2720 break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2721
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2722 case NFA_LNUM:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2723 case NFA_LNUM_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2724 case NFA_LNUM_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2725 case NFA_VCOL:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2726 case NFA_VCOL_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2727 case NFA_VCOL_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2728 case NFA_COL:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2729 case NFA_COL_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2730 case NFA_COL_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2731 if (nfa_calc_size == TRUE)
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2732 {
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2733 nstate += 1;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2734 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2735 }
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2736 e1 = POP();
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2737 s = alloc_state(*p, NULL, NULL);
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2738 if (s == NULL)
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2739 goto theend;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2740 s->val = e1.start->c;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2741 PUSH(frag(s, list1(&s->out)));
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2742 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2743
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2744 case NFA_ZSTART:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2745 case NFA_ZEND:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2746 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2747 /* Operands */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2748 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2749 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2750 nstate++;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2751 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2752 }
4696
ed4e689bbea1 updated for version 7.3.1095
Bram Moolenaar <bram@vim.org>
parents: 4694
diff changeset
2753 s = alloc_state(*p, NULL, NULL);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2754 if (s == NULL)
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2755 goto theend;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2756 PUSH(frag(s, list1(&s->out)));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2757 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2758
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2759 } /* switch(*p) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2760
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2761 } /* for(p = postfix; *p; ++p) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2762
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2763 if (nfa_calc_size == TRUE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2764 {
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
2765 nstate++;
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2766 goto theend; /* Return value when counting size is ignored anyway */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2767 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2768
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2769 e = POP();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2770 if (stackp != stack)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2771 EMSG_RET_NULL(_("E875: (NFA regexp) (While converting from postfix to NFA), too many states left on stack"));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2772
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2773 if (istate >= nstate)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2774 EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA "));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2775
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2776 matchstate = &state_ptr[istate++]; /* the match state */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2777 matchstate->c = NFA_MATCH;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2778 matchstate->out = matchstate->out1 = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2779
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2780 patch(e.out, matchstate);
4484
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2781 ret = e.start;
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2782
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2783 theend:
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2784 vim_free(stack);
9a1d78f82826 updated for version 7.3.990
Bram Moolenaar <bram@vim.org>
parents: 4482
diff changeset
2785 return ret;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2786
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2787 #undef POP1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2788 #undef PUSH1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2789 #undef POP2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2790 #undef PUSH2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2791 #undef POP
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2792 #undef PUSH
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2793 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2794
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2795 /****************************************************************
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2796 * NFA execution code.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2797 ****************************************************************/
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2798
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2799 typedef struct
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2800 {
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2801 int in_use; /* number of subexpr with useful info */
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2802
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2803 /* When REG_MULTI is TRUE list.multi is used, otherwise list.line. */
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2804 union
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2805 {
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2806 struct multipos
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2807 {
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2808 lpos_T start;
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2809 lpos_T end;
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2810 } multi[NSUBEXP];
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2811 struct linepos
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2812 {
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2813 char_u *start;
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2814 char_u *end;
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2815 } line[NSUBEXP];
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2816 } list;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2817 } regsub_T;
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
2818
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2819 typedef struct
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2820 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2821 regsub_T norm; /* \( .. \) matches */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2822 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2823 regsub_T synt; /* \z( .. \) matches */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2824 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2825 } regsubs_T;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2826
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
2827 /* nfa_thread_T contains execution information of a NFA state */
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
2828 typedef struct
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2829 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2830 nfa_state_T *state;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2831 int count;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2832 regsubs_T subs; /* submatch info, only party used */
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
2833 } nfa_thread_T;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
2834
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
2835 /* nfa_list_T contains the alternative NFA execution states. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2836 typedef struct
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2837 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2838 nfa_thread_T *t; /* allocated array of states */
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2839 int n; /* nr of states currently in "t" */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2840 int len; /* max nr of states in "t" */
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2841 int id; /* ID of the list */
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
2842 } nfa_list_T;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
2843
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2844 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2845 static void log_subsexpr __ARGS((regsubs_T *subs));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2846 static void log_subexpr __ARGS((regsub_T *sub));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2847
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2848 static void
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2849 log_subsexpr(subs)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2850 regsubs_T *subs;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2851 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2852 log_subexpr(&subs->norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2853 # ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2854 log_subexpr(&subs->synt);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2855 # endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2856 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2857
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2858 static void
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2859 log_subexpr(sub)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2860 regsub_T *sub;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2861 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2862 int j;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2863
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2864 for (j = 0; j < sub->in_use; j++)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2865 if (REG_MULTI)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2866 fprintf(log_fd, "\n *** group %d, start: c=%d, l=%d, end: c=%d, l=%d",
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2867 j,
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2868 sub->list.multi[j].start.col,
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2869 (int)sub->list.multi[j].start.lnum,
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2870 sub->list.multi[j].end.col,
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2871 (int)sub->list.multi[j].end.lnum);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2872 else
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2873 fprintf(log_fd, "\n *** group %d, start: \"%s\", end: \"%s\"",
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2874 j,
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2875 (char *)sub->list.line[j].start,
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
2876 (char *)sub->list.line[j].end);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2877 fprintf(log_fd, "\n");
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2878 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2879 #endif
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
2880
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
2881 /* Used during execution: whether a match has been found. */
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
2882 static int nfa_match;
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
2883
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2884 static void clear_sub __ARGS((regsub_T *sub));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2885 static void copy_sub __ARGS((regsub_T *to, regsub_T *from));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2886 static void copy_sub_off __ARGS((regsub_T *to, regsub_T *from));
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2887 static int sub_equal __ARGS((regsub_T *sub1, regsub_T *sub2));
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2888 static void addstate __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, int off));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2889 static void addstate_here __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, int *ip));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2890
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2891 static void
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2892 clear_sub(sub)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2893 regsub_T *sub;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2894 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2895 if (REG_MULTI)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2896 /* Use 0xff to set lnum to -1 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2897 vim_memset(sub->list.multi, 0xff,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2898 sizeof(struct multipos) * nfa_nsubexpr);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2899 else
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2900 vim_memset(sub->list.line, 0, sizeof(struct linepos) * nfa_nsubexpr);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2901 sub->in_use = 0;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2902 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2903
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2904 /*
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2905 * Copy the submatches from "from" to "to".
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2906 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2907 static void
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2908 copy_sub(to, from)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2909 regsub_T *to;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2910 regsub_T *from;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2911 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2912 to->in_use = from->in_use;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2913 if (from->in_use > 0)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2914 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2915 /* Copy the match start and end positions. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2916 if (REG_MULTI)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2917 mch_memmove(&to->list.multi[0],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2918 &from->list.multi[0],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2919 sizeof(struct multipos) * from->in_use);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2920 else
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2921 mch_memmove(&to->list.line[0],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2922 &from->list.line[0],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2923 sizeof(struct linepos) * from->in_use);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2924 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2925 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2926
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2927 /*
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2928 * Like copy_sub() but exclude the main match.
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2929 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2930 static void
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2931 copy_sub_off(to, from)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2932 regsub_T *to;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2933 regsub_T *from;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2934 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2935 if (to->in_use < from->in_use)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2936 to->in_use = from->in_use;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2937 if (from->in_use > 1)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2938 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2939 /* Copy the match start and end positions. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2940 if (REG_MULTI)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2941 mch_memmove(&to->list.multi[1],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2942 &from->list.multi[1],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2943 sizeof(struct multipos) * (from->in_use - 1));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2944 else
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2945 mch_memmove(&to->list.line[1],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2946 &from->list.line[1],
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2947 sizeof(struct linepos) * (from->in_use - 1));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2948 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2949 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2950
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2951 /*
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2952 * Return TRUE if "sub1" and "sub2" have the same positions.
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2953 */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2954 static int
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2955 sub_equal(sub1, sub2)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2956 regsub_T *sub1;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2957 regsub_T *sub2;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2958 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2959 int i;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2960 int todo;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2961 linenr_T s1, e1;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2962 linenr_T s2, e2;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2963 char_u *sp1, *ep1;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2964 char_u *sp2, *ep2;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2965
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2966 todo = sub1->in_use > sub2->in_use ? sub1->in_use : sub2->in_use;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2967 if (REG_MULTI)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2968 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2969 for (i = 0; i < todo; ++i)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2970 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2971 if (i < sub1->in_use)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2972 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2973 s1 = sub1->list.multi[i].start.lnum;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2974 e1 = sub1->list.multi[i].end.lnum;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2975 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2976 else
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2977 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2978 s1 = 0;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2979 e1 = 0;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2980 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2981 if (i < sub2->in_use)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2982 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2983 s2 = sub2->list.multi[i].start.lnum;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2984 e2 = sub2->list.multi[i].end.lnum;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2985 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2986 else
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2987 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2988 s2 = 0;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2989 e2 = 0;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2990 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2991 if (s1 != s2 || e1 != e2)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2992 return FALSE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2993 if (s1 != 0 && sub1->list.multi[i].start.col
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2994 != sub2->list.multi[i].start.col)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2995 return FALSE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2996 if (e1 != 0 && sub1->list.multi[i].end.col
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2997 != sub2->list.multi[i].end.col)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2998 return FALSE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
2999 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3000 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3001 else
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3002 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3003 for (i = 0; i < todo; ++i)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3004 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3005 if (i < sub1->in_use)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3006 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3007 sp1 = sub1->list.line[i].start;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3008 ep1 = sub1->list.line[i].end;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3009 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3010 else
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3011 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3012 sp1 = NULL;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3013 ep1 = NULL;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3014 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3015 if (i < sub2->in_use)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3016 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3017 sp2 = sub2->list.line[i].start;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3018 ep2 = sub2->list.line[i].end;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3019 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3020 else
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3021 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3022 sp2 = NULL;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3023 ep2 = NULL;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3024 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3025 if (sp1 != sp2 || ep1 != ep2)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3026 return FALSE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3027 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3028 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3029
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3030 return TRUE;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3031 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3032
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3033 #ifdef ENABLE_LOG
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3034 static void
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3035 report_state(char *action, regsub_T *sub, nfa_state_T *state, int lid);
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3036 {
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3037 int col;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3038
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3039 if (sub->in_use <= 0)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3040 col = -1;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3041 else if (REG_MULTI)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3042 col = sub->list.multi[0].start.col;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3043 else
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3044 col = (int)(sub->list.line[0].start - regline);
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3045 nfa_set_code(state->c);
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3046 fprintf(log_fd, "> %s state %d to list %d. char %d: %s (start col %d)\n",
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3047 action, abs(state->id), lid, state->c, code, col);
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3048 }
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3049 #endif
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3050
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3051 static void
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3052 addstate(l, state, subs, off)
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3053 nfa_list_T *l; /* runtime state list */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3054 nfa_state_T *state; /* state to update */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3055 regsubs_T *subs; /* pointers to subexpressions */
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3056 int off; /* byte offset, when -1 go to next line */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3057 {
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3058 int subidx;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3059 nfa_thread_T *thread;
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3060 lpos_T save_lpos;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3061 int save_in_use;
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3062 char_u *save_ptr;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3063 int i;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3064 regsub_T *sub;
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3065 #ifdef ENABLE_LOG
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3066 int did_print = FALSE;
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3067 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3068
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3069 if (l == NULL || state == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3070 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3071
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3072 switch (state->c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3073 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3074 case NFA_SPLIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3075 case NFA_NOT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3076 case NFA_NOPEN:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3077 case NFA_NCLOSE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3078 case NFA_MCLOSE:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3079 case NFA_MCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3080 case NFA_MCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3081 case NFA_MCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3082 case NFA_MCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3083 case NFA_MCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3084 case NFA_MCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3085 case NFA_MCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3086 case NFA_MCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3087 case NFA_MCLOSE9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3088 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3089 case NFA_ZCLOSE:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3090 case NFA_ZCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3091 case NFA_ZCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3092 case NFA_ZCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3093 case NFA_ZCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3094 case NFA_ZCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3095 case NFA_ZCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3096 case NFA_ZCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3097 case NFA_ZCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3098 case NFA_ZCLOSE9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3099 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3100 /* These nodes are not added themselves but their "out" and/or
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3101 * "out1" may be added below. */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3102 break;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3103
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3104 case NFA_MOPEN:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3105 case NFA_MOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3106 case NFA_MOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3107 case NFA_MOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3108 case NFA_MOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3109 case NFA_MOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3110 case NFA_MOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3111 case NFA_MOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3112 case NFA_MOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3113 case NFA_MOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3114 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3115 case NFA_ZOPEN:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3116 case NFA_ZOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3117 case NFA_ZOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3118 case NFA_ZOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3119 case NFA_ZOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3120 case NFA_ZOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3121 case NFA_ZOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3122 case NFA_ZOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3123 case NFA_ZOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3124 case NFA_ZOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3125 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3126 /* These nodes do not need to be added, but we need to bail out
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3127 * when it was tried to be added to this list before. */
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3128 if (state->lastlist[nfa_ll_index] == l->id)
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3129 goto skip_add;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3130 state->lastlist[nfa_ll_index] = l->id;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3131 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3132
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3133 case NFA_BOL:
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3134 case NFA_BOF:
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3135 /* "^" won't match past end-of-line, don't bother trying.
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3136 * Except when we are going to the next line for a look-behind
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3137 * match. */
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3138 if (reginput > regline
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3139 && (nfa_endp == NULL
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3140 || !REG_MULTI
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3141 || reglnum == nfa_endp->se_u.pos.lnum))
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3142 goto skip_add;
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3143 /* FALLTHROUGH */
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3144
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3145 default:
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3146 if (state->lastlist[nfa_ll_index] == l->id)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3147 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3148 /* This state is already in the list, don't add it again,
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3149 * unless it is an MOPEN that is used for a backreference. */
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3150 if (!nfa_has_backref)
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3151 {
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3152 skip_add:
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3153 #ifdef ENABLE_LOG
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3154 nfa_set_code(state->c);
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3155 fprintf(log_fd, "> Not adding state %d to list %d. char %d: %s\n",
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3156 abs(state->id), l->id, state->c, code);
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3157 #endif
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3158 return;
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3159 }
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3160
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3161 /* See if the same state is already in the list with the same
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3162 * positions. */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3163 for (i = 0; i < l->n; ++i)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3164 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3165 thread = &l->t[i];
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3166 if (thread->state->id == state->id
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3167 && sub_equal(&thread->subs.norm, &subs->norm)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3168 #ifdef FEAT_SYN_HL
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3169 && (!nfa_has_zsubexpr ||
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3170 sub_equal(&thread->subs.synt, &subs->synt))
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3171 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3172 )
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3173 goto skip_add;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3174 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3175 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3176
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3177 /* when there are backreferences the number of states may be (a
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3178 * lot) bigger */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3179 if (nfa_has_backref && l->n == l->len)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3180 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3181 int newlen = l->len * 3 / 2 + 50;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3182
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3183 l->t = vim_realloc(l->t, newlen * sizeof(nfa_thread_T));
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3184 l->len = newlen;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3185 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3186
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3187 /* add the state to the list */
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3188 state->lastlist[nfa_ll_index] = l->id;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3189 thread = &l->t[l->n++];
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3190 thread->state = state;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3191 copy_sub(&thread->subs.norm, &subs->norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3192 #ifdef FEAT_SYN_HL
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3193 if (nfa_has_zsubexpr)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3194 copy_sub(&thread->subs.synt, &subs->synt);
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3195 #endif
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3196 #ifdef ENABLE_LOG
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3197 report_state("Adding", &thread->subs.norm, state, l->id);
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3198 did_print = TRUE;
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3199 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3200 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3201
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3202 #ifdef ENABLE_LOG
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
3203 if (!did_print)
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3204 report_state("Processing", &subs->norm, state, l->id);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3205 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3206 switch (state->c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3207 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3208 case NFA_MATCH:
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3209 nfa_match = TRUE;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3210 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3211
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3212 case NFA_SPLIT:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3213 /* order matters here */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3214 addstate(l, state->out, subs, off);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3215 addstate(l, state->out1, subs, off);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3216 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3217
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3218 case NFA_SKIP_CHAR:
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3219 case NFA_NOPEN:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3220 case NFA_NCLOSE:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3221 addstate(l, state->out, subs, off);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3222 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3223
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3224 case NFA_MOPEN:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3225 case NFA_MOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3226 case NFA_MOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3227 case NFA_MOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3228 case NFA_MOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3229 case NFA_MOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3230 case NFA_MOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3231 case NFA_MOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3232 case NFA_MOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3233 case NFA_MOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3234 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3235 case NFA_ZOPEN:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3236 case NFA_ZOPEN1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3237 case NFA_ZOPEN2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3238 case NFA_ZOPEN3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3239 case NFA_ZOPEN4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3240 case NFA_ZOPEN5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3241 case NFA_ZOPEN6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3242 case NFA_ZOPEN7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3243 case NFA_ZOPEN8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3244 case NFA_ZOPEN9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3245 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3246 case NFA_ZSTART:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3247 if (state->c == NFA_ZSTART)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3248 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3249 subidx = 0;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3250 sub = &subs->norm;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3251 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3252 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3253 else if (state->c >= NFA_ZOPEN)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3254 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3255 subidx = state->c - NFA_ZOPEN;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3256 sub = &subs->synt;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3257 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3258 #endif
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3259 else
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3260 {
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3261 subidx = state->c - NFA_MOPEN;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3262 sub = &subs->norm;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3263 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3264
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3265 /* Set the position (with "off") in the subexpression. Save and
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3266 * restore it when it was in use. Otherwise fill any gap. */
4649
9f502d8d5165 updated for version 7.3.1072
Bram Moolenaar <bram@vim.org>
parents: 4647
diff changeset
3267 save_ptr = NULL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3268 if (REG_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3269 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3270 if (subidx < sub->in_use)
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3271 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3272 save_lpos = sub->list.multi[subidx].start;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3273 save_in_use = -1;
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3274 }
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3275 else
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3276 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3277 save_in_use = sub->in_use;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3278 for (i = sub->in_use; i < subidx; ++i)
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3279 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3280 sub->list.multi[i].start.lnum = -1;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3281 sub->list.multi[i].end.lnum = -1;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3282 }
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3283 sub->in_use = subidx + 1;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3284 }
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3285 if (off == -1)
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3286 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3287 sub->list.multi[subidx].start.lnum = reglnum + 1;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3288 sub->list.multi[subidx].start.col = 0;
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3289 }
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3290 else
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3291 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3292 sub->list.multi[subidx].start.lnum = reglnum;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3293 sub->list.multi[subidx].start.col =
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3294 (colnr_T)(reginput - regline + off);
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3295 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3296 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3297 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3298 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3299 if (subidx < sub->in_use)
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3300 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3301 save_ptr = sub->list.line[subidx].start;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3302 save_in_use = -1;
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3303 }
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3304 else
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3305 {
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3306 save_in_use = sub->in_use;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3307 for (i = sub->in_use; i < subidx; ++i)
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3308 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3309 sub->list.line[i].start = NULL;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3310 sub->list.line[i].end = NULL;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3311 }
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3312 sub->in_use = subidx + 1;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3313 }
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3314 sub->list.line[subidx].start = reginput + off;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3315 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3316
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3317 addstate(l, state->out, subs, off);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3318
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3319 if (save_in_use == -1)
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3320 {
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3321 if (REG_MULTI)
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3322 sub->list.multi[subidx].start = save_lpos;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3323 else
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3324 sub->list.line[subidx].start = save_ptr;
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3325 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3326 else
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3327 sub->in_use = save_in_use;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3328 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3329
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3330 case NFA_MCLOSE:
4553
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
3331 if (nfa_has_zend)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3332 {
4569
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
3333 /* Do not overwrite the position set by \ze. If no \ze
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
3334 * encountered end will be set in nfa_regtry(). */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3335 addstate(l, state->out, subs, off);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3336 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3337 }
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3338 case NFA_MCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3339 case NFA_MCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3340 case NFA_MCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3341 case NFA_MCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3342 case NFA_MCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3343 case NFA_MCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3344 case NFA_MCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3345 case NFA_MCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3346 case NFA_MCLOSE9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3347 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3348 case NFA_ZCLOSE:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3349 case NFA_ZCLOSE1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3350 case NFA_ZCLOSE2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3351 case NFA_ZCLOSE3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3352 case NFA_ZCLOSE4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3353 case NFA_ZCLOSE5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3354 case NFA_ZCLOSE6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3355 case NFA_ZCLOSE7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3356 case NFA_ZCLOSE8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3357 case NFA_ZCLOSE9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3358 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3359 case NFA_ZEND:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3360 if (state->c == NFA_ZEND)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3361 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3362 subidx = 0;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3363 sub = &subs->norm;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3364 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3365 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3366 else if (state->c >= NFA_ZCLOSE)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3367 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3368 subidx = state->c - NFA_ZCLOSE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3369 sub = &subs->synt;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3370 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3371 #endif
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3372 else
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3373 {
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3374 subidx = state->c - NFA_MCLOSE;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3375 sub = &subs->norm;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3376 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3377
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3378 /* We don't fill in gaps here, there must have been an MOPEN that
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3379 * has done that. */
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3380 save_in_use = sub->in_use;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3381 if (sub->in_use <= subidx)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3382 sub->in_use = subidx + 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3383 if (REG_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3384 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3385 save_lpos = sub->list.multi[subidx].end;
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3386 if (off == -1)
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3387 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3388 sub->list.multi[subidx].end.lnum = reglnum + 1;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3389 sub->list.multi[subidx].end.col = 0;
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3390 }
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3391 else
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3392 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3393 sub->list.multi[subidx].end.lnum = reglnum;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3394 sub->list.multi[subidx].end.col =
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3395 (colnr_T)(reginput - regline + off);
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3396 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3397 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3398 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3399 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3400 save_ptr = sub->list.line[subidx].end;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3401 sub->list.line[subidx].end = reginput + off;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3402 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3403
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3404 addstate(l, state->out, subs, off);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3405
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3406 if (REG_MULTI)
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3407 sub->list.multi[subidx].end = save_lpos;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3408 else
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3409 sub->list.line[subidx].end = save_ptr;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3410 sub->in_use = save_in_use;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3411 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3412 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3413 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3414
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3415 /*
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3416 * Like addstate(), but the new state(s) are put at position "*ip".
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3417 * Used for zero-width matches, next state to use is the added one.
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3418 * This makes sure the order of states to be tried does not change, which
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3419 * matters for alternatives.
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3420 */
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3421 static void
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3422 addstate_here(l, state, subs, ip)
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3423 nfa_list_T *l; /* runtime state list */
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3424 nfa_state_T *state; /* state to update */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3425 regsubs_T *subs; /* pointers to subexpressions */
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3426 int *ip;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3427 {
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3428 int tlen = l->n;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3429 int count;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3430 int i = *ip;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3431
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3432 /* first add the state(s) at the end, so that we know how many there are */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3433 addstate(l, state, subs, 0);
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3434
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3435 /* when "*ip" was at the end of the list, nothing to do */
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3436 if (i + 1 == tlen)
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3437 return;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3438
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3439 /* re-order to put the new state at the current position */
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3440 count = l->n - tlen;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3441 if (count == 1)
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3442 {
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3443 /* overwrite the current state */
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3444 l->t[i] = l->t[l->n - 1];
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3445 }
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3446 else if (count > 1)
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3447 {
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3448 /* make space for new states, then move them from the
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3449 * end to the current position */
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3450 mch_memmove(&(l->t[i + count]),
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3451 &(l->t[i + 1]),
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3452 sizeof(nfa_thread_T) * (l->n - i - 1));
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3453 mch_memmove(&(l->t[i]),
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3454 &(l->t[l->n - 1]),
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3455 sizeof(nfa_thread_T) * count);
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3456 }
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3457 --l->n;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3458 *ip = i - 1;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3459 }
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3460
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3461 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3462 * Check character class "class" against current character c.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3463 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3464 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3465 check_char_class(class, c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3466 int class;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3467 int c;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3468 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3469 switch (class)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3470 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3471 case NFA_CLASS_ALNUM:
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
3472 if (c >= 1 && c <= 255 && isalnum(c))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3473 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3474 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3475 case NFA_CLASS_ALPHA:
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
3476 if (c >= 1 && c <= 255 && isalpha(c))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3477 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3478 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3479 case NFA_CLASS_BLANK:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3480 if (c == ' ' || c == '\t')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3481 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3482 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3483 case NFA_CLASS_CNTRL:
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
3484 if (c >= 1 && c <= 255 && iscntrl(c))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3485 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3486 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3487 case NFA_CLASS_DIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3488 if (VIM_ISDIGIT(c))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3489 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3490 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3491 case NFA_CLASS_GRAPH:
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
3492 if (c >= 1 && c <= 255 && isgraph(c))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3493 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3494 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3495 case NFA_CLASS_LOWER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3496 if (MB_ISLOWER(c))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3497 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3498 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3499 case NFA_CLASS_PRINT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3500 if (vim_isprintc(c))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3501 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3502 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3503 case NFA_CLASS_PUNCT:
4464
c83656c9745a updated for version 7.3.980
Bram Moolenaar <bram@vim.org>
parents: 4462
diff changeset
3504 if (c >= 1 && c <= 255 && ispunct(c))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3505 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3506 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3507 case NFA_CLASS_SPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3508 if ((c >=9 && c <= 13) || (c == ' '))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3509 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3510 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3511 case NFA_CLASS_UPPER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3512 if (MB_ISUPPER(c))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3513 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3514 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3515 case NFA_CLASS_XDIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3516 if (vim_isxdigit(c))
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3517 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3518 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3519 case NFA_CLASS_TAB:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3520 if (c == '\t')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3521 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3522 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3523 case NFA_CLASS_RETURN:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3524 if (c == '\r')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3525 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3526 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3527 case NFA_CLASS_BACKSPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3528 if (c == '\b')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3529 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3530 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3531 case NFA_CLASS_ESCAPE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3532 if (c == '\033')
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3533 return OK;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3534 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3535
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3536 default:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3537 /* should not be here :P */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3538 EMSG_RET_FAIL(_("E877: (NFA regexp) Invalid character class "));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3539 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3540 return FAIL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3541 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3542
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3543 static int match_backref __ARGS((regsub_T *sub, int subidx, int *bytelen));
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3544
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3545 /*
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3546 * Check for a match with subexpression "subidx".
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3547 * Return TRUE if it matches.
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3548 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3549 static int
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3550 match_backref(sub, subidx, bytelen)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3551 regsub_T *sub; /* pointers to subexpressions */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3552 int subidx;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3553 int *bytelen; /* out: length of match in bytes */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3554 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3555 int len;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3556
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3557 if (sub->in_use <= subidx)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3558 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3559 retempty:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3560 /* backref was not set, match an empty string */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3561 *bytelen = 0;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3562 return TRUE;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3563 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3564
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3565 if (REG_MULTI)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3566 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3567 if (sub->list.multi[subidx].start.lnum < 0
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3568 || sub->list.multi[subidx].end.lnum < 0)
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3569 goto retempty;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3570 /* TODO: line breaks */
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3571 len = sub->list.multi[subidx].end.col
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3572 - sub->list.multi[subidx].start.col;
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3573 if (cstrncmp(regline + sub->list.multi[subidx].start.col,
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3574 reginput, &len) == 0)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3575 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3576 *bytelen = len;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3577 return TRUE;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3578 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3579 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3580 else
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3581 {
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3582 if (sub->list.line[subidx].start == NULL
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3583 || sub->list.line[subidx].end == NULL)
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3584 goto retempty;
4577
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3585 len = (int)(sub->list.line[subidx].end - sub->list.line[subidx].start);
b22bff1a6af8 updated for version 7.3.1036
Bram Moolenaar <bram@vim.org>
parents: 4573
diff changeset
3586 if (cstrncmp(sub->list.line[subidx].start, reginput, &len) == 0)
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3587 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3588 *bytelen = len;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3589 return TRUE;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3590 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3591 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3592 return FALSE;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3593 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3594
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3595 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3596
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3597 static int match_zref __ARGS((int subidx, int *bytelen));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3598
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3599 /*
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3600 * Check for a match with \z subexpression "subidx".
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3601 * Return TRUE if it matches.
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3602 */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3603 static int
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3604 match_zref(subidx, bytelen)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3605 int subidx;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3606 int *bytelen; /* out: length of match in bytes */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3607 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3608 int len;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3609
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3610 cleanup_zsubexpr();
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3611 if (re_extmatch_in == NULL || re_extmatch_in->matches[subidx] == NULL)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3612 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3613 /* backref was not set, match an empty string */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3614 *bytelen = 0;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3615 return TRUE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3616 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3617
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3618 len = (int)STRLEN(re_extmatch_in->matches[subidx]);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3619 if (cstrncmp(re_extmatch_in->matches[subidx], reginput, &len) == 0)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3620 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3621 *bytelen = len;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3622 return TRUE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3623 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3624 return FALSE;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3625 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3626 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3627
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3628 /*
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3629 * Save list IDs for all NFA states of "prog" into "list".
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3630 * Also reset the IDs to zero.
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3631 * Only used for the recursive value lastlist[1].
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3632 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3633 static void
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3634 nfa_save_listids(prog, list)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3635 nfa_regprog_T *prog;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3636 int *list;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3637 {
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3638 int i;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3639 nfa_state_T *p;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3640
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3641 /* Order in the list is reverse, it's a bit faster that way. */
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3642 p = &prog->state[0];
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3643 for (i = prog->nstate; --i >= 0; )
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3644 {
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3645 list[i] = p->lastlist[1];
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3646 p->lastlist[1] = 0;
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3647 ++p;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3648 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3649 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3650
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3651 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3652 * Restore list IDs from "list" to all NFA states.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3653 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3654 static void
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3655 nfa_restore_listids(prog, list)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3656 nfa_regprog_T *prog;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3657 int *list;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3658 {
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3659 int i;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3660 nfa_state_T *p;
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3661
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3662 p = &prog->state[0];
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3663 for (i = prog->nstate; --i >= 0; )
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3664 {
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3665 p->lastlist[1] = list[i];
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3666 ++p;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3667 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3668 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3669
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3670 static int
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3671 nfa_re_num_cmp(val, op, pos)
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3672 long_u val;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3673 int op;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3674 long_u pos;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3675 {
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3676 if (op == 1) return pos > val;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3677 if (op == 2) return pos < val;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3678 return val == pos;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3679 }
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3680
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3681 static int recursive_regmatch __ARGS((nfa_state_T *state, nfa_regprog_T *prog, regsubs_T *submatch, regsubs_T *m, int **listids));
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3682 static int nfa_regmatch __ARGS((nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *submatch, regsubs_T *m));
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3683
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3684 /*
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3685 * Recursively call nfa_regmatch()
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3686 */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3687 static int
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3688 recursive_regmatch(state, prog, submatch, m, listids)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3689 nfa_state_T *state;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3690 nfa_regprog_T *prog;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3691 regsubs_T *submatch;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3692 regsubs_T *m;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3693 int **listids;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3694 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3695 char_u *save_reginput = reginput;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3696 char_u *save_regline = regline;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3697 int save_reglnum = reglnum;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3698 int save_nfa_match = nfa_match;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3699 int save_nfa_listid = nfa_listid;
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3700 save_se_T *save_nfa_endp = nfa_endp;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3701 save_se_T endpos;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3702 save_se_T *endposp = NULL;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3703 int result;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3704 int need_restore = FALSE;
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3705
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3706 if (state->c == NFA_START_INVISIBLE_BEFORE)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3707 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3708 /* The recursive match must end at the current position. */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3709 endposp = &endpos;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3710 if (REG_MULTI)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3711 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3712 endpos.se_u.pos.col = (int)(reginput - regline);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3713 endpos.se_u.pos.lnum = reglnum;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3714 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3715 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3716 endpos.se_u.ptr = reginput;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3717
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3718 /* Go back the specified number of bytes, or as far as the
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3719 * start of the previous line, to try matching "\@<=" or
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3720 * not matching "\@<!".
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3721 * TODO: This is very inefficient! Would be better to
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3722 * first check for a match with what follows. */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3723 if (state->val <= 0)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3724 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3725 if (REG_MULTI)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3726 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3727 regline = reg_getline(--reglnum);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3728 if (regline == NULL)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3729 /* can't go before the first line */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3730 regline = reg_getline(++reglnum);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3731 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3732 reginput = regline;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3733 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3734 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3735 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3736 if (REG_MULTI && (int)(reginput - regline) < state->val)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3737 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3738 /* Not enough bytes in this line, go to end of
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3739 * previous line. */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3740 regline = reg_getline(--reglnum);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3741 if (regline == NULL)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3742 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3743 /* can't go before the first line */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3744 regline = reg_getline(++reglnum);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3745 reginput = regline;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3746 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3747 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3748 reginput = regline + STRLEN(regline);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3749 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3750 if ((int)(reginput - regline) >= state->val)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3751 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3752 reginput -= state->val;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3753 #ifdef FEAT_MBYTE
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3754 if (has_mbyte)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3755 reginput -= mb_head_off(regline, reginput);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3756 #endif
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3757 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3758 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3759 reginput = regline;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3760 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3761 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3762
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3763 #ifdef ENABLE_LOG
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3764 if (log_fd != stderr)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3765 fclose(log_fd);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3766 log_fd = NULL;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3767 #endif
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3768 /* Have to clear the lastlist field of the NFA nodes, so that
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3769 * nfa_regmatch() and addstate() can run properly after recursion. */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3770 if (nfa_ll_index == 1)
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3771 {
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3772 /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3773 * values and clear them. */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3774 if (*listids == NULL)
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3775 {
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3776 *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3777 if (*listids == NULL)
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3778 {
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3779 EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3780 return 0;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3781 }
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3782 }
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3783 nfa_save_listids(prog, *listids);
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3784 need_restore = TRUE;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3785 /* any value of nfa_listid will do */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3786 }
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3787 else
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3788 {
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3789 /* First recursive nfa_regmatch() call, switch to the second lastlist
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3790 * entry. Make sure nfa_listid is different from a previous recursive
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3791 * call, because some states may still have this ID. */
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3792 ++nfa_ll_index;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3793 if (nfa_listid <= nfa_alt_listid)
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3794 nfa_listid = nfa_alt_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3795 }
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3796
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3797 /* Call nfa_regmatch() to check if the current concat matches at this
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3798 * position. The concat ends with the node NFA_END_INVISIBLE */
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3799 nfa_endp = endposp;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3800 result = nfa_regmatch(prog, state->out, submatch, m);
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3801
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3802 if (need_restore)
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3803 nfa_restore_listids(prog, *listids);
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3804 else
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3805 {
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3806 --nfa_ll_index;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3807 nfa_alt_listid = nfa_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3808 }
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3809
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3810 /* restore position in input text */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3811 reginput = save_reginput;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3812 regline = save_regline;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3813 reglnum = save_reglnum;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3814 nfa_match = save_nfa_match;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3815 nfa_endp = save_nfa_endp;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3816 nfa_listid = save_nfa_listid;
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3817
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3818 #ifdef ENABLE_LOG
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3819 log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3820 if (log_fd != NULL)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3821 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3822 fprintf(log_fd, "****************************\n");
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3823 fprintf(log_fd, "FINISHED RUNNING nfa_regmatch() recursively\n");
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3824 fprintf(log_fd, "MATCH = %s\n", result == TRUE ? "OK" : "FALSE");
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3825 fprintf(log_fd, "****************************\n");
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3826 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3827 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3828 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3829 EMSG(_("Could not open temporary log file for writing, displaying on stderr ... "));
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3830 log_fd = stderr;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3831 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3832 #endif
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3833
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3834 return result;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3835 }
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3836
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
3837 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3838 * Main matching routine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3839 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3840 * Run NFA to determine whether it matches reginput.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3841 *
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
3842 * When "nfa_endp" is not NULL it is a required end-of-match position.
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
3843 *
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3844 * Return TRUE if there is a match, FALSE otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3845 * Note: Caller must ensure that: start != NULL.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3846 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3847 static int
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3848 nfa_regmatch(prog, start, submatch, m)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
3849 nfa_regprog_T *prog;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3850 nfa_state_T *start;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3851 regsubs_T *submatch;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3852 regsubs_T *m;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3853 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3854 int result;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3855 int size = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3856 int flag = 0;
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3857 int go_to_nextline = FALSE;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3858 nfa_thread_T *t;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3859 nfa_list_T list[3];
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3860 nfa_list_T *listtbl[2][2];
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3861 nfa_list_T *ll;
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3862 int listidx;
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3863 nfa_list_T *thislist;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3864 nfa_list_T *nextlist;
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3865 nfa_list_T *neglist;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3866 int *listids = NULL;
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4458
diff changeset
3867 #ifdef NFA_REGEXP_DEBUG_LOG
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
3868 FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3869
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3870 if (debug == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3871 {
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
3872 EMSG2(_("(NFA) COULD NOT OPEN %s !"), NFA_REGEXP_DEBUG_LOG);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3873 return FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3874 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3875 #endif
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
3876 nfa_match = FALSE;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3877
4563
e7016af0cbf9 updated for version 7.3.1029
Bram Moolenaar <bram@vim.org>
parents: 4561
diff changeset
3878 /* Allocate memory for the lists of nodes. */
4539
532c2e850256 updated for version 7.3.1017
Bram Moolenaar <bram@vim.org>
parents: 4537
diff changeset
3879 size = (nstate + 1) * sizeof(nfa_thread_T);
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3880 list[0].t = (nfa_thread_T *)lalloc_clear(size, TRUE);
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3881 list[0].len = nstate + 1;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3882 list[1].t = (nfa_thread_T *)lalloc_clear(size, TRUE);
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3883 list[1].len = nstate + 1;
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3884 list[2].t = (nfa_thread_T *)lalloc_clear(size, TRUE);
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
3885 list[2].len = nstate + 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3886 if (list[0].t == NULL || list[1].t == NULL || list[2].t == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3887 goto theend;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3888
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3889 #ifdef ENABLE_LOG
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
3890 log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3891 if (log_fd != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3892 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3893 fprintf(log_fd, "**********************************\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3894 nfa_set_code(start->c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3895 fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n",
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3896 abs(start->id), code);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3897 fprintf(log_fd, "**********************************\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3898 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3899 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3900 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3901 EMSG(_("Could not open temporary log file for writing, displaying on stderr ... "));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3902 log_fd = stderr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3903 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3904 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3905
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3906 thislist = &list[0];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3907 thislist->n = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3908 nextlist = &list[1];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3909 nextlist->n = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3910 neglist = &list[2];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3911 neglist->n = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3912 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3913 fprintf(log_fd, "(---) STARTSTATE\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3914 #endif
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3915 thislist->id = nfa_listid + 1;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3916 addstate(thislist, start, m, 0);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3917
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3918 /* There are two cases when the NFA advances: 1. input char matches the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3919 * NFA node and 2. input char does not match the NFA node, but the next
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3920 * node is NFA_NOT. The following macro calls addstate() according to
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3921 * these rules. It is used A LOT, so use the "listtbl" table for speed */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3922 listtbl[0][0] = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3923 listtbl[0][1] = neglist;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3924 listtbl[1][0] = nextlist;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3925 listtbl[1][1] = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3926 #define ADD_POS_NEG_STATE(node) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3927 ll = listtbl[result ? 1 : 0][node->negated]; \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3928 if (ll != NULL) \
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
3929 addstate(ll, node->out , &t->subs, clen);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3930
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3931
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3932 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3933 * Run for each character.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3934 */
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3935 for (;;)
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3936 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3937 int curc;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3938 int clen;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3939
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3940 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3941 if (has_mbyte)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3942 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3943 curc = (*mb_ptr2char)(reginput);
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3944 clen = (*mb_ptr2len)(reginput);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3945 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3946 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3947 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3948 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3949 curc = *reginput;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3950 clen = 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3951 }
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3952 if (curc == NUL)
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3953 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3954 clen = 0;
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3955 go_to_nextline = FALSE;
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
3956 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3957
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3958 /* swap lists */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3959 thislist = &list[flag];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3960 nextlist = &list[flag ^= 1];
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
3961 nextlist->n = 0; /* clear nextlist */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3962 listtbl[1][0] = nextlist;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3963 ++nfa_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3964 thislist->id = nfa_listid;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3965 nextlist->id = nfa_listid + 1;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
3966 neglist->id = nfa_listid + 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3967
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3968 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3969 fprintf(log_fd, "------------------------------------------\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3970 fprintf(log_fd, ">>> Reginput is \"%s\"\n", reginput);
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3971 fprintf(log_fd, ">>> Advanced one character ... Current char is %c (code %d) \n", curc, (int)curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3972 fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3973 {
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3974 int i;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3975
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3976 for (i = 0; i < thislist->n; i++)
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3977 fprintf(log_fd, "%d ", abs(thislist->t[i].state->id));
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3978 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3979 fprintf(log_fd, "\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3980 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3981
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4458
diff changeset
3982 #ifdef NFA_REGEXP_DEBUG_LOG
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3983 fprintf(debug, "\n-------------------\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3984 #endif
4480
035fb0d5e7ce updated for version 7.3.988
Bram Moolenaar <bram@vim.org>
parents: 4470
diff changeset
3985 /*
035fb0d5e7ce updated for version 7.3.988
Bram Moolenaar <bram@vim.org>
parents: 4470
diff changeset
3986 * If the state lists are empty we can stop.
035fb0d5e7ce updated for version 7.3.988
Bram Moolenaar <bram@vim.org>
parents: 4470
diff changeset
3987 */
035fb0d5e7ce updated for version 7.3.988
Bram Moolenaar <bram@vim.org>
parents: 4470
diff changeset
3988 if (thislist->n == 0 && neglist->n == 0)
035fb0d5e7ce updated for version 7.3.988
Bram Moolenaar <bram@vim.org>
parents: 4470
diff changeset
3989 break;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3990
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3991 /* compute nextlist */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3992 for (listidx = 0; listidx < thislist->n || neglist->n > 0; ++listidx)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3993 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3994 if (neglist->n > 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3995 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3996 t = &neglist->t[0];
4468
dde1cf311be6 updated for version 7.3.982
Bram Moolenaar <bram@vim.org>
parents: 4464
diff changeset
3997 neglist->n--;
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
3998 listidx--;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3999 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4000 else
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4001 t = &thislist->t[listidx];
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4002
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4458
diff changeset
4003 #ifdef NFA_REGEXP_DEBUG_LOG
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4004 nfa_set_code(t->state->c);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4005 fprintf(debug, "%s, ", code);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4006 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4007 #ifdef ENABLE_LOG
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4008 {
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4009 int col;
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4010
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4011 if (t->subs.norm.in_use <= 0)
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4012 col = -1;
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4013 else if (REG_MULTI)
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4014 col = t->subs.norm.list.multi[0].start.col;
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4015 else
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4016 col = (int)(t->subs.norm.list.line[0].start - regline);
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4017 nfa_set_code(t->state->c);
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4018 fprintf(log_fd, "(%d) char %d %s (start col %d) ... \n",
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4019 abs(t->state->id), (int)t->state->c, code, col);
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4020 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4021 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4022
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4023 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4024 * Handle the possible codes of the current state.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4025 * The most important is NFA_MATCH.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4026 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4027 switch (t->state->c)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4028 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4029 case NFA_MATCH:
4567
96c1a7850097 updated for version 7.3.1031
Bram Moolenaar <bram@vim.org>
parents: 4565
diff changeset
4030 {
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
4031 nfa_match = TRUE;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4032 copy_sub(&submatch->norm, &t->subs.norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4033 #ifdef FEAT_SYN_HL
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4034 if (nfa_has_zsubexpr)
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4035 copy_sub(&submatch->synt, &t->subs.synt);
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4036 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4037 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4038 log_subsexpr(&t->subs);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4039 #endif
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4040 /* Found the left-most longest match, do not look at any other
4553
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4041 * states at this position. When the list of states is going
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4042 * to be empty quit without advancing, so that "reginput" is
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4043 * correct. */
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4044 if (nextlist->n == 0 && neglist->n == 0)
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4045 clen = 0;
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4046 goto nextchar;
4567
96c1a7850097 updated for version 7.3.1031
Bram Moolenaar <bram@vim.org>
parents: 4565
diff changeset
4047 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4048
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4049 case NFA_END_INVISIBLE:
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4050 /*
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4051 * This is only encountered after a NFA_START_INVISIBLE or
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4052 * NFA_START_INVISIBLE_BEFORE node.
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4053 * They surround a zero-width group, used with "\@=", "\&",
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4054 * "\@!", "\@<=" and "\@<!".
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4055 * If we got here, it means that the current "invisible" group
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4056 * finished successfully, so return control to the parent
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4057 * nfa_regmatch(). For a look-behind match only when it ends
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4058 * in the position in "nfa_endp".
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4059 * Submatches are stored in *m, and used in the parent call.
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4060 */
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4061 #ifdef ENABLE_LOG
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4062 if (nfa_endp != NULL)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4063 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4064 if (REG_MULTI)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4065 fprintf(log_fd, "Current lnum: %d, endp lnum: %d; current col: %d, endp col: %d\n",
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4066 (int)reglnum,
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4067 (int)nfa_endp->se_u.pos.lnum,
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4068 (int)(reginput - regline),
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4069 nfa_endp->se_u.pos.col);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4070 else
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4071 fprintf(log_fd, "Current col: %d, endp col: %d\n",
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4072 (int)(reginput - regline),
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4073 (int)(nfa_endp->se_u.ptr - reginput));
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4074 }
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4075 #endif
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4076 /* It's only a match if it ends at "nfa_endp" */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4077 if (nfa_endp != NULL && (REG_MULTI
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4078 ? (reglnum != nfa_endp->se_u.pos.lnum
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4079 || (int)(reginput - regline)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4080 != nfa_endp->se_u.pos.col)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4081 : reginput != nfa_endp->se_u.ptr))
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4082 break;
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4083
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4084 /* do not set submatches for \@! */
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4085 if (!t->state->negated)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4086 {
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4087 copy_sub(&m->norm, &t->subs.norm);
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4088 #ifdef FEAT_SYN_HL
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4089 if (nfa_has_zsubexpr)
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4090 copy_sub(&m->synt, &t->subs.synt);
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4091 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4092 }
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4093 nfa_match = TRUE;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4094 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4095
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4096 case NFA_START_INVISIBLE:
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4097 case NFA_START_INVISIBLE_BEFORE:
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4098 result = recursive_regmatch(t->state, prog, submatch, m,
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4099 &listids);
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4100
4661
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
4101 /* for \@! it is a match when result is FALSE */
0dce3d812e7a updated for version 7.3.1078
Bram Moolenaar <bram@vim.org>
parents: 4657
diff changeset
4102 if (result != t->state->negated)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4103 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4104 /* Copy submatch info from the recursive call */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4105 copy_sub_off(&t->subs.norm, &m->norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4106 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4107 copy_sub_off(&t->subs.synt, &m->synt);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4108 #endif
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4109
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4110 /* t->state->out1 is the corresponding END_INVISIBLE node;
4716
a804309e7327 updated for version 7.3.1105
Bram Moolenaar <bram@vim.org>
parents: 4714
diff changeset
4111 * Add its out to the current list (zero-width match). */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4112 addstate_here(thislist, t->state->out1->out, &t->subs,
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4113 &listidx);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4114 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4115 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4116
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4117 case NFA_BOL:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4118 if (reginput == regline)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4119 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4120 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4121
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4122 case NFA_EOL:
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4123 if (curc == NUL)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4124 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4125 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4126
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4127 case NFA_BOW:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4128 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4129 int bow = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4130
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4131 if (curc == NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4132 bow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4133 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4134 else if (has_mbyte)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4135 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4136 int this_class;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4137
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4138 /* Get class of current and previous char (if it exists). */
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4139 this_class = mb_get_class_buf(reginput, reg_buf);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4140 if (this_class <= 1)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4141 bow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4142 else if (reg_prev_class() == this_class)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4143 bow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4144 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4145 #endif
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4146 else if (!vim_iswordc_buf(curc, reg_buf)
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4147 || (reginput > regline
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4148 && vim_iswordc_buf(reginput[-1], reg_buf)))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4149 bow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4150 if (bow)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4151 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4152 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4153 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4154
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4155 case NFA_EOW:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4156 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4157 int eow = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4158
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4159 if (reginput == regline)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4160 eow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4161 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4162 else if (has_mbyte)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4163 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4164 int this_class, prev_class;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4165
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4166 /* Get class of current and previous char (if it exists). */
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4167 this_class = mb_get_class_buf(reginput, reg_buf);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4168 prev_class = reg_prev_class();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4169 if (this_class == prev_class
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4170 || prev_class == 0 || prev_class == 1)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4171 eow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4172 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4173 #endif
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4174 else if (!vim_iswordc_buf(reginput[-1], reg_buf)
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4175 || (reginput[0] != NUL
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4176 && vim_iswordc_buf(curc, reg_buf)))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4177 eow = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4178 if (eow)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4179 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4180 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4181 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4182
4671
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4183 case NFA_BOF:
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4184 if (reglnum == 0 && reginput == regline
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4185 && (!REG_MULTI || reg_firstlnum == 1))
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4186 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4671
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4187 break;
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4188
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4189 case NFA_EOF:
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4190 if (reglnum == reg_maxline && curc == NUL)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4191 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4671
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4192 break;
b3c59716e700 updated for version 7.3.1083
Bram Moolenaar <bram@vim.org>
parents: 4669
diff changeset
4193
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4194 #ifdef FEAT_MBYTE
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4195 case NFA_COMPOSING:
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4196 {
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4197 int mc = curc;
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
4198 int len = 0;
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
4199 nfa_state_T *end;
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
4200 nfa_state_T *sta;
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4201 int cchars[MAX_MCO];
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4202 int ccount = 0;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4203 int j;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4204
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4205 sta = t->state->out;
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4206 len = 0;
4535
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4207 if (utf_iscomposing(sta->c))
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4208 {
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4209 /* Only match composing character(s), ignore base
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4210 * character. Used for ".{composing}" and "{composing}"
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4211 * (no preceding character). */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4212 len += mb_char2len(mc);
4535
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4213 }
4551
f0c37f5cf4ea updated for version 7.3.1023
Bram Moolenaar <bram@vim.org>
parents: 4549
diff changeset
4214 if (ireg_icombine && len == 0)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4215 {
4535
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4216 /* If \Z was present, then ignore composing characters.
45f97c349537 updated for version 7.3.1015
Bram Moolenaar <bram@vim.org>
parents: 4533
diff changeset
4217 * When ignoring the base character this always matches. */
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4218 /* TODO: How about negated? */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4219 if (len == 0 && sta->c != curc)
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4220 result = FAIL;
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4221 else
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4222 result = OK;
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4223 while (sta->c != NFA_END_COMPOSING)
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4224 sta = sta->out;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4225 }
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4226
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4227 /* Check base character matches first, unless ignored. */
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4228 else if (len > 0 || mc == sta->c)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4229 {
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4230 if (len == 0)
4529
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4231 {
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4232 len += mb_char2len(mc);
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4233 sta = sta->out;
432a6b8c7d93 updated for version 7.3.1012
Bram Moolenaar <bram@vim.org>
parents: 4527
diff changeset
4234 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4235
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4236 /* We don't care about the order of composing characters.
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4237 * Get them into cchars[] first. */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4238 while (len < clen)
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4239 {
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4240 mc = mb_ptr2char(reginput + len);
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4241 cchars[ccount++] = mc;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4242 len += mb_char2len(mc);
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4243 if (ccount == MAX_MCO)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4244 break;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4245 }
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4246
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4247 /* Check that each composing char in the pattern matches a
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4248 * composing char in the text. We do not check if all
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4249 * composing chars are matched. */
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4250 result = OK;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4251 while (sta->c != NFA_END_COMPOSING)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4252 {
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4253 for (j = 0; j < ccount; ++j)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4254 if (cchars[j] == sta->c)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4255 break;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4256 if (j == ccount)
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4257 {
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4258 result = FAIL;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4259 break;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4260 }
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4261 sta = sta->out;
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4262 }
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4263 }
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4264 else
4525
36ddcf4cecbc updated for version 7.3.1010
Bram Moolenaar <bram@vim.org>
parents: 4517
diff changeset
4265 result = FAIL;
4547
fc997f05cbc7 updated for version 7.3.1021
Bram Moolenaar <bram@vim.org>
parents: 4543
diff changeset
4266
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4267 end = t->state->out1; /* NFA_END_COMPOSING */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4268 ADD_POS_NEG_STATE(end);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4269 break;
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4270 }
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4271 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4272
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4273 case NFA_NEWL:
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4274 if (curc == NUL && !reg_line_lbr && REG_MULTI
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4275 && reglnum <= reg_maxline)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4276 {
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4277 go_to_nextline = TRUE;
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4278 /* Pass -1 for the offset, which means taking the position
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4279 * at the start of the next line. */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4280 addstate(nextlist, t->state->out, &t->subs, -1);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4281 }
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4282 else if (curc == '\n' && reg_line_lbr)
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4283 {
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4284 /* match \n as if it is an ordinary character */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4285 addstate(nextlist, t->state->out, &t->subs, 1);
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4286 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4287 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4288
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4289 case NFA_CLASS_ALNUM:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4290 case NFA_CLASS_ALPHA:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4291 case NFA_CLASS_BLANK:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4292 case NFA_CLASS_CNTRL:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4293 case NFA_CLASS_DIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4294 case NFA_CLASS_GRAPH:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4295 case NFA_CLASS_LOWER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4296 case NFA_CLASS_PRINT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4297 case NFA_CLASS_PUNCT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4298 case NFA_CLASS_SPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4299 case NFA_CLASS_UPPER:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4300 case NFA_CLASS_XDIGIT:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4301 case NFA_CLASS_TAB:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4302 case NFA_CLASS_RETURN:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4303 case NFA_CLASS_BACKSPACE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4304 case NFA_CLASS_ESCAPE:
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4305 result = check_char_class(t->state->c, curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4306 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4307 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4308
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4309 case NFA_END_NEG_RANGE:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4310 /* This follows a series of negated nodes, like:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4311 * CHAR(x), NFA_NOT, CHAR(y), NFA_NOT etc. */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4312 if (curc > 0)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4313 addstate(nextlist, t->state->out, &t->subs, clen);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4314 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4315
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4316 case NFA_ANY:
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4317 /* Any char except '\0', (end of input) does not match. */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4318 if (curc > 0)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4319 addstate(nextlist, t->state->out, &t->subs, clen);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4320 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4321
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4322 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4323 * Character classes like \a for alpha, \d for digit etc.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4324 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4325 case NFA_IDENT: /* \i */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4326 result = vim_isIDc(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4327 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4328 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4329
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4330 case NFA_SIDENT: /* \I */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4331 result = !VIM_ISDIGIT(curc) && vim_isIDc(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4332 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4333 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4334
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4335 case NFA_KWORD: /* \k */
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
4336 result = vim_iswordp_buf(reginput, reg_buf);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4337 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4338 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4339
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4340 case NFA_SKWORD: /* \K */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4341 result = !VIM_ISDIGIT(curc)
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4342 && vim_iswordp_buf(reginput, reg_buf);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4343 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4344 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4345
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4346 case NFA_FNAME: /* \f */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4347 result = vim_isfilec(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4348 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4349 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4350
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4351 case NFA_SFNAME: /* \F */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4352 result = !VIM_ISDIGIT(curc) && vim_isfilec(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4353 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4354 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4355
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4356 case NFA_PRINT: /* \p */
4470
ab5154170c3d updated for version 7.3.983
Bram Moolenaar <bram@vim.org>
parents: 4468
diff changeset
4357 result = ptr2cells(reginput) == 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4358 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4359 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4360
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4361 case NFA_SPRINT: /* \P */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4362 result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4363 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4364 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4365
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4366 case NFA_WHITE: /* \s */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4367 result = vim_iswhite(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4368 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4369 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4370
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4371 case NFA_NWHITE: /* \S */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4372 result = curc != NUL && !vim_iswhite(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4373 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4374 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4375
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4376 case NFA_DIGIT: /* \d */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4377 result = ri_digit(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4378 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4379 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4380
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4381 case NFA_NDIGIT: /* \D */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4382 result = curc != NUL && !ri_digit(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4383 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4384 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4385
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4386 case NFA_HEX: /* \x */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4387 result = ri_hex(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4388 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4389 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4390
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4391 case NFA_NHEX: /* \X */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4392 result = curc != NUL && !ri_hex(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4393 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4394 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4395
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4396 case NFA_OCTAL: /* \o */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4397 result = ri_octal(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4398 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4399 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4400
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4401 case NFA_NOCTAL: /* \O */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4402 result = curc != NUL && !ri_octal(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4403 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4404 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4405
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4406 case NFA_WORD: /* \w */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4407 result = ri_word(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4408 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4409 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4410
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4411 case NFA_NWORD: /* \W */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4412 result = curc != NUL && !ri_word(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4413 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4414 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4415
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4416 case NFA_HEAD: /* \h */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4417 result = ri_head(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4418 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4419 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4420
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4421 case NFA_NHEAD: /* \H */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4422 result = curc != NUL && !ri_head(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4423 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4424 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4425
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4426 case NFA_ALPHA: /* \a */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4427 result = ri_alpha(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4428 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4429 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4430
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4431 case NFA_NALPHA: /* \A */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4432 result = curc != NUL && !ri_alpha(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4433 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4434 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4435
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4436 case NFA_LOWER: /* \l */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4437 result = ri_lower(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4438 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4439 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4440
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4441 case NFA_NLOWER: /* \L */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4442 result = curc != NUL && !ri_lower(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4443 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4444 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4445
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4446 case NFA_UPPER: /* \u */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4447 result = ri_upper(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4448 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4449 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4450
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4451 case NFA_NUPPER: /* \U */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4452 result = curc != NUL && !ri_upper(curc);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4453 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4454 break;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4455
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4456 case NFA_BACKREF1:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4457 case NFA_BACKREF2:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4458 case NFA_BACKREF3:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4459 case NFA_BACKREF4:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4460 case NFA_BACKREF5:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4461 case NFA_BACKREF6:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4462 case NFA_BACKREF7:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4463 case NFA_BACKREF8:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4464 case NFA_BACKREF9:
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4465 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4466 case NFA_ZREF1:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4467 case NFA_ZREF2:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4468 case NFA_ZREF3:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4469 case NFA_ZREF4:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4470 case NFA_ZREF5:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4471 case NFA_ZREF6:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4472 case NFA_ZREF7:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4473 case NFA_ZREF8:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4474 case NFA_ZREF9:
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4475 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4476 /* \1 .. \9 \z1 .. \z9 */
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4477 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4478 int subidx;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4479 int bytelen;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4480
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4481 if (t->state->c <= NFA_BACKREF9)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4482 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4483 subidx = t->state->c - NFA_BACKREF1 + 1;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4484 result = match_backref(&t->subs.norm, subidx, &bytelen);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4485 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4486 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4487 else
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4488 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4489 subidx = t->state->c - NFA_ZREF1 + 1;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4490 result = match_zref(subidx, &bytelen);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4491 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4492 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4493
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4494 if (result)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4495 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4496 if (bytelen == 0)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4497 {
4692
08fbb1ce1bc5 updated for version 7.3.1093
Bram Moolenaar <bram@vim.org>
parents: 4690
diff changeset
4498 /* empty match always works, output of NFA_SKIP to be
08fbb1ce1bc5 updated for version 7.3.1093
Bram Moolenaar <bram@vim.org>
parents: 4690
diff changeset
4499 * used next */
08fbb1ce1bc5 updated for version 7.3.1093
Bram Moolenaar <bram@vim.org>
parents: 4690
diff changeset
4500 addstate_here(thislist, t->state->out->out, &t->subs,
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4501 &listidx);
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4502 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4503 else if (bytelen <= clen)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4504 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4505 /* match current character, jump ahead to out of
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4506 * NFA_SKIP */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4507 addstate(nextlist, t->state->out->out, &t->subs, clen);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4508 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4509 log_subsexpr(&nextlist->t[nextlist->n - 1].subs);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4510 #endif
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4511 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4512 else
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4513 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4514 /* skip ofer the matched characters, set character
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4515 * count in NFA_SKIP */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4516 addstate(nextlist, t->state->out, &t->subs, bytelen);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4517 nextlist->t[nextlist->n - 1].count = bytelen - clen;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4518 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4519 log_subsexpr(&nextlist->t[nextlist->n - 1].subs);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4520 #endif
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4521 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4522
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4523 }
4482
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4524 break;
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4525 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4526 case NFA_SKIP:
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4527 /* charater of previous matching \1 .. \9 */
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4528 if (t->count - clen <= 0)
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4529 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4530 /* end of match, go to what follows */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4531 addstate(nextlist, t->state->out, &t->subs, clen);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4532 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4533 log_subsexpr(&nextlist->t[nextlist->n - 1].subs);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4534 #endif
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4535 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4536 else
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4537 {
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4538 /* add state again with decremented count */
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4539 addstate(nextlist, t->state, &t->subs, 0);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4540 nextlist->t[nextlist->n - 1].count = t->count - clen;
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4541 #ifdef ENABLE_LOG
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4542 log_subsexpr(&nextlist->t[nextlist->n - 1].subs);
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4543 #endif
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4544 }
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4545 break;
4482
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4546
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4547 case NFA_SKIP_CHAR:
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4548 case NFA_ZSTART:
4569
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
4549 case NFA_ZEND:
4482
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4550 /* TODO: should not happen? */
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4551 break;
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4552
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4553 case NFA_LNUM:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4554 case NFA_LNUM_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4555 case NFA_LNUM_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4556 result = (REG_MULTI &&
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4557 nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4558 (long_u)(reglnum + reg_firstlnum)));
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4559 if (result)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4560 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4561 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4562
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4563 case NFA_COL:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4564 case NFA_COL_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4565 case NFA_COL_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4566 result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4567 (long_u)(reginput - regline) + 1);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4568 if (result)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4569 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4570 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4571
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4572 case NFA_VCOL:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4573 case NFA_VCOL_GT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4574 case NFA_VCOL_LT:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4575 result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_VCOL,
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4576 (long_u)win_linetabsize(
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4577 reg_win == NULL ? curwin : reg_win,
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4578 regline, (colnr_T)(reginput - regline)) + 1);
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4579 if (result)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4580 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4581 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4582
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4583 case NFA_CURSOR:
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4584 result = (reg_win != NULL
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4585 && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum)
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4586 && ((colnr_T)(reginput - regline)
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4587 == reg_win->w_cursor.col));
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4588 if (result)
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4589 addstate_here(thislist, t->state->out, &t->subs, &listidx);
4583
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4590 break;
321cfbef9431 updated for version 7.3.1039
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
4591
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4592 default: /* regular character */
4559
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4593 {
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4594 int c = t->state->c;
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4595
4482
cd005ab15ef3 updated for version 7.3.989
Bram Moolenaar <bram@vim.org>
parents: 4480
diff changeset
4596 /* TODO: put this in #ifdef later */
4559
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4597 if (c < -256)
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4598 EMSGN("INTERNAL: Negative state char: %ld", c);
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4599 if (is_Magic(c))
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4600 c = un_Magic(c);
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4601 result = (c == curc);
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4602
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4603 if (!result && ireg_ic)
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4604 result = MB_TOLOWER(c) == MB_TOLOWER(curc);
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4605 #ifdef FEAT_MBYTE
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4606 /* If there is a composing character which is not being
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4607 * ignored there can be no match. Match with composing
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4608 * character uses NFA_COMPOSING above. */
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4609 if (result && enc_utf8 && !ireg_icombine
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4610 && clen != utf_char2len(curc))
4527
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4611 result = FALSE;
55bcaa1d2749 updated for version 7.3.1011
Bram Moolenaar <bram@vim.org>
parents: 4525
diff changeset
4612 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4613 ADD_POS_NEG_STATE(t->state);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4614 break;
4559
04086e297563 updated for version 7.3.1027
Bram Moolenaar <bram@vim.org>
parents: 4557
diff changeset
4615 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4616 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4617
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4618 } /* for (thislist = thislist; thislist->state; thislist++) */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4619
4557
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4620 /* Look for the start of a match in the current position by adding the
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4621 * start state to the list of states.
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4622 * The first found match is the leftmost one, thus the order of states
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4623 * matters!
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4624 * Do not add the start state in recursive calls of nfa_regmatch(),
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4625 * because recursive calls should only start in the first position.
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4626 * Unless "nfa_endp" is not NULL, then we match the end position.
4557
888c12c899e5 updated for version 7.3.1026
Bram Moolenaar <bram@vim.org>
parents: 4555
diff changeset
4627 * Also don't start a match past the first line. */
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4628 if (nfa_match == FALSE
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4629 && ((start->c == NFA_MOPEN
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4630 && reglnum == 0
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4631 && clen != 0
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4632 && (ireg_maxcol == 0
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4633 || (colnr_T)(reginput - regline) < ireg_maxcol))
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4634 || (nfa_endp != NULL
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4635 && (REG_MULTI
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4636 ? (reglnum < nfa_endp->se_u.pos.lnum
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4637 || (reglnum == nfa_endp->se_u.pos.lnum
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
4638 && (int)(reginput - regline)
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4639 < nfa_endp->se_u.pos.col))
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4640 : reginput < nfa_endp->se_u.ptr))))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4641 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4642 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4643 fprintf(log_fd, "(---) STARTSTATE\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4644 #endif
4571
b2a8e3a66f8c updated for version 7.3.1033
Bram Moolenaar <bram@vim.org>
parents: 4569
diff changeset
4645 addstate(nextlist, start, m, clen);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4646 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4647
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4648 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4649 fprintf(log_fd, ">>> Thislist had %d states available: ", thislist->n);
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4650 {
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4651 int i;
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4652
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4653 for (i = 0; i < thislist->n; i++)
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4654 fprintf(log_fd, "%d ", abs(thislist->t[i].state->id));
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4655 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4656 fprintf(log_fd, "\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4657 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4658
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4659 nextchar:
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4660 /* Advance to the next character, or advance to the next line, or
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4661 * finish. */
4549
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4662 if (clen != 0)
849180347ac3 updated for version 7.3.1022
Bram Moolenaar <bram@vim.org>
parents: 4547
diff changeset
4663 reginput += clen;
4694
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4664 else if (go_to_nextline || (nfa_endp != NULL && REG_MULTI
efc4fb311d5d updated for version 7.3.1094
Bram Moolenaar <bram@vim.org>
parents: 4692
diff changeset
4665 && reglnum < nfa_endp->se_u.pos.lnum))
4515
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4666 reg_nextline();
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4667 else
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4668 break;
90e9917d4114 updated for version 7.3.1005
Bram Moolenaar <bram@vim.org>
parents: 4507
diff changeset
4669 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4670
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4671 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4672 if (log_fd != stderr)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4673 fclose(log_fd);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4674 log_fd = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4675 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4676
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4677 theend:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4678 /* Free memory */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4679 vim_free(list[0].t);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4680 vim_free(list[1].t);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4681 vim_free(list[2].t);
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
4682 vim_free(listids);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4683 #undef ADD_POS_NEG_STATE
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4458
diff changeset
4684 #ifdef NFA_REGEXP_DEBUG_LOG
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4685 fclose(debug);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4686 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4687
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
4688 return nfa_match;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4689 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4690
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4691 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4692 * Try match of "prog" with at regline["col"].
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4693 * Returns 0 for failure, number of lines contained in the match otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4694 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4695 static long
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4696 nfa_regtry(prog, col)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4697 nfa_regprog_T *prog;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4698 colnr_T col;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4699 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4700 int i;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4701 regsubs_T subs, m;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4702 nfa_state_T *start = prog->start;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4703 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4704 FILE *f;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4705 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4706
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4707 reginput = regline + col;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4708 need_clear_subexpr = TRUE;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4709 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4710 /* Clear the external match subpointers if necessary. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4711 if (prog->reghasz == REX_SET)
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4712 {
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4713 nfa_has_zsubexpr = TRUE;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4714 need_clear_zsubexpr = TRUE;
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4715 }
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4716 else
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4717 nfa_has_zsubexpr = FALSE;
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4718 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4719
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4720 #ifdef ENABLE_LOG
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
4721 f = fopen(NFA_REGEXP_RUN_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4722 if (f != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4723 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4724 fprintf(f, "\n\n\n\n\n\n\t\t=======================================================\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4725 fprintf(f, " =======================================================\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4726 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4727 fprintf(f, "\tRegexp is \"%s\"\n", nfa_regengine.expr);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4728 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4729 fprintf(f, "\tInput text is \"%s\" \n", reginput);
4657
93b7ed814bec updated for version 7.3.1076
Bram Moolenaar <bram@vim.org>
parents: 4655
diff changeset
4730 fprintf(f, " =======================================================\n\n");
4533
6a2005efa02b updated for version 7.3.1014
Bram Moolenaar <bram@vim.org>
parents: 4531
diff changeset
4731 nfa_print_state(f, start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4732 fprintf(f, "\n\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4733 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4734 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4735 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4736 EMSG(_("Could not open temporary log file for writing "));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4737 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4738
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4739 clear_sub(&subs.norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4740 clear_sub(&m.norm);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4741 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4742 clear_sub(&subs.synt);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4743 clear_sub(&m.synt);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4744 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4745
4712
832bf8136d86 updated for version 7.3.1103
Bram Moolenaar <bram@vim.org>
parents: 4696
diff changeset
4746 if (nfa_regmatch(prog, start, &subs, &m) == FALSE)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4747 return 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4748
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4749 cleanup_subexpr();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4750 if (REG_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4751 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4752 for (i = 0; i < subs.norm.in_use; i++)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4753 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4754 reg_startpos[i] = subs.norm.list.multi[i].start;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4755 reg_endpos[i] = subs.norm.list.multi[i].end;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4756 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4757
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4758 if (reg_startpos[0].lnum < 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4759 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4760 reg_startpos[0].lnum = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4761 reg_startpos[0].col = col;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4762 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4763 if (reg_endpos[0].lnum < 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4764 {
4569
f262fb02889d updated for version 7.3.1032
Bram Moolenaar <bram@vim.org>
parents: 4567
diff changeset
4765 /* pattern has a \ze but it didn't match, use current end */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4766 reg_endpos[0].lnum = reglnum;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4767 reg_endpos[0].col = (int)(reginput - regline);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4768 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4769 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4770 /* Use line number of "\ze". */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4771 reglnum = reg_endpos[0].lnum;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4772 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4773 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4774 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4775 for (i = 0; i < subs.norm.in_use; i++)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4776 {
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4777 reg_startp[i] = subs.norm.list.line[i].start;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4778 reg_endp[i] = subs.norm.list.line[i].end;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4779 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4780
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4781 if (reg_startp[0] == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4782 reg_startp[0] = regline + col;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4783 if (reg_endp[0] == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4784 reg_endp[0] = reginput;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4785 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4786
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4787 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4788 /* Package any found \z(...\) matches for export. Default is none. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4789 unref_extmatch(re_extmatch_out);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4790 re_extmatch_out = NULL;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4791
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4792 if (prog->reghasz == REX_SET)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4793 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4794 cleanup_zsubexpr();
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4795 re_extmatch_out = make_extmatch();
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4796 for (i = 0; i < subs.synt.in_use; i++)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4797 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4798 if (REG_MULTI)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4799 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4800 struct multipos *mpos = &subs.synt.list.multi[i];
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4801
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4802 /* Only accept single line matches. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4803 if (mpos->start.lnum >= 0 && mpos->start.lnum == mpos->end.lnum)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4804 re_extmatch_out->matches[i] =
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4805 vim_strnsave(reg_getline(mpos->start.lnum)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4806 + mpos->start.col,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4807 mpos->end.col - mpos->start.col);
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4808 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4809 else
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4810 {
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4811 struct linepos *lpos = &subs.synt.list.line[i];
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4812
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4813 if (lpos->start != NULL && lpos->end != NULL)
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4814 re_extmatch_out->matches[i] =
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4815 vim_strnsave(lpos->start,
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4816 (int)(lpos->end - lpos->start));
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4817 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4818 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4819 }
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4820 #endif
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4821
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4822 return 1 + reglnum;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4823 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4824
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4825 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4826 * Match a regexp against a string ("line" points to the string) or multiple
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4827 * lines ("line" is NULL, use reg_getline()).
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4828 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4829 * Returns 0 for failure, number of lines contained in the match otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4830 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4831 static long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4832 nfa_regexec_both(line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4833 char_u *line;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4834 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4835 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4836 nfa_regprog_T *prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4837 long retval = 0L;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4838 int i;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4839
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4840 if (REG_MULTI)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4841 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4842 prog = (nfa_regprog_T *)reg_mmatch->regprog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4843 line = reg_getline((linenr_T)0); /* relative to the cursor */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4844 reg_startpos = reg_mmatch->startpos;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4845 reg_endpos = reg_mmatch->endpos;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4846 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4847 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4848 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4849 prog = (nfa_regprog_T *)reg_match->regprog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4850 reg_startp = reg_match->startp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4851 reg_endp = reg_match->endp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4852 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4853
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4854 /* Be paranoid... */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4855 if (prog == NULL || line == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4856 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4857 EMSG(_(e_null));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4858 goto theend;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4859 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4860
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4861 /* If the start column is past the maximum column: no need to try. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4862 if (ireg_maxcol > 0 && col >= ireg_maxcol)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4863 goto theend;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4864
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4865 /* If pattern contains "\c" or "\C": overrule value of ireg_ic */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4866 if (prog->regflags & RF_ICASE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4867 ireg_ic = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4868 else if (prog->regflags & RF_NOICASE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4869 ireg_ic = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4870
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4871 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4872 /* If pattern contains "\Z" overrule value of ireg_icombine */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4873 if (prog->regflags & RF_ICOMBINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4874 ireg_icombine = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4875 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4876
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4877 regline = line;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4878 reglnum = 0; /* relative to line */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4879
4553
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4880 nfa_has_zend = prog->has_zend;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
4881 nfa_has_backref = prog->has_backref;
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
4882 nfa_nsubexpr = prog->nsubexp;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
4883 nfa_listid = 1;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
4884 nfa_alt_listid = 2;
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4885 #ifdef DEBUG
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4886 nfa_regengine.expr = prog->pattern;
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4887 #endif
4553
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4888
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4889 nstate = prog->nstate;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4890 for (i = 0; i < nstate; ++i)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4891 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4892 prog->state[i].id = i;
4718
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
4893 prog->state[i].lastlist[0] = 0;
ec72bb4a0fc2 updated for version 7.3.1106
Bram Moolenaar <bram@vim.org>
parents: 4716
diff changeset
4894 prog->state[i].lastlist[1] = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4895 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4896
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4897 retval = nfa_regtry(prog, col);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4898
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4899 #ifdef DEBUG
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4900 nfa_regengine.expr = NULL;
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4901 #endif
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4902
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4903 theend:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4904 return retval;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4905 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4906
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4907 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4908 * Compile a regular expression into internal code for the NFA matcher.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4909 * Returns the program in allocated space. Returns NULL for an error.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4910 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4911 static regprog_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4912 nfa_regcomp(expr, re_flags)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4913 char_u *expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4914 int re_flags;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4915 {
4541
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4916 nfa_regprog_T *prog = NULL;
4458
21e13403140a updated for version 7.3.977
Bram Moolenaar <bram@vim.org>
parents: 4456
diff changeset
4917 size_t prog_size;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4918 int *postfix;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4919
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4920 if (expr == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4921 return NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4922
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4923 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4924 nfa_regengine.expr = expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4925 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4926
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4927 init_class_tab();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4928
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4929 if (nfa_regcomp_start(expr, re_flags) == FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4930 return NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4931
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4932 /* Build postfix form of the regexp. Needed to build the NFA
4541
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4933 * (and count its size). */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4934 postfix = re2post();
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4935 if (postfix == NULL)
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4936 {
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4937 /* TODO: only give this error for debugging? */
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4938 if (post_ptr >= post_end)
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4939 EMSGN("Internal error: estimated max number of states insufficient: %ld", post_end - post_start);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4940 goto fail; /* Cascaded (syntax?) error */
4555
b2946c06d1b6 updated for version 7.3.1025
Bram Moolenaar <bram@vim.org>
parents: 4553
diff changeset
4941 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4942
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4943 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4944 * In order to build the NFA, we parse the input regexp twice:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4945 * 1. first pass to count size (so we can allocate space)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4946 * 2. second to emit code
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4947 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4948 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4949 {
4531
1be43c095aff updated for version 7.3.1013
Bram Moolenaar <bram@vim.org>
parents: 4529
diff changeset
4950 FILE *f = fopen(NFA_REGEXP_RUN_LOG, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4951
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4952 if (f != NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4953 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4954 fprintf(f, "\n*****************************\n\n\n\n\tCompiling regexp \"%s\" ... hold on !\n", expr);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4955 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4956 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4957 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4958 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4959
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4960 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4961 * PASS 1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4962 * Count number of NFA states in "nstate". Do not build the NFA.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4963 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4964 post2nfa(postfix, post_ptr, TRUE);
4541
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4965
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4966 /* Space for compiled regexp */
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4967 prog_size = sizeof(nfa_regprog_T) + sizeof(nfa_state_T) * nstate;
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4968 prog = (nfa_regprog_T *)lalloc(prog_size, TRUE);
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4969 if (prog == NULL)
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4970 goto fail;
80170d61a85c updated for version 7.3.1018
Bram Moolenaar <bram@vim.org>
parents: 4539
diff changeset
4971 vim_memset(prog, 0, prog_size);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4972 state_ptr = prog->state;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4973
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4974 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4975 * PASS 2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4976 * Build the NFA
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4977 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4978 prog->start = post2nfa(postfix, post_ptr, FALSE);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4979 if (prog->start == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4980 goto fail;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4981
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4982 prog->regflags = regflags;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4983 prog->engine = &nfa_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4984 prog->nstate = nstate;
4553
7b835b2969af updated for version 7.3.1024
Bram Moolenaar <bram@vim.org>
parents: 4551
diff changeset
4985 prog->has_zend = nfa_has_zend;
4647
857f6c53f117 updated for version 7.3.1071
Bram Moolenaar <bram@vim.org>
parents: 4615
diff changeset
4986 prog->has_backref = nfa_has_backref;
4561
4d81fdda8f35 updated for version 7.3.1028
Bram Moolenaar <bram@vim.org>
parents: 4559
diff changeset
4987 prog->nsubexp = regnpar;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4988 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4989 nfa_postfix_dump(expr, OK);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4990 nfa_dump(prog);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4991 #endif
4686
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4992 #ifdef FEAT_SYN_HL
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4993 /* Remember whether this pattern has any \z specials in it. */
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4994 prog->reghasz = re_has_z;
8db697ae406a updated for version 7.3.1090
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
4995 #endif
4690
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4996 #ifdef DEBUG
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4997 prog->pattern = vim_strsave(expr); /* memory will leak */
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4998 nfa_regengine.expr = NULL;
9d97a0c045ef updated for version 7.3.1092
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
4999 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5000
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5001 out:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5002 vim_free(post_start);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5003 post_start = post_ptr = post_end = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5004 state_ptr = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5005 return (regprog_T *)prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5006
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5007 fail:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5008 vim_free(prog);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5009 prog = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5010 #ifdef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5011 nfa_postfix_dump(expr, FAIL);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5012 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5013 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5014 nfa_regengine.expr = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5015 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5016 goto out;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5017 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5018
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5019
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5020 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5021 * Match a regexp against a string.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5022 * "rmp->regprog" is a compiled regexp as returned by nfa_regcomp().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5023 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5024 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5025 * Return TRUE if there is a match, FALSE if not.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5026 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5027 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5028 nfa_regexec(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5029 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5030 char_u *line; /* string to match against */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5031 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5032 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5033 reg_match = rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5034 reg_mmatch = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5035 reg_maxline = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5036 reg_line_lbr = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5037 reg_buf = curbuf;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5038 reg_win = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5039 ireg_ic = rmp->rm_ic;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5040 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5041 ireg_icombine = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5042 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5043 ireg_maxcol = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5044 return (nfa_regexec_both(line, col) != 0);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5045 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5046
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5047 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5048 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5049
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5050 static int nfa_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5051
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5052 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5053 * Like nfa_regexec(), but consider a "\n" in "line" to be a line break.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5054 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5055 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5056 nfa_regexec_nl(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5057 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5058 char_u *line; /* string to match against */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5059 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5060 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5061 reg_match = rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5062 reg_mmatch = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5063 reg_maxline = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5064 reg_line_lbr = TRUE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5065 reg_buf = curbuf;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5066 reg_win = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5067 ireg_ic = rmp->rm_ic;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5068 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5069 ireg_icombine = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5070 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5071 ireg_maxcol = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5072 return (nfa_regexec_both(line, col) != 0);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5073 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5074 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5075
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5076
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5077 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5078 * Match a regexp against multiple lines.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5079 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5080 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5081 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5082 * Return zero if there is no match. Return number of lines contained in the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5083 * match otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5084 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5085 * Note: the body is the same as bt_regexec() except for nfa_regexec_both()
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5086 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5087 * ! Also NOTE : match may actually be in another line. e.g.:
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5088 * when r.e. is \nc, cursor is at 'a' and the text buffer looks like
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5089 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5090 * +-------------------------+
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5091 * |a |
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5092 * |b |
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5093 * |c |
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5094 * | |
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5095 * +-------------------------+
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5096 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5097 * then nfa_regexec_multi() returns 3. while the original
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5098 * vim_regexec_multi() returns 0 and a second call at line 2 will return 2.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5099 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5100 * FIXME if this behavior is not compatible.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5101 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5102 static long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5103 nfa_regexec_multi(rmp, win, buf, lnum, col, tm)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5104 regmmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5105 win_T *win; /* window in which to search or NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5106 buf_T *buf; /* buffer in which to search */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5107 linenr_T lnum; /* nr of line to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5108 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5109 proftime_T *tm UNUSED; /* timeout limit or NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5110 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5111 reg_match = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5112 reg_mmatch = rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5113 reg_buf = buf;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5114 reg_win = win;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5115 reg_firstlnum = lnum;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5116 reg_maxline = reg_buf->b_ml.ml_line_count - lnum;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5117 reg_line_lbr = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5118 ireg_ic = rmp->rmm_ic;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5119 #ifdef FEAT_MBYTE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5120 ireg_icombine = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5121 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5122 ireg_maxcol = rmp->rmm_maxcol;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5123
4503
e6e60d9da892 updated for version 7.3.999
Bram Moolenaar <bram@vim.org>
parents: 4484
diff changeset
5124 return nfa_regexec_both(NULL, col);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5125 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5126
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5127 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5128 # undef ENABLE_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5129 #endif