annotate src/regexp.c @ 5899:60cdaa05a6ad v7.4.292

updated for version 7.4.292 Problem: Searching for "a" does not match accented "a" with new regexp engine, does match with old engine. (David B?rgin) "ca" does not match "ca" with accented "a" with either engine. Solution: Change the old engine, check for following composing character also for single-byte patterns.
author Bram Moolenaar <bram@vim.org>
date Tue, 13 May 2014 18:04:00 +0200
parents b5972833add9
children 10fc95f48546
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * Handling of regular expressions: vim_regcomp(), vim_regexec(), vim_regsub()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * NOTICE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * This is NOT the original regular expression code as written by Henry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 * Spencer. This code has been modified specifically for use with the VIM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 * editor, and should not be used separately from Vim. If you want a good
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 * regular expression library, get the original code. The copyright notice
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * that follows is from the original.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 * END NOTICE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 * Copyright (c) 1986 by University of Toronto.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 * Written by Henry Spencer. Not derived from licensed software.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 * Permission is granted to anyone to use this software for any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 * purpose on any computer system, and to redistribute it freely,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 * subject to the following restrictions:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 * 1. The author is not responsible for the consequences of use of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 * this software, no matter how awful, even if they arise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 * from defects in it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 * 2. The origin of this software must not be misrepresented, either
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 * by explicit claim or by omission.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 * 3. Altered versions must be plainly marked as such, and must not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 * be misrepresented as being the original software.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 * Beware that some of this code is subtly aware of the way operator
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 * precedence is structured in regular expressions. Serious changes in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 * regular-expression syntax might require a total rethink.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 *
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
36 * Changes have been made by Tony Andrews, Olaf 'Rhialto' Seibert, Robert
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
37 * Webb, Ciaran McCreesh and Bram Moolenaar.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 * Named character class support added by Walter Briscoe (1998 Jul 01)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
41 /* Uncomment the first if you do not want to see debugging logs or files
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
42 * related to regular expressions, even when compiling with -DDEBUG.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
43 * Uncomment the second to get the regexp debugging. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
44 /* #undef DEBUG */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
45 /* #define DEBUG */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
46
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
49 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
50 /* show/save debugging data when BT engine is used */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
51 # define BT_REGEXP_DUMP
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
52 /* save the debugging data to a file instead of displaying it */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
53 # define BT_REGEXP_LOG
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
54 # define BT_REGEXP_DEBUG_LOG
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
55 # define BT_REGEXP_DEBUG_LOG_NAME "bt_regexp_debug.log"
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
56 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 * The "internal use only" fields in regexp.h are present to pass info from
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 * compile to execute that permits the execute phase to run lots faster on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 * simple cases. They are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * regstart char that must begin a match; NUL if none obvious; Can be a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 * multi-byte character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 * reganch is the match anchored (at beginning-of-line only)?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 * regmust string (pointer into program) that match must include, or NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 * regmlen length of regmust string
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 * regflags RF_ values or'ed together
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 * Regstart and reganch permit very fast decisions on suitable starting points
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 * for a match, cutting down the work a lot. Regmust permits fast rejection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 * of lines that cannot possibly match. The regmust tests are costly enough
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 * that vim_regcomp() supplies a regmust only if the r.e. contains something
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 * potentially expensive (at present, the only such thing detected is * or +
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 * at the start of the r.e., which can involve a lot of backup). Regmlen is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 * supplied because the test in vim_regexec() needs it and vim_regcomp() is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 * computing it anyway.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 * Structure for regexp "program". This is essentially a linear encoding
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 * of a nondeterministic finite-state machine (aka syntax charts or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 * "railroad normal form" in parsing technology). Each node is an opcode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 * plus a "next" pointer, possibly plus an operand. "Next" pointers of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 * pointer with a BRANCH on both ends of it is connecting two alternatives.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * (Here we have one of the subtle syntax dependencies: an individual BRANCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 * (as opposed to a collection of them) is never concatenated with anything
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 * because of operator precedence). The "next" pointer of a BRACES_COMPLEX
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
90 * node points to the node after the stuff to be repeated.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
91 * The operand of some types of node is a literal string; for others, it is a
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
92 * node leading into a sub-FSM. In particular, the operand of a BRANCH node
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
93 * is the first node of the branch.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
94 * (NB this is *not* a tree structure: the tail of the branch connects to the
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
95 * thing following the set of BRANCHes.)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 * pattern is coded like:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 * +-----------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 * | V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 * | ^ | ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 * +------+ +----------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * +------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 * V |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 * | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 * | +---------------+ |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 * +---------------------------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 *
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
114 * +----------------------+
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
115 * V |
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
116 * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
117 * | | ^ ^
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
118 * | +-----------+ |
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
119 * +--------------------------------------------------+
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
120 *
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
121 *
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 * +-------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 * V |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 * | | ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 * | +----------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 * +-----------------------------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 * | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 * | +----------------+ |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 * +--------------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 * +---------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 * | V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 * | | | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 * | | | +-----+ |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 * | | +----------------+ |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 * | +---------------------------+ |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 * +------------------------------------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 *
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
144 * They all start with a BRANCH for "\|" alternatives, even when there is only
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 * one alternative.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 * The opcodes are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 /* definition number opnd? meaning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 #define END 0 /* End of program or NOMATCH operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 #define BOL 1 /* Match "" at beginning of line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 #define EOL 2 /* Match "" at end of line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 #define BRANCH 3 /* node Match this alternative, or the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 * next... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 #define BACK 4 /* Match "", "next" ptr points backward. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 #define EXACTLY 5 /* str Match this string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 #define NOTHING 6 /* Match empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 #define STAR 7 /* node Match this (simple) thing 0 or more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 * times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 #define PLUS 8 /* node Match this (simple) thing 1 or more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 * times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 #define MATCH 9 /* node match the operand zero-width */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 #define NOMATCH 10 /* node check for no match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 #define BEHIND 11 /* node look behind for a match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 #define NOBEHIND 12 /* node look behind for no match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 #define SUBPAT 13 /* node match the operand here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 #define BRACE_SIMPLE 14 /* node Match this (simple) thing between m and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 * n times (\{m,n\}). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 #define BOW 15 /* Match "" after [^a-zA-Z0-9_] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 #define EOW 16 /* Match "" at [^a-zA-Z0-9_] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 #define BRACE_LIMITS 17 /* nr nr define the min & max for BRACE_SIMPLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 * and BRACE_COMPLEX. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 #define NEWL 18 /* Match line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 #define BHPOS 19 /* End position for BEHIND or NOBEHIND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 /* character classes: 20-48 normal, 50-78 include a line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 #define ADD_NL 30
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 #define FIRST_NL ANY + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 #define ANY 20 /* Match any one character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 #define ANYOF 21 /* str Match any character in this string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 #define ANYBUT 22 /* str Match any character not in this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 * string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 #define IDENT 23 /* Match identifier char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 #define SIDENT 24 /* Match identifier char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 #define KWORD 25 /* Match keyword char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 #define SKWORD 26 /* Match word char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 #define FNAME 27 /* Match file name char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 #define SFNAME 28 /* Match file name char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 #define PRINT 29 /* Match printable char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 #define SPRINT 30 /* Match printable char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 #define WHITE 31 /* Match whitespace char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 #define NWHITE 32 /* Match non-whitespace char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 #define DIGIT 33 /* Match digit char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 #define NDIGIT 34 /* Match non-digit char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 #define HEX 35 /* Match hex char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 #define NHEX 36 /* Match non-hex char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 #define OCTAL 37 /* Match octal char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 #define NOCTAL 38 /* Match non-octal char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 #define WORD 39 /* Match word char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 #define NWORD 40 /* Match non-word char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 #define HEAD 41 /* Match head char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 #define NHEAD 42 /* Match non-head char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 #define ALPHA 43 /* Match alpha char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 #define NALPHA 44 /* Match non-alpha char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 #define LOWER 45 /* Match lowercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 #define NLOWER 46 /* Match non-lowercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 #define UPPER 47 /* Match uppercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 #define NUPPER 48 /* Match non-uppercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 #define LAST_NL NUPPER + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 #define WITH_NL(op) ((op) >= FIRST_NL && (op) <= LAST_NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 #define MOPEN 80 /* -89 Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 * \( subexpr. MOPEN + 0 marks start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 * match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #define MCLOSE 90 /* -99 Analogous to MOPEN. MCLOSE + 0 marks
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 * end of match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 #define BACKREF 100 /* -109 node Match same string again \1-\9 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 # define ZOPEN 110 /* -119 Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 * \z( subexpr. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 # define ZCLOSE 120 /* -129 Analogous to ZOPEN. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 # define ZREF 130 /* -139 node Match external submatch \z1-\z9 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 #define BRACE_COMPLEX 140 /* -149 node Match nodes between m & n times */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 #define NOPEN 150 /* Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 \%( subexpr. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 #define NCLOSE 151 /* Analogous to NOPEN. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 #define MULTIBYTECODE 200 /* mbc Match one multi-byte character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 #define RE_BOF 201 /* Match "" at beginning of file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 #define RE_EOF 202 /* Match "" at end of file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 #define CURSOR 203 /* Match location of cursor. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 #define RE_LNUM 204 /* nr cmp Match line number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 #define RE_COL 205 /* nr cmp Match column number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 #define RE_VCOL 206 /* nr cmp Match virtual column number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
245 #define RE_MARK 207 /* mark cmp Match mark position */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
246 #define RE_VISUAL 208 /* Match Visual area */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
247
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 * Magic characters have a special meaning, they don't match literally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 * Magic characters are negative. This separates them from literal characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 * (possibly multi-byte). Only ASCII characters can be Magic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 #define Magic(x) ((int)(x) - 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 #define un_Magic(x) ((x) + 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 #define is_Magic(x) ((x) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 static int no_Magic __ARGS((int x));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 static int toggle_Magic __ARGS((int x));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 no_Magic(x)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 if (is_Magic(x))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 return un_Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 return x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 toggle_Magic(x)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 if (is_Magic(x))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 return un_Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 return Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 * The first byte of the regexp internal "program" is actually this magic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 * number; the start node begins in the second byte. It's used to catch the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 * most severe mutilation of the program by the caller.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 #define REGMAGIC 0234
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * Opcode notes:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 * BRANCH The set of branches constituting a single choice are hooked
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 * together with their "next" pointers, since precedence prevents
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 * anything being concatenated to any individual branch. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 * "next" pointer of the last BRANCH in a choice points to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 * thing following the whole choice. This is also where the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 * final "next" pointer of each individual branch points; each
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 * branch starts with the operand node of a BRANCH node.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 * BACK Normal "next" pointers all implicitly point forward; BACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 * exists to make loop structures possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 * STAR,PLUS '=', and complex '*' and '+', are implemented as circular
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 * BRANCH structures using BACK. Simple cases (one character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 * per match) are implemented with STAR and PLUS for speed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 * and to minimize recursive plunges.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 * node, and defines the min and max limits to be used for that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 * node.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 * MOPEN,MCLOSE ...are numbered at compile time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 * ZOPEN,ZCLOSE ...ditto
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 * A node is one char of opcode followed by two chars of "next" pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 * "Next" pointers are stored as two 8-bit bytes, high order first. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 * value is a positive offset from the opcode of the node containing it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 * An operand, if any, simply follows the node. (Note that much of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 * code generation knows about this implicit relationship.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 * Using two bytes for the "next" pointer is vast overkill for most things,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 * but allows patterns to get big without disasters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 #define OP(p) ((int)*(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 #define NEXT(p) (((*((p) + 1) & 0377) << 8) + (*((p) + 2) & 0377))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 #define OPERAND(p) ((p) + 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 /* Obtain an operand that was stored as four bytes, MSB first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 #define OPERAND_MIN(p) (((long)(p)[3] << 24) + ((long)(p)[4] << 16) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 + ((long)(p)[5] << 8) + (long)(p)[6])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 /* Obtain a second operand stored as four bytes. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 #define OPERAND_MAX(p) OPERAND_MIN((p) + 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 /* Obtain a second single-byte operand stored after a four bytes operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 #define OPERAND_CMP(p) (p)[7]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 * Utility definitions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 #define UCHARAT(p) ((int)*(char_u *)(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 /* Used for an error (down from) vim_regcomp(): give the error message, set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 * rc_did_emsg and return NULL */
653
5acda076fb0c updated for version 7.0192
vimboss
parents: 639
diff changeset
341 #define EMSG_RET_NULL(m) return (EMSG(m), rc_did_emsg = TRUE, (void *)NULL)
308
74e9d19831c2 updated for version 7.0081
vimboss
parents: 297
diff changeset
342 #define EMSG_RET_FAIL(m) return (EMSG(m), rc_did_emsg = TRUE, FAIL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
343 #define EMSG2_RET_NULL(m, c) return (EMSG2((m), (c) ? "" : "\\"), rc_did_emsg = TRUE, (void *)NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
344 #define EMSG2_RET_FAIL(m, c) return (EMSG2((m), (c) ? "" : "\\"), rc_did_emsg = TRUE, FAIL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
345 #define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_("E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 #define MAX_LIMIT (32767L << 16L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 static int re_multi_type __ARGS((int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 static int cstrncmp __ARGS((char_u *s1, char_u *s2, int *n));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 static char_u *cstrchr __ARGS((char_u *, int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
353 #ifdef BT_REGEXP_DUMP
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
354 static void regdump __ARGS((char_u *, bt_regprog_T *));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
355 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 static char_u *regprop __ARGS((char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
360 static char_u e_missingbracket[] = N_("E769: Missing ] after %s[");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
361 static char_u e_unmatchedpp[] = N_("E53: Unmatched %s%%(");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
362 static char_u e_unmatchedp[] = N_("E54: Unmatched %s(");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
363 static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
4720
bd6bef0bd0fb updated for version 7.3.1107
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
364 #ifdef FEAT_SYN_HL
4688
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
365 static char_u e_z_not_allowed[] = N_("E66: \\z( not allowed here");
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
366 static char_u e_z1_not_allowed[] = N_("E67: \\z1 et al. not allowed here");
4720
bd6bef0bd0fb updated for version 7.3.1107
Bram Moolenaar <bram@vim.org>
parents: 4688
diff changeset
367 #endif
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
368 static char_u e_missing_sb[] = N_("E69: Missing ] after %s%%[");
4760
532a9855bd30 updated for version 7.3.1127
Bram Moolenaar <bram@vim.org>
parents: 4746
diff changeset
369 static char_u e_empty_sb[] = N_("E70: Empty %s%%[]");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 #define NOT_MULTI 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 #define MULTI_ONE 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 #define MULTI_MULT 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 * Return NOT_MULTI if c is not a "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 * Return MULTI_ONE if c is a single "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 * Return MULTI_MULT if c is a multi "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 re_multi_type(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 if (c == Magic('@') || c == Magic('=') || c == Magic('?'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 return MULTI_ONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 if (c == Magic('*') || c == Magic('+') || c == Magic('{'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 return MULTI_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 return NOT_MULTI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 * Flags to be passed up and down.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 #define HASWIDTH 0x1 /* Known never to match null string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 #define SIMPLE 0x2 /* Simple enough to be STAR/PLUS operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 #define SPSTART 0x4 /* Starts with * or +. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 #define HASNL 0x8 /* Contains some \n. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 #define HASLOOKBH 0x10 /* Contains "\@<=" or "\@<!". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 #define WORST 0 /* Worst case. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 * When regcode is set to this value, code is not emitted and size is computed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 * instead.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 #define JUST_CALC_SIZE ((char_u *) -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
405 static char_u *reg_prev_sub = NULL;
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
406
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 * REGEXP_INRANGE contains all characters which are always special in a []
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 * range after '\'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 * REGEXP_ABBR contains all characters which act as abbreviations after '\'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 * These are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 * \n - New line (NL).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 * \r - Carriage Return (CR).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 * \t - Tab (TAB).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 * \e - Escape (ESC).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 * \b - Backspace (Ctrl_H).
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
417 * \d - Character code in decimal, eg \d123
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
418 * \o - Character code in octal, eg \o80
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
419 * \x - Character code in hex, eg \x4a
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
420 * \u - Multibyte character code, eg \u20ac
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
421 * \U - Long multibyte character code, eg \U12345678
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 static char_u REGEXP_INRANGE[] = "]^-n\\";
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
424 static char_u REGEXP_ABBR[] = "nrtebdoxuU";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 static int backslash_trans __ARGS((int c));
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
427 static int get_char_class __ARGS((char_u **pp));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
428 static int get_equi_class __ARGS((char_u **pp));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
429 static void reg_equi_class __ARGS((int c));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
430 static int get_coll_element __ARGS((char_u **pp));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 static char_u *skip_anyof __ARGS((char_u *p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 static void init_class_tab __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 * Translate '\x' to its control character, except "\n", which is Magic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 backslash_trans(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 case 'r': return CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 case 't': return TAB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 case 'e': return ESC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 case 'b': return BS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 /*
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
452 * Check for a character class name "[:name:]". "pp" points to the '['.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 * Returns one of the CLASS_ items. CLASS_NONE means that no item was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 * recognized. Otherwise "pp" is advanced to after the item.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 static int
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
457 get_char_class(pp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 char_u **pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 static const char *(class_names[]) =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 "alnum:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 #define CLASS_ALNUM 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 "alpha:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 #define CLASS_ALPHA 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 "blank:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 #define CLASS_BLANK 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 "cntrl:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 #define CLASS_CNTRL 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 "digit:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 #define CLASS_DIGIT 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 "graph:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 #define CLASS_GRAPH 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 "lower:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 #define CLASS_LOWER 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 "print:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 #define CLASS_PRINT 7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 "punct:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 #define CLASS_PUNCT 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 "space:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 #define CLASS_SPACE 9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 "upper:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 #define CLASS_UPPER 10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 "xdigit:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 #define CLASS_XDIGIT 11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 "tab:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 #define CLASS_TAB 12
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 "return:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 #define CLASS_RETURN 13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 "backspace:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 #define CLASS_BACKSPACE 14
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 "escape:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 #define CLASS_ESCAPE 15
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 #define CLASS_NONE 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 if ((*pp)[1] == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 {
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1815
diff changeset
500 for (i = 0; i < (int)(sizeof(class_names) / sizeof(*class_names)); ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 *pp += STRLEN(class_names[i]) + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 return CLASS_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 * Specific version of character class functions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 * Using a table to keep this fast.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 static short class_tab[256];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 #define RI_DIGIT 0x01
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 #define RI_HEX 0x02
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 #define RI_OCTAL 0x04
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 #define RI_WORD 0x08
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 #define RI_HEAD 0x10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 #define RI_ALPHA 0x20
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 #define RI_LOWER 0x40
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 #define RI_UPPER 0x80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 #define RI_WHITE 0x100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 init_class_tab()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 static int done = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 if (done)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 for (i = 0; i < 256; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 if (i >= '0' && i <= '7')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 class_tab[i] = RI_DIGIT + RI_HEX + RI_OCTAL + RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 else if (i >= '8' && i <= '9')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 else if (i >= 'a' && i <= 'f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 else if ((i >= 'g' && i <= 'i') || (i >= 'j' && i <= 'r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 || (i >= 's' && i <= 'z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 else if (i >= 'g' && i <= 'z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 else if (i >= 'A' && i <= 'F')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 else if ((i >= 'G' && i <= 'I') || ( i >= 'J' && i <= 'R')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 || (i >= 'S' && i <= 'Z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 else if (i >= 'G' && i <= 'Z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 else if (i == '_')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 class_tab[i] = RI_WORD + RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 class_tab[i] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 class_tab[' '] |= RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 class_tab['\t'] |= RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 done = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 # define ri_digit(c) (c < 0x100 && (class_tab[c] & RI_DIGIT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 # define ri_hex(c) (c < 0x100 && (class_tab[c] & RI_HEX))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 # define ri_octal(c) (c < 0x100 && (class_tab[c] & RI_OCTAL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 # define ri_word(c) (c < 0x100 && (class_tab[c] & RI_WORD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 # define ri_head(c) (c < 0x100 && (class_tab[c] & RI_HEAD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 # define ri_alpha(c) (c < 0x100 && (class_tab[c] & RI_ALPHA))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 # define ri_lower(c) (c < 0x100 && (class_tab[c] & RI_LOWER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 # define ri_upper(c) (c < 0x100 && (class_tab[c] & RI_UPPER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 # define ri_white(c) (c < 0x100 && (class_tab[c] & RI_WHITE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 # define ri_digit(c) (class_tab[c] & RI_DIGIT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 # define ri_hex(c) (class_tab[c] & RI_HEX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 # define ri_octal(c) (class_tab[c] & RI_OCTAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 # define ri_word(c) (class_tab[c] & RI_WORD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 # define ri_head(c) (class_tab[c] & RI_HEAD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 # define ri_alpha(c) (class_tab[c] & RI_ALPHA)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 # define ri_lower(c) (class_tab[c] & RI_LOWER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 # define ri_upper(c) (class_tab[c] & RI_UPPER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 # define ri_white(c) (class_tab[c] & RI_WHITE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 /* flags for regflags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 #define RF_ICASE 1 /* ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 #define RF_NOICASE 2 /* don't ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 #define RF_HASNL 4 /* can match a NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 #define RF_ICOMBINE 8 /* ignore combining characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 #define RF_LOOKBH 16 /* uses "\@<=" or "\@<!" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 * Global work variables for vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 static char_u *regparse; /* Input-scan pointer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 static int prevchr_len; /* byte length of previous char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 static int num_complex_braces; /* Complex \{...} count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 static int regnpar; /* () count. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 static int regnzpar; /* \z() count. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 static int re_has_z; /* \z item detected */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 static char_u *regcode; /* Code-emit pointer, or JUST_CALC_SIZE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 static long regsize; /* Code size. */
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
612 static int reg_toolong; /* TRUE when offset out of range */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 static char_u had_endbrace[NSUBEXP]; /* flags, TRUE if end of () found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 static unsigned regflags; /* RF_ flags for prog */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 static long brace_min[10]; /* Minimums for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 static long brace_max[10]; /* Maximums for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 static int brace_count[10]; /* Current counts for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 static int had_eol; /* TRUE when EOL found by vim_regcomp() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 static int one_exactly = FALSE; /* only do one char for EXACTLY */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 static int reg_magic; /* magicness of the pattern: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 #define MAGIC_NONE 1 /* "\V" very unmagic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 #define MAGIC_OFF 2 /* "\M" or 'magic' off */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 #define MAGIC_ON 3 /* "\m" or 'magic' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 #define MAGIC_ALL 4 /* "\v" very magic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 static int reg_string; /* matching with a string instead of a buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 line */
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
631 static int reg_strict; /* "[abc" is illegal */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 * META contains all characters that may be magic, except '^' and '$'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 static char_u META[] = "%&()*+.123456789<=>?@ACDFHIKLMOPSUVWX[_acdfhiklmnopsuvwxz{|~";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 /* META[] is used often enough to justify turning it into a table. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 static char_u META_flags[] = {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 /* % & ( ) * + . */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 /* 1 2 3 4 5 6 7 8 9 < = > ? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 /* @ A C D F H I K L M O */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 /* P S U V W X Z [ _ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 /* a c d f h i k l m n o */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 /* p s u v w x z { | ~ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
659 static int curchr; /* currently parsed character */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
660 /* Previous character. Note: prevchr is sometimes -1 when we are not at the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
661 * start, eg in /[ ^I]^ the pattern was never found even if it existed,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
662 * because ^ was taken to be magic -- webb */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
663 static int prevchr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
664 static int prevprevchr; /* previous-previous character */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
665 static int nextchr; /* used for ungetchr() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 /* arguments for reg() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 #define REG_NOPAREN 0 /* toplevel reg() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 #define REG_PAREN 1 /* \(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 #define REG_ZPAREN 2 /* \z(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 #define REG_NPAREN 3 /* \%(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
673 typedef struct
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
674 {
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
675 char_u *regparse;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
676 int prevchr_len;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
677 int curchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
678 int prevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
679 int prevprevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
680 int nextchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
681 int at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
682 int prev_at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
683 int regnpar;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
684 } parse_state_T;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
685
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 * Forward declarations for vim_regcomp()'s friends.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 static void initchr __ARGS((char_u *));
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
690 static void save_parse_state __ARGS((parse_state_T *ps));
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
691 static void restore_parse_state __ARGS((parse_state_T *ps));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 static int getchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 static void skipchr_keepstart __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 static int peekchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 static void skipchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 static void ungetchr __ARGS((void));
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
697 static int gethexchrs __ARGS((int maxinputlen));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
698 static int getoctchrs __ARGS((void));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
699 static int getdecchrs __ARGS((void));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
700 static int coll_get_char __ARGS((void));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 static void regcomp_start __ARGS((char_u *expr, int flags));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 static char_u *reg __ARGS((int, int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 static char_u *regbranch __ARGS((int *flagp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 static char_u *regconcat __ARGS((int *flagp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 static char_u *regpiece __ARGS((int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 static char_u *regatom __ARGS((int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 static char_u *regnode __ARGS((int));
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
708 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
709 static int use_multibytecode __ARGS((int c));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
710 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 static int prog_magic_wrong __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 static char_u *regnext __ARGS((char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 static void regc __ARGS((int b));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 static void regmbc __ARGS((int c));
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
716 # define REGMBC(x) regmbc(x);
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
717 # define CASEMBC(x) case x:
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
718 #else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
719 # define regmbc(c) regc(c)
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
720 # define REGMBC(x)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
721 # define CASEMBC(x)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 static void reginsert __ARGS((int, char_u *));
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
724 static void reginsert_nr __ARGS((int op, long val, char_u *opnd));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 static void reginsert_limits __ARGS((int, long, long, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 static char_u *re_put_long __ARGS((char_u *pr, long_u val));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 static int read_limits __ARGS((long *, long *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 static void regtail __ARGS((char_u *, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 static void regoptail __ARGS((char_u *, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
731 static regengine_T bt_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
732 static regengine_T nfa_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
733
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 * Return TRUE if compiled regular expression "prog" can match a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 re_multiline(prog)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 regprog_T *prog;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 return (prog->regflags & RF_HASNL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 * Return TRUE if compiled regular expression "prog" looks before the start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 * position (pattern contains "\@<=" or "\@<!").
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 re_lookbehind(prog)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 regprog_T *prog;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 return (prog->regflags & RF_LOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 /*
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
756 * Check for an equivalence class name "[=a=]". "pp" points to the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
757 * Returns a character representing the class. Zero means that no item was
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
758 * recognized. Otherwise "pp" is advanced to after the item.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
759 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
760 static int
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
761 get_equi_class(pp)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
762 char_u **pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
763 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
764 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
765 int l = 1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
766 char_u *p = *pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
767
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
768 if (p[1] == '=')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
769 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
770 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
771 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
772 l = (*mb_ptr2len)(p + 2);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
773 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
774 if (p[l + 2] == '=' && p[l + 3] == ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
775 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
776 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
777 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
778 c = mb_ptr2char(p + 2);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
779 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
780 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
781 c = p[2];
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
782 *pp += l + 4;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
783 return c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
784 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
785 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
786 return 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
787 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
788
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
789 #ifdef EBCDIC
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
790 /*
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
791 * Table for equivalence class "c". (IBM-1047)
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
792 */
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
793 char *EQUIVAL_CLASS_C[16] = {
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
794 "A\x62\x63\x64\x65\x66\x67",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
795 "C\x68",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
796 "E\x71\x72\x73\x74",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
797 "I\x75\x76\x77\x78",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
798 "N\x69",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
799 "O\xEB\xEC\xED\xEE\xEF",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
800 "U\xFB\xFC\xFD\xFE",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
801 "Y\xBA",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
802 "a\x42\x43\x44\x45\x46\x47",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
803 "c\x48",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
804 "e\x51\x52\x53\x54",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
805 "i\x55\x56\x57\x58",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
806 "n\x49",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
807 "o\xCB\xCC\xCD\xCE\xCF",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
808 "u\xDB\xDC\xDD\xDE",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
809 "y\x8D\xDF",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
810 };
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
811 #endif
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
812
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
813 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
814 * Produce the bytes for equivalence class "c".
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
815 * Currently only handles latin1, latin9 and utf-8.
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
816 * NOTE: When changing this function, also change nfa_emit_equi_class()
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
817 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
818 static void
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
819 reg_equi_class(c)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
820 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
821 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
822 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
823 if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
492
81c06952fb1d updated for version 7.0135
vimboss
parents: 482
diff changeset
824 || STRCMP(p_enc, "iso-8859-15") == 0)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
825 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
826 {
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
827 #ifdef EBCDIC
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
828 int i;
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
829
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
830 /* This might be slower than switch/case below. */
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
831 for (i = 0; i < 16; i++)
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
832 {
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
833 if (vim_strchr(EQUIVAL_CLASS_C[i], c) != NULL)
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
834 {
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
835 char *p = EQUIVAL_CLASS_C[i];
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
836
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
837 while (*p != 0)
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
838 regmbc(*p++);
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
839 return;
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
840 }
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
841 }
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
842 #else
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
843 switch (c)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
844 {
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
845 case 'A': case '\300': case '\301': case '\302':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
846 CASEMBC(0x100) CASEMBC(0x102) CASEMBC(0x104) CASEMBC(0x1cd)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
847 CASEMBC(0x1de) CASEMBC(0x1e0) CASEMBC(0x1ea2)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
848 case '\303': case '\304': case '\305':
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
849 regmbc('A'); regmbc('\300'); regmbc('\301');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
850 regmbc('\302'); regmbc('\303'); regmbc('\304');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
851 regmbc('\305');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
852 REGMBC(0x100) REGMBC(0x102) REGMBC(0x104)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
853 REGMBC(0x1cd) REGMBC(0x1de) REGMBC(0x1e0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
854 REGMBC(0x1ea2)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
855 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
856 case 'B': CASEMBC(0x1e02) CASEMBC(0x1e06)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
857 regmbc('B'); REGMBC(0x1e02) REGMBC(0x1e06)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
858 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
859 case 'C': case '\307':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
860 CASEMBC(0x106) CASEMBC(0x108) CASEMBC(0x10a) CASEMBC(0x10c)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
861 regmbc('C'); regmbc('\307');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
862 REGMBC(0x106) REGMBC(0x108) REGMBC(0x10a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
863 REGMBC(0x10c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
864 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
865 case 'D': CASEMBC(0x10e) CASEMBC(0x110) CASEMBC(0x1e0a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
866 CASEMBC(0x1e0e) CASEMBC(0x1e10)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
867 regmbc('D'); REGMBC(0x10e) REGMBC(0x110)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
868 REGMBC(0x1e0a) REGMBC(0x1e0e) REGMBC(0x1e10)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
869 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
870 case 'E': case '\310': case '\311': case '\312': case '\313':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
871 CASEMBC(0x112) CASEMBC(0x114) CASEMBC(0x116) CASEMBC(0x118)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
872 CASEMBC(0x11a) CASEMBC(0x1eba) CASEMBC(0x1ebc)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
873 regmbc('E'); regmbc('\310'); regmbc('\311');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
874 regmbc('\312'); regmbc('\313');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
875 REGMBC(0x112) REGMBC(0x114) REGMBC(0x116)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
876 REGMBC(0x118) REGMBC(0x11a) REGMBC(0x1eba)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
877 REGMBC(0x1ebc)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
878 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
879 case 'F': CASEMBC(0x1e1e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
880 regmbc('F'); REGMBC(0x1e1e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
881 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
882 case 'G': CASEMBC(0x11c) CASEMBC(0x11e) CASEMBC(0x120)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
883 CASEMBC(0x122) CASEMBC(0x1e4) CASEMBC(0x1e6) CASEMBC(0x1f4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
884 CASEMBC(0x1e20)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
885 regmbc('G'); REGMBC(0x11c) REGMBC(0x11e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
886 REGMBC(0x120) REGMBC(0x122) REGMBC(0x1e4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
887 REGMBC(0x1e6) REGMBC(0x1f4) REGMBC(0x1e20)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
888 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
889 case 'H': CASEMBC(0x124) CASEMBC(0x126) CASEMBC(0x1e22)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
890 CASEMBC(0x1e26) CASEMBC(0x1e28)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
891 regmbc('H'); REGMBC(0x124) REGMBC(0x126)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
892 REGMBC(0x1e22) REGMBC(0x1e26) REGMBC(0x1e28)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
893 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
894 case 'I': case '\314': case '\315': case '\316': case '\317':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
895 CASEMBC(0x128) CASEMBC(0x12a) CASEMBC(0x12c) CASEMBC(0x12e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
896 CASEMBC(0x130) CASEMBC(0x1cf) CASEMBC(0x1ec8)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
897 regmbc('I'); regmbc('\314'); regmbc('\315');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
898 regmbc('\316'); regmbc('\317');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
899 REGMBC(0x128) REGMBC(0x12a) REGMBC(0x12c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
900 REGMBC(0x12e) REGMBC(0x130) REGMBC(0x1cf)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
901 REGMBC(0x1ec8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
902 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
903 case 'J': CASEMBC(0x134)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
904 regmbc('J'); REGMBC(0x134)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
905 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
906 case 'K': CASEMBC(0x136) CASEMBC(0x1e8) CASEMBC(0x1e30)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
907 CASEMBC(0x1e34)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
908 regmbc('K'); REGMBC(0x136) REGMBC(0x1e8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
909 REGMBC(0x1e30) REGMBC(0x1e34)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
910 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
911 case 'L': CASEMBC(0x139) CASEMBC(0x13b) CASEMBC(0x13d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
912 CASEMBC(0x13f) CASEMBC(0x141) CASEMBC(0x1e3a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
913 regmbc('L'); REGMBC(0x139) REGMBC(0x13b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
914 REGMBC(0x13d) REGMBC(0x13f) REGMBC(0x141)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
915 REGMBC(0x1e3a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
916 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
917 case 'M': CASEMBC(0x1e3e) CASEMBC(0x1e40)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
918 regmbc('M'); REGMBC(0x1e3e) REGMBC(0x1e40)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
919 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
920 case 'N': case '\321':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
921 CASEMBC(0x143) CASEMBC(0x145) CASEMBC(0x147) CASEMBC(0x1e44)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
922 CASEMBC(0x1e48)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
923 regmbc('N'); regmbc('\321');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
924 REGMBC(0x143) REGMBC(0x145) REGMBC(0x147)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
925 REGMBC(0x1e44) REGMBC(0x1e48)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
926 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
927 case 'O': case '\322': case '\323': case '\324': case '\325':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
928 case '\326': case '\330':
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
929 CASEMBC(0x14c) CASEMBC(0x14e) CASEMBC(0x150) CASEMBC(0x1a0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
930 CASEMBC(0x1d1) CASEMBC(0x1ea) CASEMBC(0x1ec) CASEMBC(0x1ece)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
931 regmbc('O'); regmbc('\322'); regmbc('\323');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
932 regmbc('\324'); regmbc('\325'); regmbc('\326');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
933 regmbc('\330');
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
934 REGMBC(0x14c) REGMBC(0x14e) REGMBC(0x150)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
935 REGMBC(0x1a0) REGMBC(0x1d1) REGMBC(0x1ea)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
936 REGMBC(0x1ec) REGMBC(0x1ece)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
937 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
938 case 'P': case 0x1e54: case 0x1e56:
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
939 regmbc('P'); REGMBC(0x1e54) REGMBC(0x1e56)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
940 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
941 case 'R': CASEMBC(0x154) CASEMBC(0x156) CASEMBC(0x158)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
942 CASEMBC(0x1e58) CASEMBC(0x1e5e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
943 regmbc('R'); REGMBC(0x154) REGMBC(0x156) REGMBC(0x158)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
944 REGMBC(0x1e58) REGMBC(0x1e5e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
945 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
946 case 'S': CASEMBC(0x15a) CASEMBC(0x15c) CASEMBC(0x15e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
947 CASEMBC(0x160) CASEMBC(0x1e60)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
948 regmbc('S'); REGMBC(0x15a) REGMBC(0x15c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
949 REGMBC(0x15e) REGMBC(0x160) REGMBC(0x1e60)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
950 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
951 case 'T': CASEMBC(0x162) CASEMBC(0x164) CASEMBC(0x166)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
952 CASEMBC(0x1e6a) CASEMBC(0x1e6e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
953 regmbc('T'); REGMBC(0x162) REGMBC(0x164)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
954 REGMBC(0x166) REGMBC(0x1e6a) REGMBC(0x1e6e)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
955 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
956 case 'U': case '\331': case '\332': case '\333': case '\334':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
957 CASEMBC(0x168) CASEMBC(0x16a) CASEMBC(0x16c) CASEMBC(0x16e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
958 CASEMBC(0x170) CASEMBC(0x172) CASEMBC(0x1af) CASEMBC(0x1d3)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
959 CASEMBC(0x1ee6)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
960 regmbc('U'); regmbc('\331'); regmbc('\332');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
961 regmbc('\333'); regmbc('\334');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
962 REGMBC(0x168) REGMBC(0x16a) REGMBC(0x16c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
963 REGMBC(0x16e) REGMBC(0x170) REGMBC(0x172)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
964 REGMBC(0x1af) REGMBC(0x1d3) REGMBC(0x1ee6)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
965 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
966 case 'V': CASEMBC(0x1e7c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
967 regmbc('V'); REGMBC(0x1e7c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
968 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
969 case 'W': CASEMBC(0x174) CASEMBC(0x1e80) CASEMBC(0x1e82)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
970 CASEMBC(0x1e84) CASEMBC(0x1e86)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
971 regmbc('W'); REGMBC(0x174) REGMBC(0x1e80)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
972 REGMBC(0x1e82) REGMBC(0x1e84) REGMBC(0x1e86)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
973 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
974 case 'X': CASEMBC(0x1e8a) CASEMBC(0x1e8c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
975 regmbc('X'); REGMBC(0x1e8a) REGMBC(0x1e8c)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
976 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
977 case 'Y': case '\335':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
978 CASEMBC(0x176) CASEMBC(0x178) CASEMBC(0x1e8e) CASEMBC(0x1ef2)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
979 CASEMBC(0x1ef6) CASEMBC(0x1ef8)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
980 regmbc('Y'); regmbc('\335');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
981 REGMBC(0x176) REGMBC(0x178) REGMBC(0x1e8e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
982 REGMBC(0x1ef2) REGMBC(0x1ef6) REGMBC(0x1ef8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
983 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
984 case 'Z': CASEMBC(0x179) CASEMBC(0x17b) CASEMBC(0x17d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
985 CASEMBC(0x1b5) CASEMBC(0x1e90) CASEMBC(0x1e94)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
986 regmbc('Z'); REGMBC(0x179) REGMBC(0x17b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
987 REGMBC(0x17d) REGMBC(0x1b5) REGMBC(0x1e90)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
988 REGMBC(0x1e94)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
989 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
990 case 'a': case '\340': case '\341': case '\342':
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
991 case '\343': case '\344': case '\345':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
992 CASEMBC(0x101) CASEMBC(0x103) CASEMBC(0x105) CASEMBC(0x1ce)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
993 CASEMBC(0x1df) CASEMBC(0x1e1) CASEMBC(0x1ea3)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
994 regmbc('a'); regmbc('\340'); regmbc('\341');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
995 regmbc('\342'); regmbc('\343'); regmbc('\344');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
996 regmbc('\345');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
997 REGMBC(0x101) REGMBC(0x103) REGMBC(0x105)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
998 REGMBC(0x1ce) REGMBC(0x1df) REGMBC(0x1e1)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
999 REGMBC(0x1ea3)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1000 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1001 case 'b': CASEMBC(0x1e03) CASEMBC(0x1e07)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1002 regmbc('b'); REGMBC(0x1e03) REGMBC(0x1e07)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1003 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1004 case 'c': case '\347':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1005 CASEMBC(0x107) CASEMBC(0x109) CASEMBC(0x10b) CASEMBC(0x10d)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1006 regmbc('c'); regmbc('\347');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1007 REGMBC(0x107) REGMBC(0x109) REGMBC(0x10b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1008 REGMBC(0x10d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1009 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1010 case 'd': CASEMBC(0x10f) CASEMBC(0x111) CASEMBC(0x1d0b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1011 CASEMBC(0x1e11)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1012 regmbc('d'); REGMBC(0x10f) REGMBC(0x111)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1013 REGMBC(0x1e0b) REGMBC(0x01e0f) REGMBC(0x1e11)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1014 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1015 case 'e': case '\350': case '\351': case '\352': case '\353':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1016 CASEMBC(0x113) CASEMBC(0x115) CASEMBC(0x117) CASEMBC(0x119)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1017 CASEMBC(0x11b) CASEMBC(0x1ebb) CASEMBC(0x1ebd)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1018 regmbc('e'); regmbc('\350'); regmbc('\351');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1019 regmbc('\352'); regmbc('\353');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1020 REGMBC(0x113) REGMBC(0x115) REGMBC(0x117)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1021 REGMBC(0x119) REGMBC(0x11b) REGMBC(0x1ebb)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1022 REGMBC(0x1ebd)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1023 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1024 case 'f': CASEMBC(0x1e1f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1025 regmbc('f'); REGMBC(0x1e1f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1026 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1027 case 'g': CASEMBC(0x11d) CASEMBC(0x11f) CASEMBC(0x121)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1028 CASEMBC(0x123) CASEMBC(0x1e5) CASEMBC(0x1e7) CASEMBC(0x1f5)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1029 CASEMBC(0x1e21)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1030 regmbc('g'); REGMBC(0x11d) REGMBC(0x11f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1031 REGMBC(0x121) REGMBC(0x123) REGMBC(0x1e5)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1032 REGMBC(0x1e7) REGMBC(0x1f5) REGMBC(0x1e21)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1033 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1034 case 'h': CASEMBC(0x125) CASEMBC(0x127) CASEMBC(0x1e23)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1035 CASEMBC(0x1e27) CASEMBC(0x1e29) CASEMBC(0x1e96)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1036 regmbc('h'); REGMBC(0x125) REGMBC(0x127)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1037 REGMBC(0x1e23) REGMBC(0x1e27) REGMBC(0x1e29)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1038 REGMBC(0x1e96)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1039 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1040 case 'i': case '\354': case '\355': case '\356': case '\357':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1041 CASEMBC(0x129) CASEMBC(0x12b) CASEMBC(0x12d) CASEMBC(0x12f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1042 CASEMBC(0x1d0) CASEMBC(0x1ec9)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1043 regmbc('i'); regmbc('\354'); regmbc('\355');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1044 regmbc('\356'); regmbc('\357');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1045 REGMBC(0x129) REGMBC(0x12b) REGMBC(0x12d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1046 REGMBC(0x12f) REGMBC(0x1d0) REGMBC(0x1ec9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1047 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1048 case 'j': CASEMBC(0x135) CASEMBC(0x1f0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1049 regmbc('j'); REGMBC(0x135) REGMBC(0x1f0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1050 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1051 case 'k': CASEMBC(0x137) CASEMBC(0x1e9) CASEMBC(0x1e31)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1052 CASEMBC(0x1e35)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1053 regmbc('k'); REGMBC(0x137) REGMBC(0x1e9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1054 REGMBC(0x1e31) REGMBC(0x1e35)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1055 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1056 case 'l': CASEMBC(0x13a) CASEMBC(0x13c) CASEMBC(0x13e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1057 CASEMBC(0x140) CASEMBC(0x142) CASEMBC(0x1e3b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1058 regmbc('l'); REGMBC(0x13a) REGMBC(0x13c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1059 REGMBC(0x13e) REGMBC(0x140) REGMBC(0x142)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1060 REGMBC(0x1e3b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1061 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1062 case 'm': CASEMBC(0x1e3f) CASEMBC(0x1e41)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1063 regmbc('m'); REGMBC(0x1e3f) REGMBC(0x1e41)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1064 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1065 case 'n': case '\361':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1066 CASEMBC(0x144) CASEMBC(0x146) CASEMBC(0x148) CASEMBC(0x149)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1067 CASEMBC(0x1e45) CASEMBC(0x1e49)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1068 regmbc('n'); regmbc('\361');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1069 REGMBC(0x144) REGMBC(0x146) REGMBC(0x148)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1070 REGMBC(0x149) REGMBC(0x1e45) REGMBC(0x1e49)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1071 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1072 case 'o': case '\362': case '\363': case '\364': case '\365':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1073 case '\366': case '\370':
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1074 CASEMBC(0x14d) CASEMBC(0x14f) CASEMBC(0x151) CASEMBC(0x1a1)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1075 CASEMBC(0x1d2) CASEMBC(0x1eb) CASEMBC(0x1ed) CASEMBC(0x1ecf)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1076 regmbc('o'); regmbc('\362'); regmbc('\363');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1077 regmbc('\364'); regmbc('\365'); regmbc('\366');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1078 regmbc('\370');
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1079 REGMBC(0x14d) REGMBC(0x14f) REGMBC(0x151)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1080 REGMBC(0x1a1) REGMBC(0x1d2) REGMBC(0x1eb)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1081 REGMBC(0x1ed) REGMBC(0x1ecf)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1082 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1083 case 'p': CASEMBC(0x1e55) CASEMBC(0x1e57)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1084 regmbc('p'); REGMBC(0x1e55) REGMBC(0x1e57)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1085 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1086 case 'r': CASEMBC(0x155) CASEMBC(0x157) CASEMBC(0x159)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1087 CASEMBC(0x1e59) CASEMBC(0x1e5f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1088 regmbc('r'); REGMBC(0x155) REGMBC(0x157) REGMBC(0x159)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1089 REGMBC(0x1e59) REGMBC(0x1e5f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1090 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1091 case 's': CASEMBC(0x15b) CASEMBC(0x15d) CASEMBC(0x15f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1092 CASEMBC(0x161) CASEMBC(0x1e61)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1093 regmbc('s'); REGMBC(0x15b) REGMBC(0x15d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1094 REGMBC(0x15f) REGMBC(0x161) REGMBC(0x1e61)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1095 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1096 case 't': CASEMBC(0x163) CASEMBC(0x165) CASEMBC(0x167)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1097 CASEMBC(0x1e6b) CASEMBC(0x1e6f) CASEMBC(0x1e97)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1098 regmbc('t'); REGMBC(0x163) REGMBC(0x165) REGMBC(0x167)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1099 REGMBC(0x1e6b) REGMBC(0x1e6f) REGMBC(0x1e97)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1100 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1101 case 'u': case '\371': case '\372': case '\373': case '\374':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1102 CASEMBC(0x169) CASEMBC(0x16b) CASEMBC(0x16d) CASEMBC(0x16f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1103 CASEMBC(0x171) CASEMBC(0x173) CASEMBC(0x1b0) CASEMBC(0x1d4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1104 CASEMBC(0x1ee7)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1105 regmbc('u'); regmbc('\371'); regmbc('\372');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1106 regmbc('\373'); regmbc('\374');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1107 REGMBC(0x169) REGMBC(0x16b) REGMBC(0x16d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1108 REGMBC(0x16f) REGMBC(0x171) REGMBC(0x173)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1109 REGMBC(0x1b0) REGMBC(0x1d4) REGMBC(0x1ee7)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1110 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1111 case 'v': CASEMBC(0x1e7d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1112 regmbc('v'); REGMBC(0x1e7d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1113 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1114 case 'w': CASEMBC(0x175) CASEMBC(0x1e81) CASEMBC(0x1e83)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1115 CASEMBC(0x1e85) CASEMBC(0x1e87) CASEMBC(0x1e98)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1116 regmbc('w'); REGMBC(0x175) REGMBC(0x1e81)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1117 REGMBC(0x1e83) REGMBC(0x1e85) REGMBC(0x1e87)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1118 REGMBC(0x1e98)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1119 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1120 case 'x': CASEMBC(0x1e8b) CASEMBC(0x1e8d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1121 regmbc('x'); REGMBC(0x1e8b) REGMBC(0x1e8d)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1122 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1123 case 'y': case '\375': case '\377':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1124 CASEMBC(0x177) CASEMBC(0x1e8f) CASEMBC(0x1e99)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1125 CASEMBC(0x1ef3) CASEMBC(0x1ef7) CASEMBC(0x1ef9)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1126 regmbc('y'); regmbc('\375'); regmbc('\377');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1127 REGMBC(0x177) REGMBC(0x1e8f) REGMBC(0x1e99)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1128 REGMBC(0x1ef3) REGMBC(0x1ef7) REGMBC(0x1ef9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1129 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1130 case 'z': CASEMBC(0x17a) CASEMBC(0x17c) CASEMBC(0x17e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1131 CASEMBC(0x1b6) CASEMBC(0x1e91) CASEMBC(0x1e95)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1132 regmbc('z'); REGMBC(0x17a) REGMBC(0x17c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1133 REGMBC(0x17e) REGMBC(0x1b6) REGMBC(0x1e91)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1134 REGMBC(0x1e95)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1135 return;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1136 }
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
1137 #endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1138 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1139 regmbc(c);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1140 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1141
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1142 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1143 * Check for a collating element "[.a.]". "pp" points to the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1144 * Returns a character. Zero means that no item was recognized. Otherwise
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1145 * "pp" is advanced to after the item.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1146 * Currently only single characters are recognized!
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1147 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1148 static int
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1149 get_coll_element(pp)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1150 char_u **pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1151 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1152 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1153 int l = 1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1154 char_u *p = *pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1155
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1156 if (p[1] == '.')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1157 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1158 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1159 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
1160 l = (*mb_ptr2len)(p + 2);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1161 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1162 if (p[l + 2] == '.' && p[l + 3] == ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1163 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1164 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1165 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1166 c = mb_ptr2char(p + 2);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1167 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1168 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1169 c = p[2];
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1170 *pp += l + 4;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1171 return c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1172 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1173 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1174 return 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1175 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1176
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1177 static void get_cpo_flags __ARGS((void));
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1178 static int reg_cpo_lit; /* 'cpoptions' contains 'l' flag */
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1179 static int reg_cpo_bsl; /* 'cpoptions' contains '\' flag */
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1180
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1181 static void
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1182 get_cpo_flags()
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1183 {
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1184 reg_cpo_lit = vim_strchr(p_cpo, CPO_LITERAL) != NULL;
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1185 reg_cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL;
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1186 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1187
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1188 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1189 * Skip over a "[]" range.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1190 * "p" must point to the character after the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1191 * The returned pointer is on the matching ']', or the terminating NUL.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1192 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1193 static char_u *
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1194 skip_anyof(p)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1195 char_u *p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1196 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1197 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1198 int l;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1199 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1200
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1201 if (*p == '^') /* Complement of range. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1202 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1203 if (*p == ']' || *p == '-')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1204 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1205 while (*p != NUL && *p != ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1206 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1207 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
1208 if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1209 p += l;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1210 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1211 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1212 if (*p == '-')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1213 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1214 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1215 if (*p != ']' && *p != NUL)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1216 mb_ptr_adv(p);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1217 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1218 else if (*p == '\\'
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1219 && !reg_cpo_bsl
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1220 && (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1221 || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1222 p += 2;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1223 else if (*p == '[')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1224 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1225 if (get_char_class(&p) == CLASS_NONE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1226 && get_equi_class(&p) == 0
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1227 && get_coll_element(&p) == 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1228 ++p; /* It was not a class name */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1229 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1230 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1231 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1232 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1233
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1234 return p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1235 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1236
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1237 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 * Skip past regular expression.
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 41
diff changeset
1239 * Stop at end of "startp" or where "dirc" is found ('/', '?', etc).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 * Take care of characters with a backslash in front of it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 * Skip strings inside [ and ].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 * When "newp" is not NULL and "dirc" is '?', make an allocated copy of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 * expression and change "\?" to "?". If "*newp" is not NULL the expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 * is changed in-place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 skip_regexp(startp, dirc, magic, newp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 char_u *startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 int dirc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 char_u **newp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 int mymagic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 char_u *p = startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 if (magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 mymagic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 mymagic = MAGIC_OFF;
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1260 get_cpo_flags();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
1262 for (; p[0] != NUL; mb_ptr_adv(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 if (p[0] == dirc) /* found end of regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 if ((p[0] == '[' && mymagic >= MAGIC_ON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 || (p[0] == '\\' && p[1] == '[' && mymagic <= MAGIC_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 p = skip_anyof(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 if (p[0] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 else if (p[0] == '\\' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 if (dirc == '?' && newp != NULL && p[1] == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 /* change "\?" to "?", make a copy first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 if (*newp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 *newp = vim_strsave(startp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 if (*newp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 p = *newp + (p - startp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 if (*newp != NULL)
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
1285 STRMOVE(p, p + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 ++p; /* skip next character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 if (*p == 'v')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 mymagic = MAGIC_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 else if (*p == 'V')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 mymagic = MAGIC_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1300 static regprog_T *bt_regcomp __ARGS((char_u *expr, int re_flags));
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1301 static void bt_regfree __ARGS((regprog_T *prog));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1302
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1304 * bt_regcomp() - compile a regular expression into internal code for the
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1305 * traditional back track matcher.
41
f529edb9bab3 updated for version 7.0025
vimboss
parents: 39
diff changeset
1306 * Returns the program in allocated space. Returns NULL for an error.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 * We can't allocate space until we know how big the compiled form will be,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 * but we can't compile it (and thus know how big it is) until we've got a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 * place to put the code. So we cheat: we compile it twice, once with code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 * generation turned off and size counting turned on, and once "for real".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 * This also means that we don't allocate space until we are sure that the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 * thing really will compile successfully, and we never have to move the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 * code and thus invalidate pointers into it. (Note that it has to be in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 * one piece because vim_free() must be able to free it all.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 * Whether upper/lower case is to be ignored is decided when executing the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 * program, it does not matter here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 * Beware that the optimization-preparation code in here knows about some
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 * of the structure of the compiled regexp.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 * "re_flags": RE_MAGIC and/or RE_STRING.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1324 static regprog_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1325 bt_regcomp(expr, re_flags)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 char_u *expr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 int re_flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1329 bt_regprog_T *r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 char_u *longest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 if (expr == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 EMSG_RET_NULL(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 init_class_tab();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 * First pass: determine size, legality.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 regcomp_start(expr, re_flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 regcode = JUST_CALC_SIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 regc(REGMAGIC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 if (reg(REG_NOPAREN, &flags) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 /* Small enough for pointer-storage convention? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 #ifdef SMALL_MALLOC /* 16 bit storage allocation */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 if (regsize >= 65536L - 256L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 EMSG_RET_NULL(_("E339: Pattern too long"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 /* Allocate space. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1356 r = (bt_regprog_T *)lalloc(sizeof(bt_regprog_T) + regsize, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 if (r == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 * Second pass: emit code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 regcomp_start(expr, re_flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 regcode = r->program;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 regc(REGMAGIC);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1366 if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 vim_free(r);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1369 if (reg_toolong)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1370 EMSG_RET_NULL(_("E339: Pattern too long"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 /* Dig out information for optimizations. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 r->regstart = NUL; /* Worst-case defaults. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 r->reganch = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 r->regmust = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 r->regmlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 r->regflags = regflags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 if (flags & HASNL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 r->regflags |= RF_HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 if (flags & HASLOOKBH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 r->regflags |= RF_LOOKBH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 /* Remember whether this pattern has any \z specials in it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 r->reghasz = re_has_z;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 scan = r->program + 1; /* First BRANCH. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 if (OP(regnext(scan)) == END) /* Only one top-level choice. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 scan = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 /* Starting-point info. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 if (OP(scan) == BOL || OP(scan) == RE_BOF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 r->reganch++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 scan = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 if (OP(scan) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 r->regstart = (*mb_ptr2char)(OPERAND(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 r->regstart = *OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 else if ((OP(scan) == BOW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 || OP(scan) == EOW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 || OP(scan) == NOTHING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 && OP(regnext(scan)) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 r->regstart = (*mb_ptr2char)(OPERAND(regnext(scan)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 r->regstart = *OPERAND(regnext(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 * If there's something expensive in the r.e., find the longest
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 * literal string that must appear and make it the regmust. Resolve
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 * ties in favor of later strings, since the regstart check works
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 * with the beginning of the r.e. and avoiding duplication
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 * strengthens checking. Not a strong reason, but sufficient in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 * absence of others.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 * When the r.e. starts with BOW, it is faster to look for a regmust
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 * first. Used a lot for "#" and "*" commands. (Added by mool).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 if ((flags & SPSTART || OP(scan) == BOW || OP(scan) == EOW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 && !(flags & HASNL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 longest = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 for (; scan != NULL; scan = regnext(scan))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 longest = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 len = (int)STRLEN(OPERAND(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 r->regmust = longest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 r->regmlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1451 #ifdef BT_REGEXP_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 regdump(expr, r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1454 r->engine = &bt_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1455 return (regprog_T *)r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 /*
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1459 * Free a compiled regexp program, returned by bt_regcomp().
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1460 */
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1461 static void
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1462 bt_regfree(prog)
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1463 regprog_T *prog;
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1464 {
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1465 vim_free(prog);
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1466 }
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1467
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
1468 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 * Setup to parse the regexp. Used once to get the length and once to do it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 regcomp_start(expr, re_flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 char_u *expr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 int re_flags; /* see vim_regcomp() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 initchr(expr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 if (re_flags & RE_MAGIC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 reg_magic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 reg_magic = MAGIC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 reg_string = (re_flags & RE_STRING);
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
1482 reg_strict = (re_flags & RE_STRICT);
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
1483 get_cpo_flags();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 num_complex_braces = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 regnpar = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 vim_memset(had_endbrace, 0, sizeof(had_endbrace));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 regnzpar = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 re_has_z = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 regsize = 0L;
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1493 reg_toolong = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 regflags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 had_eol = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 * Check if during the previous call to vim_regcomp the EOL item "$" has been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 * found. This is messy, but it works fine.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 vim_regcomp_had_eol()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 return had_eol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1513 * Parse regular expression, i.e. main body or parenthesized thing.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 * Caller must absorb opening parenthesis.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 * Combining parenthesis handling with the base level of regular expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 * is a trifle forced, but the need to tie the tails of the branches to what
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 * follows makes it hard to avoid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 reg(paren, flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 int paren; /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 char_u *br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 char_u *ender;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 int parno = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 *flagp = HASWIDTH; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 if (paren == REG_ZPAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 /* Make a ZOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 if (regnzpar >= NSUBEXP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 EMSG_RET_NULL(_("E50: Too many \\z("));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 parno = regnzpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 regnzpar++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 ret = regnode(ZOPEN + parno);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 if (paren == REG_PAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 /* Make a MOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 if (regnpar >= NSUBEXP)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1550 EMSG2_RET_NULL(_("E51: Too many %s("), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 parno = regnpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 ++regnpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 ret = regnode(MOPEN + parno);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 else if (paren == REG_NPAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 /* Make a NOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 ret = regnode(NOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561 ret = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 /* Pick up the branches, linking them together. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 br = regbranch(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 if (br == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 if (ret != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 regtail(ret, br); /* [MZ]OPEN -> first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 ret = br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 /* If one of the branches can be zero-width, the whole thing can.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 * If one of the branches has * at start or matches a line-break, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 * whole thing can. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 if (!(flags & HASWIDTH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 *flagp &= ~HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 while (peekchr() == Magic('|'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 br = regbranch(&flags);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1581 if (br == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 regtail(ret, br); /* BRANCH -> BRANCH. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 if (!(flags & HASWIDTH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 *flagp &= ~HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 /* Make a closing node, and hook it on the end. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 ender = regnode(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 paren == REG_ZPAREN ? ZCLOSE + parno :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 paren == REG_PAREN ? MCLOSE + parno :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 paren == REG_NPAREN ? NCLOSE : END);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 regtail(ret, ender);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 /* Hook the tails of the branches to the closing node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 for (br = ret; br != NULL; br = regnext(br))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 regoptail(br, ender);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 /* Check for proper termination. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 if (paren != REG_NOPAREN && getchr() != Magic(')'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 if (paren == REG_ZPAREN)
308
74e9d19831c2 updated for version 7.0081
vimboss
parents: 297
diff changeset
1607 EMSG_RET_NULL(_("E52: Unmatched \\z("));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 if (paren == REG_NPAREN)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1611 EMSG2_RET_NULL(_(e_unmatchedpp), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612 else
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1613 EMSG2_RET_NULL(_(e_unmatchedp), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 else if (paren == REG_NOPAREN && peekchr() != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 if (curchr == Magic(')'))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1618 EMSG2_RET_NULL(_(e_unmatchedpar), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 else
308
74e9d19831c2 updated for version 7.0081
vimboss
parents: 297
diff changeset
1620 EMSG_RET_NULL(_(e_trailing)); /* "Can't happen". */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 * Here we set the flag allowing back references to this set of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 * parentheses.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 if (paren == REG_PAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 had_endbrace[parno] = TRUE; /* have seen the close paren */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1633 * Parse one alternative of an | operator.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 * Implements the & operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 regbranch(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 char_u *chain = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 char_u *latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 *flagp = WORST | HASNL; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647 ret = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 latest = regconcat(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 if (latest == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 /* If one of the branches has width, the whole thing has. If one of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 * the branches anchors at start-of-line, the whole thing does.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 * If one of the branches uses look-behind, the whole thing does. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 *flagp |= flags & (HASWIDTH | SPSTART | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 /* If one of the branches doesn't match a line-break, the whole thing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 * doesn't. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 *flagp &= ~HASNL | (flags & HASNL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 if (chain != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 regtail(chain, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 if (peekchr() != Magic('&'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 regtail(latest, regnode(END)); /* operand ends */
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1666 if (reg_toolong)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1667 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 reginsert(MATCH, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 chain = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1676 * Parse one alternative of an | or & operator.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 * Implements the concatenation operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 regconcat(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 char_u *first = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 char_u *chain = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 char_u *latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 int cont = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 *flagp = WORST; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 while (cont)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 switch (peekchr())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 case Magic('|'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 case Magic('&'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 case Magic(')'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 cont = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 case Magic('Z'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 regflags |= RF_ICOMBINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 case Magic('c'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 regflags |= RF_ICASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 case Magic('C'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712 regflags |= RF_NOICASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 case Magic('v'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 reg_magic = MAGIC_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 case Magic('m'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 reg_magic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 case Magic('M'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 reg_magic = MAGIC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 case Magic('V'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 reg_magic = MAGIC_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1732 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 latest = regpiece(&flags);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1737 if (latest == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739 *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 if (chain == NULL) /* First piece. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 *flagp |= flags & SPSTART;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 regtail(chain, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 chain = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 if (first == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 first = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 if (first == NULL) /* Loop ran zero times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 first = regnode(NOTHING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 return first;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1756 * Parse something followed by possible [*+=].
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 * Note that the branching code sequences used for = and the general cases
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 * of * and + are somewhat optimized: they use the same NOTHING node as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 * both the endmarker for their branch list and the body of the last branch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 * It might seem that this node could be dispensed with entirely, but the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 * endmarker role is not redundant.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 regpiece(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 char_u *next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 long minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 long maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 ret = regatom(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 op = peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 if (re_multi_type(op) == NOT_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 *flagp = flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 /* default flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 *flagp = (WORST | SPSTART | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 switch (op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 case Magic('*'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 reginsert(STAR, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 /* Emit x* as (x&|), where & means "self". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 reginsert(BRANCH, ret); /* Either x */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 regoptail(ret, regnode(BACK)); /* and loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 regoptail(ret, ret); /* back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 regtail(ret, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 regtail(ret, regnode(NOTHING)); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 case Magic('+'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 reginsert(PLUS, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 /* Emit x+ as x(&|), where & means "self". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 next = regnode(BRANCH); /* Either */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 regtail(ret, next);
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
1813 regtail(regnode(BACK), ret); /* loop back */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 regtail(next, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 regtail(ret, regnode(NOTHING)); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 *flagp = (WORST | HASWIDTH | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 case Magic('@'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 int lop = END;
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1823 int nr;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1824
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1825 nr = getdecchrs();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 switch (no_Magic(getchr()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 case '=': lop = MATCH; break; /* \@= */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 case '!': lop = NOMATCH; break; /* \@! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 case '>': lop = SUBPAT; break; /* \@> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 case '<': switch (no_Magic(getchr()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 case '=': lop = BEHIND; break; /* \@<= */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 case '!': lop = NOBEHIND; break; /* \@<! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 if (lop == END)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1838 EMSG2_RET_NULL(_("E59: invalid character after %s@"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 /* Look behind must match with behind_pos. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 if (lop == BEHIND || lop == NOBEHIND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 regtail(ret, regnode(BHPOS));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 *flagp |= HASLOOKBH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 regtail(ret, regnode(END)); /* operand ends */
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1847 if (lop == BEHIND || lop == NOBEHIND)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1848 {
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1849 if (nr < 0)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1850 nr = 0; /* no limit is same as zero limit */
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1851 reginsert_nr(lop, nr, ret);
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1852 }
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1853 else
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
1854 reginsert(lop, ret);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 case Magic('?'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 case Magic('='):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 /* Emit x= as (x|) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 reginsert(BRANCH, ret); /* Either x */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 regtail(ret, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 next = regnode(NOTHING); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 regtail(ret, next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 regoptail(ret, next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 case Magic('{'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 if (!read_limits(&minval, &maxval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 reginsert(BRACE_SIMPLE, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 if (num_complex_braces >= 10)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1879 EMSG2_RET_NULL(_("E60: Too many complex %s{...}s"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 reginsert(BRACE_COMPLEX + num_complex_braces, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 regoptail(ret, regnode(BACK));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 regoptail(ret, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 ++num_complex_braces;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 if (minval > 0 && maxval > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 *flagp = (HASWIDTH | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 if (re_multi_type(peekchr()) != NOT_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 /* Can't have a multi follow a multi. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 if (peekchr() == Magic('*'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 sprintf((char *)IObuff, _("E61: Nested %s*"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 reg_magic >= MAGIC_ON ? "" : "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 sprintf((char *)IObuff, _("E62: Nested %s%c"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 reg_magic == MAGIC_ALL ? "" : "\\", no_Magic(peekchr()));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 EMSG_RET_NULL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1906 /* When making changes to classchars also change nfa_classcodes. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1907 static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU";
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1908 static int classcodes[] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1909 ANY, IDENT, SIDENT, KWORD, SKWORD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1910 FNAME, SFNAME, PRINT, SPRINT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1911 WHITE, NWHITE, DIGIT, NDIGIT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1912 HEX, NHEX, OCTAL, NOCTAL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1913 WORD, NWORD, HEAD, NHEAD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1914 ALPHA, NALPHA, LOWER, NLOWER,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1915 UPPER, NUPPER
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1916 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1917
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1919 * Parse the lowest level.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 * Optimization: gobbles an entire sequence of ordinary characters so that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 * it can turn them into a single node, which is smaller to store and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 * faster to run. Don't do this when one_exactly is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 regatom(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 int extra = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 *flagp = WORST; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 case Magic('^'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 ret = regnode(BOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 case Magic('$'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 ret = regnode(EOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 had_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 case Magic('<'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 ret = regnode(BOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 case Magic('>'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 ret = regnode(EOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 case Magic('_'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 if (c == '^') /* "\_^" is start-of-line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 ret = regnode(BOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 if (c == '$') /* "\_$" is end-of-line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 ret = regnode(EOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 had_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 extra = ADD_NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 *flagp |= HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 /* "\_[" is character range plus newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 if (c == '[')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 goto collection;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 /* "\_x" is character class plus newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 * Character classes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 case Magic('.'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 case Magic('i'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 case Magic('I'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 case Magic('k'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 case Magic('K'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 case Magic('f'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 case Magic('F'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 case Magic('p'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 case Magic('P'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 case Magic('s'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 case Magic('S'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 case Magic('d'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 case Magic('D'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 case Magic('x'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 case Magic('X'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 case Magic('o'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 case Magic('O'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 case Magic('w'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 case Magic('W'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 case Magic('h'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 case Magic('H'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 case Magic('a'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010 case Magic('A'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 case Magic('l'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012 case Magic('L'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 case Magic('u'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 case Magic('U'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 p = vim_strchr(classchars, no_Magic(c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 EMSG_RET_NULL(_("E63: invalid use of \\_"));
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2018 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2019 /* When '.' is followed by a composing char ignore the dot, so that
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2020 * the composing char is matched here. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2021 if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr()))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2022 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2023 c = getchr();
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2024 goto do_multibyte;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2025 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2026 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 ret = regnode(classcodes[p - classchars] + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 case Magic('n'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 if (reg_string)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2034 /* In a string "\n" matches a newline character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2036 regc(NL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2038 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2042 /* In buffer text "\n" matches the end of a line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043 ret = regnode(NEWL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 *flagp |= HASWIDTH | HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 case Magic('('):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 ret = reg(REG_PAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 case Magic('|'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 case Magic('&'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 case Magic(')'):
1468
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
2061 if (one_exactly)
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
2062 EMSG_ONE_RET_NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 EMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 case Magic('='):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 case Magic('?'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 case Magic('+'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 case Magic('@'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 case Magic('{'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 case Magic('*'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 c = no_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 sprintf((char *)IObuff, _("E64: %s%c follows nothing"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 (c == '*' ? reg_magic >= MAGIC_ON : reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 ? "" : "\\", c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 EMSG_RET_NULL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 case Magic('~'): /* previous substitute pattern */
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
2080 if (reg_prev_sub != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 char_u *lp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 lp = reg_prev_sub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 while (*lp != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 regc(*lp++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 if (*reg_prev_sub != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 *flagp |= HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 if ((lp - reg_prev_sub) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 *flagp |= SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 EMSG_RET_NULL(_(e_nopresub));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 case Magic('1'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 case Magic('2'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 case Magic('3'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 case Magic('4'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 case Magic('5'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105 case Magic('6'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 case Magic('7'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 case Magic('8'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 case Magic('9'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 int refnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 refnum = c - Magic('0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 * Check if the back reference is legal. We must have seen the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 * close brace.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 * TODO: Should also check that we don't refer to something
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 * that is repeated (+*=): what instance of the repetition
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 * should we match?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 if (!had_endbrace[refnum])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 /* Trick: check if "@<=" or "@<!" follows, in which case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 * the \1 can appear before the referenced match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 for (p = regparse; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 if (p[0] == '@' && p[1] == '<'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 && (p[2] == '!' || p[2] == '='))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 EMSG_RET_NULL(_("E65: Illegal back reference"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 ret = regnode(BACKREF + refnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 case Magic('z'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 {
741
ac1f1e69c50d updated for version 7.0222
vimboss
parents: 714
diff changeset
2140 #ifdef FEAT_SYN_HL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 case '(': if (reg_do_extmatch != REX_SET)
4688
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2142 EMSG_RET_NULL(_(e_z_not_allowed));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 ret = reg(REG_ZPAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 *flagp |= flags & (HASWIDTH|SPSTART|HASNL|HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 re_has_z = REX_SET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 case '1':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 case '2':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 case '3':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 case '4':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 case '5':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 case '6':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 case '7':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 case '8':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 case '9': if (reg_do_extmatch != REX_USE)
4688
371cc0c44097 updated for version 7.3.1091
Bram Moolenaar <bram@vim.org>
parents: 4682
diff changeset
2161 EMSG_RET_NULL(_(e_z1_not_allowed));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 ret = regnode(ZREF + c - '0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 re_has_z = REX_USE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 break;
741
ac1f1e69c50d updated for version 7.0222
vimboss
parents: 714
diff changeset
2165 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 case 's': ret = regnode(MOPEN + 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 case 'e': ret = regnode(MCLOSE + 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 default: EMSG_RET_NULL(_("E68: Invalid character after \\z"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 case Magic('%'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 /* () without a back reference */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 case '(':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 ret = reg(REG_NPAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 /* Catch \%^ and \%$ regardless of where they appear in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 * pattern -- regardless of whether or not it makes sense. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 case '^':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 ret = regnode(RE_BOF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 case '$':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 ret = regnode(RE_EOF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 case '#':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 ret = regnode(CURSOR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2207 case 'V':
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2208 ret = regnode(RE_VISUAL);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2209 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2210
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 /* \%[abc]: Emit as a list of branches, all ending at the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 * branch which matches nothing. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 case '[':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 if (one_exactly) /* doesn't nest */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 char_u *lastbranch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 char_u *lastnode = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 char_u *br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 ret = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 while ((c = getchr()) != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 if (c == NUL)
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
2225 EMSG2_RET_NULL(_(e_missing_sb),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 br = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 ret = br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 regtail(lastnode, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 ungetchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 one_exactly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 lastnode = regatom(flagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 one_exactly = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 if (lastnode == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 if (ret == NULL)
4760
532a9855bd30 updated for version 7.3.1127
Bram Moolenaar <bram@vim.org>
parents: 4746
diff changeset
2241 EMSG2_RET_NULL(_(e_empty_sb),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 lastbranch = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 br = regnode(NOTHING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 if (ret != JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 regtail(lastnode, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 regtail(lastbranch, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 /* connect all branches to the NOTHING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 * branch at the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 for (br = ret; br != lastnode; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 if (OP(br) == BRANCH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 regtail(br, lastbranch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256 br = OPERAND(br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 br = regnext(br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 }
1701
4577899b8ff1 updated for version 7.2c-003
vimboss
parents: 1621
diff changeset
2262 *flagp &= ~(HASWIDTH | SIMPLE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2266 case 'd': /* %d123 decimal */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2267 case 'o': /* %o123 octal */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2268 case 'x': /* %xab hex 2 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2269 case 'u': /* %uabcd hex 4 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2270 case 'U': /* %U1234abcd hex 8 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2271 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2272 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2273
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2274 switch (c)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2275 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2276 case 'd': i = getdecchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2277 case 'o': i = getoctchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2278 case 'x': i = gethexchrs(2); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2279 case 'u': i = gethexchrs(4); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2280 case 'U': i = gethexchrs(8); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2281 default: i = -1; break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2282 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2283
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2284 if (i < 0)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2285 EMSG2_RET_NULL(
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2286 _("E678: Invalid character after %s%%[dxouU]"),
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2287 reg_magic == MAGIC_ALL);
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2288 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2289 if (use_multibytecode(i))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2290 ret = regnode(MULTIBYTECODE);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2291 else
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2292 #endif
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2293 ret = regnode(EXACTLY);
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2294 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2295 regc(0x0a);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2296 else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2297 #ifdef FEAT_MBYTE
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2298 regmbc(i);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2299 #else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2300 regc(i);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2301 #endif
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2302 regc(NUL);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2303 *flagp |= HASWIDTH;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2304 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2305 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2306
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 default:
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2308 if (VIM_ISDIGIT(c) || c == '<' || c == '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2309 || c == '\'')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 long_u n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 int cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 cmp = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 if (cmp == '<' || cmp == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 while (VIM_ISDIGIT(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 n = n * 10 + (c - '0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 }
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2322 if (c == '\'' && n == 0)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2323 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2324 /* "\%'m", "\%<'m" and "\%>'m": Mark */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2325 c = getchr();
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2326 ret = regnode(RE_MARK);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2327 if (ret == JUST_CALC_SIZE)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2328 regsize += 2;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2329 else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2330 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2331 *regcode++ = c;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2332 *regcode++ = cmp;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2333 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2334 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2335 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2336 else if (c == 'l' || c == 'c' || c == 'v')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 if (c == 'l')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 ret = regnode(RE_LNUM);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 else if (c == 'c')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 ret = regnode(RE_COL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 ret = regnode(RE_VCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 if (ret == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 regsize += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 /* put the number and the optional
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 * comparator after the opcode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 regcode = re_put_long(regcode, n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 *regcode++ = cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2357 EMSG2_RET_NULL(_("E71: Invalid character after %s%%"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 case Magic('['):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 collection:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 char_u *lp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 * If there is no matching ']', we assume the '[' is a normal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 * character. This makes 'incsearch' and ":help [" work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 lp = skip_anyof(regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 if (*lp == ']') /* there is a matching ']' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 int startc = -1; /* > 0 when next '-' is a range */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 int endc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 * In a character class, different parsing rules apply.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 * Not even \ is special anymore, nothing is.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382 if (*regparse == '^') /* Complement of range. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 ret = regnode(ANYBUT + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 ret = regnode(ANYOF + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 /* At the start ']' and '-' mean the literal character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 if (*regparse == ']' || *regparse == '-')
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2392 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2393 startc = *regparse;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 regc(*regparse++);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2395 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 while (*regparse != NUL && *regparse != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 if (*regparse == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 ++regparse;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 /* The '-' is not used for a range at the end and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 * after or before a '\n'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 if (*regparse == ']' || *regparse == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 || startc == -1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 || (regparse[0] == '\\' && regparse[1] == 'n'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 regc('-');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 startc = '-'; /* [--x] is a range */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2413 /* Also accept "a-[.z.]" */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2414 endc = 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2415 if (*regparse == '[')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2416 endc = get_coll_element(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2417 if (endc == 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2418 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 #ifdef FEAT_MBYTE
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2420 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2421 endc = mb_ptr2char_adv(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2422 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 #endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2424 endc = *regparse++;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2425 }
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2426
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2427 /* Handle \o40, \x20 and \u20AC style sequences */
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
2428 if (endc == '\\' && !reg_cpo_lit && !reg_cpo_bsl)
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2429 endc = coll_get_char();
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2430
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 if (startc > endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 EMSG_RET_NULL(_(e_invrange));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 if (has_mbyte && ((*mb_char2len)(startc) > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 || (*mb_char2len)(endc) > 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 /* Limit to a range of 256 chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 if (endc > startc + 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 EMSG_RET_NULL(_(e_invrange));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 while (++startc <= endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2441 regmbc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 int alpha_only = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 /* for alphabetical range skip the gaps
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 * 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 if (isalpha(startc) && isalpha(endc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 alpha_only = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 while (++startc <= endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 if (!alpha_only || isalpha(startc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 * Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 * accepts "\t", "\e", etc., but only when the 'l' flag in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 * 'cpoptions' is not included.
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2467 * Posix doesn't recognize backslash at all.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 else if (*regparse == '\\'
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
2470 && !reg_cpo_bsl
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
4744
a62695305e03 updated for version 7.3.1119
Bram Moolenaar <bram@vim.org>
parents: 4732
diff changeset
2472 || (!reg_cpo_lit
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 && vim_strchr(REGEXP_ABBR,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 regparse[1]) != NULL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 if (*regparse == 'n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 /* '\n' in range: also match NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 if (ret != JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 {
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2482 /* Using \n inside [^] does not change what
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2483 * matches. "[^\n]" is the same as ".". */
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2484 if (*ret == ANYOF)
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2485 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 *ret = ANYOF + ADD_NL;
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2487 *flagp |= HASNL;
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2488 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 /* else: must have had a \n already */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 }
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2494 else if (*regparse == 'd'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2495 || *regparse == 'o'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2496 || *regparse == 'x'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2497 || *regparse == 'u'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2498 || *regparse == 'U')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2499 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2500 startc = coll_get_char();
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2501 if (startc == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2502 regc(0x0a);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2503 else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2504 #ifdef FEAT_MBYTE
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2505 regmbc(startc);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2506 #else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2507 regc(startc);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2508 #endif
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2509 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 startc = backslash_trans(*regparse++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 else if (*regparse == '[')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 int c_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 int cu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2521 c_class = get_char_class(&regparse);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 /* Characters assumed to be 8 bits! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 switch (c_class)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 case CLASS_NONE:
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2527 c_class = get_equi_class(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2528 if (c_class != 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2529 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2530 /* produce equivalence class */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2531 reg_equi_class(c_class);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2532 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2533 else if ((c_class =
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2534 get_coll_element(&regparse)) != 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2535 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2536 /* produce a collating element */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2537 regmbc(c_class);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2538 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2539 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2540 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2541 /* literal '[', allow [[-x] as a range */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2542 startc = *regparse++;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2543 regc(startc);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2544 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 case CLASS_ALNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 if (isalnum(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 case CLASS_ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 if (isalpha(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 case CLASS_BLANK:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 regc(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 regc('\t');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 case CLASS_CNTRL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 if (iscntrl(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 case CLASS_DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 if (VIM_ISDIGIT(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 case CLASS_GRAPH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 if (isgraph(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 case CLASS_LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576 for (cu = 1; cu <= 255; cu++)
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
2577 if (MB_ISLOWER(cu))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 case CLASS_PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 if (vim_isprintc(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 case CLASS_PUNCT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 if (ispunct(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 case CLASS_SPACE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 for (cu = 9; cu <= 13; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 regc(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 case CLASS_UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 for (cu = 1; cu <= 255; cu++)
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
2597 if (MB_ISUPPER(cu))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 case CLASS_XDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 if (vim_isxdigit(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 case CLASS_TAB:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 regc('\t');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 case CLASS_RETURN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 regc('\r');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 case CLASS_BACKSPACE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 regc('\b');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 case CLASS_ESCAPE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 regc('\033');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 /* produce a multibyte character, including any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 * following composing characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 startc = mb_ptr2char(regparse);
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
2629 len = (*mb_ptr2len)(regparse);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 if (enc_utf8 && utf_char2len(startc) != len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 startc = -1; /* composing chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 while (--len >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 regc(*regparse++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 startc = *regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 prevchr_len = 1; /* last char was the ']' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 if (*regparse != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 EMSG_RET_NULL(_(e_toomsbra)); /* Cannot happen? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 skipchr(); /* let's be friends with the lexer again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 }
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
2651 else if (reg_strict)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2652 EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 /* A multi-byte character is handled as a separate atom if it's
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2662 * before a multi and when it's a composing char. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2663 if (use_multibytecode(c))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2665 do_multibyte:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 ret = regnode(MULTIBYTECODE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 regmbc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 * Append characters as long as:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 * - there is no following multi, we then need the character in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 * front of it as a single character operand
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 * - not running into a Magic character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 * - "one_exactly" is not set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 * But always emit at least one character. Might be a Multi,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 * e.g., a "[" without matching "]".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 for (len = 0; c != NUL && (len == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 || (re_multi_type(peekchr()) == NOT_MULTI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 && !one_exactly
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 && !is_Magic(c))); ++len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689 c = no_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693 regmbc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2698 /* Need to get composing character too. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2701 l = utf_ptr2len(regparse);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2702 if (!UTF_COMPOSINGLIKE(regparse, regparse + l))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 break;
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2704 regmbc(utf_ptr2char(regparse));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2705 skipchr();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 regc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 ungetchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717 *flagp |= HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 if (len == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 *flagp |= SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2727 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2728 /*
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2729 * Return TRUE if MULTIBYTECODE should be used instead of EXACTLY for
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2730 * character "c".
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2731 */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2732 static int
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2733 use_multibytecode(c)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2734 int c;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2735 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2736 return has_mbyte && (*mb_char2len)(c) > 1
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2737 && (re_multi_type(peekchr()) != NOT_MULTI
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2738 || (enc_utf8 && utf_iscomposing(c)));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2739 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2740 #endif
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2741
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2743 * Emit a node.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 * Return pointer to generated code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 regnode(op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 ret = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 if (ret == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 regsize += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 *regcode++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 *regcode++ = NUL; /* Null "next" pointer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 *regcode++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 * Emit (if appropriate) a byte of code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 regc(b)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 int b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 regsize++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 *regcode++ = b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 * Emit (if appropriate) a multi-byte character of code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 regmbc(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 {
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
2785 if (!has_mbyte && c > 0xff)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
2786 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 regsize += (*mb_char2len)(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 regcode += (*mb_char2bytes)(c, regcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2795 * Insert an operator in front of already-emitted operand
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 * Means relocating the operand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 reginsert(op, opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 char_u *place;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 regsize += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 src = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 regcode += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 dst = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 while (src > opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 *--dst = *--src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 place = opnd; /* Op node, where operand used to be. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 *place++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 *place = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2826 * Insert an operator in front of already-emitted operand.
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2827 * Add a number to the operator.
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2828 */
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2829 static void
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2830 reginsert_nr(op, val, opnd)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2831 int op;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2832 long val;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2833 char_u *opnd;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2834 {
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2835 char_u *src;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2836 char_u *dst;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2837 char_u *place;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2838
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2839 if (regcode == JUST_CALC_SIZE)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2840 {
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2841 regsize += 7;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2842 return;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2843 }
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2844 src = regcode;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2845 regcode += 7;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2846 dst = regcode;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2847 while (src > opnd)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2848 *--dst = *--src;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2849
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2850 place = opnd; /* Op node, where operand used to be. */
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2851 *place++ = op;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2852 *place++ = NUL;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2853 *place++ = NUL;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2854 place = re_put_long(place, (long_u)val);
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2855 }
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2856
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2857 /*
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
2858 * Insert an operator in front of already-emitted operand.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 * The operator has the given limit values as operands. Also set next pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 * Means relocating the operand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 reginsert_limits(op, minval, maxval, opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 long minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 long maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 char_u *place;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 regsize += 11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 src = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 regcode += 11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 dst = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 while (src > opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 *--dst = *--src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 place = opnd; /* Op node, where operand used to be. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 *place++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 place = re_put_long(place, (long_u)minval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 place = re_put_long(place, (long_u)maxval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 regtail(opnd, place);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 * Write a long as four bytes at "p" and return pointer to the next char.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 re_put_long(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 long_u val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 *p++ = (char_u) ((val >> 24) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 *p++ = (char_u) ((val >> 16) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 *p++ = (char_u) ((val >> 8) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 *p++ = (char_u) (val & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2910 * Set the next-pointer at the end of a node chain.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 regtail(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 char_u *val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 char_u *temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 int offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 if (p == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 /* Find last node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 scan = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 temp = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 if (temp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 scan = temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
2934 if (OP(scan) == BACK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 offset = (int)(scan - val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 offset = (int)(val - scan);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2938 /* When the offset uses more than 16 bits it can no longer fit in the two
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
2939 * bytes available. Use a global flag to avoid having to check return
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2940 * values in too many places. */
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2941 if (offset > 0xffff)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2942 reg_toolong = TRUE;
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2943 else
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2944 {
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2945 *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2946 *(scan + 2) = (char_u) (offset & 0377);
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2947 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2951 * Like regtail, on item after a BRANCH; nop if none.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 regoptail(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 char_u *val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958 /* When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 if (p == NULL || p == JUST_CALC_SIZE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 || (OP(p) != BRANCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 regtail(OPERAND(p), val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2967 * Functions for getting characters from the regexp input.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 static int at_start; /* True when on the first character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 static int prev_at_start; /* True when on the second character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2973 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2974 * Start parsing at "str".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2975 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 initchr(str)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 regparse = str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 prevchr_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 curchr = prevprevchr = prevchr = nextchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 at_start = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2987 /*
4679
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2988 * Save the current parse state, so that it can be restored and parsing
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2989 * starts in the same state again.
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2990 */
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2991 static void
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2992 save_parse_state(ps)
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2993 parse_state_T *ps;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2994 {
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2995 ps->regparse = regparse;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2996 ps->prevchr_len = prevchr_len;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2997 ps->curchr = curchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2998 ps->prevchr = prevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
2999 ps->prevprevchr = prevprevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3000 ps->nextchr = nextchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3001 ps->at_start = at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3002 ps->prev_at_start = prev_at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3003 ps->regnpar = regnpar;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3004 }
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3005
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3006 /*
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3007 * Restore a previously saved parse state.
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3008 */
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3009 static void
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3010 restore_parse_state(ps)
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3011 parse_state_T *ps;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3012 {
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3013 regparse = ps->regparse;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3014 prevchr_len = ps->prevchr_len;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3015 curchr = ps->curchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3016 prevchr = ps->prevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3017 prevprevchr = ps->prevprevchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3018 nextchr = ps->nextchr;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3019 at_start = ps->at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3020 prev_at_start = ps->prev_at_start;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3021 regnpar = ps->regnpar;
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3022 }
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3023
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3024
4d92b873acef updated for version 7.3.1087
Bram Moolenaar <bram@vim.org>
parents: 4579
diff changeset
3025 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3026 * Get the next character without advancing.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3027 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3029 peekchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3031 static int after_slash = FALSE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3032
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 if (curchr == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 switch (curchr = regparse[0])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 case '[':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 /* magic when 'magic' is on */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 if (reg_magic >= MAGIC_ON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 curchr = Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 case '(':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 case ')':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 case '%':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 case '+':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 case '=':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 case '?':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 case '@':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 case '!':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 case '&':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 case '|':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 case '<':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 case '>':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 case '#': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 case '"': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 case '\'': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 case ',': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 case '-': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 case ':': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 case ';': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 case '`': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 case '/': /* Can't be used in / command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 /* magic only after "\v" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 if (reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 curchr = Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 case '*':
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3071 /* * is not magic as the very first character, eg "?*ptr", when
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3072 * after '^', eg "/^*ptr" and when after "\(", "\|", "\&". But
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3073 * "\(\*" is not magic, thus must be magic if "after_slash" */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3074 if (reg_magic >= MAGIC_ON
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3075 && !at_start
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3076 && !(prev_at_start && prevchr == Magic('^'))
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3077 && (after_slash
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3078 || (prevchr != Magic('(')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3079 && prevchr != Magic('&')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3080 && prevchr != Magic('|'))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 curchr = Magic('*');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083 case '^':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 /* '^' is only magic as the very first character and if it's after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 * "\(", "\|", "\&' or "\n" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086 if (reg_magic >= MAGIC_OFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 && (at_start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 || reg_magic == MAGIC_ALL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089 || prevchr == Magic('(')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 || prevchr == Magic('|')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 || prevchr == Magic('&')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 || prevchr == Magic('n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 || (no_Magic(prevchr) == '('
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094 && prevprevchr == Magic('%'))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096 curchr = Magic('^');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 at_start = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 case '$':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 /* '$' is only magic as the very last char and if it's in front of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 * either "\|", "\)", "\&", or "\n" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 if (reg_magic >= MAGIC_OFF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 char_u *p = regparse + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 /* ignore \c \C \m and \M after '$' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 || p[1] == 'm' || p[1] == 'M' || p[1] == 'Z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 if (p[0] == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 || (p[0] == '\\'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 && (p[1] == '|' || p[1] == '&' || p[1] == ')'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 || p[1] == 'n'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 || reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 curchr = Magic('$');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3121 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 int c = regparse[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 curchr = '\\'; /* trailing '\' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 else if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 vim_strchr(META, c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 c <= '~' && META_flags[c]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 * META contains everything that may be magic sometimes,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 * except ^ and $ ("\^" and "\$" are only magic after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 * "\v"). We now fetch the next character and toggle its
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 * magicness. Therefore, \ is so meta-magic that it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 * not in META.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 prev_at_start = at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 at_start = FALSE; /* be able to say "/\*ptr" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 ++regparse;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3145 ++after_slash;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 --regparse;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3148 --after_slash;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 curchr = toggle_Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 else if (vim_strchr(REGEXP_ABBR, c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 * Handle abbreviations, like "\t" for TAB -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 curchr = backslash_trans(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 curchr = toggle_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 * Next character can never be (made) magic?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 * Then backslashing it won't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 curchr = (*mb_ptr2char)(regparse + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 curchr = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 curchr = (*mb_ptr2char)(regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 return curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 * Eat one lexed character. Do this in a way that we can undo it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191 skipchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3192 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 /* peekchr() eats a backslash, do the same here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 if (*regparse == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 prevchr_len = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3197 prevchr_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 if (regparse[prevchr_len] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 #ifdef FEAT_MBYTE
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
3201 if (enc_utf8)
1449
799c1db62b42 updated for version 7.1-164
vimboss
parents: 1347
diff changeset
3202 /* exclude composing chars that mb_ptr2len does include */
799c1db62b42 updated for version 7.1-164
vimboss
parents: 1347
diff changeset
3203 prevchr_len += utf_ptr2len(regparse + prevchr_len);
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
3204 else if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
3205 prevchr_len += (*mb_ptr2len)(regparse + prevchr_len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 ++prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 regparse += prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211 prev_at_start = at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212 at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 prevprevchr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 prevchr = curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 curchr = nextchr; /* use previously unget char, or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 nextchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 * Skip a character while keeping the value of prev_at_start for at_start.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 * prevchr and prevprevchr are also kept.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 skipchr_keepstart()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 int as = prev_at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 int pr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 int prpr = prevprevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 at_start = as;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 prevchr = pr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233 prevprevchr = prpr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3235
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3236 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3237 * Get the next character from the pattern. We know about magic and such, so
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3238 * therefore we need a lexical analyzer.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3239 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241 getchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 int chr = peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3246 return chr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3249 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3250 * put character back. Works only once!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 ungetchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 nextchr = curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 curchr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257 prevchr = prevprevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 at_start = prev_at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 /* Backup regparse, so that it's at the same position as before the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 * getchr(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263 regparse -= prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 /*
29
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3267 * Get and return the value of the hex string at the current position.
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3268 * Return -1 if there is no valid hex number.
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3269 * The position is updated:
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3270 * blahblah\%x20asdf
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
3271 * before-^ ^-after
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3272 * The parameter controls the maximum number of input characters. This will be
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3273 * 2 when reading a \%x20 sequence and 4 when reading a \%u20AC sequence.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3274 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3275 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3276 gethexchrs(maxinputlen)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3277 int maxinputlen;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3278 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3279 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3280 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3281 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3282
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3283 for (i = 0; i < maxinputlen; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3284 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3285 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3286 if (!vim_isxdigit(c))
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3287 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3288 nr <<= 4;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3289 nr |= hex2nr(c);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3290 ++regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3291 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3292
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3293 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3294 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3295 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3296 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3297
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3298 /*
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
3299 * Get and return the value of the decimal string immediately after the
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3300 * current position. Return -1 for invalid. Consumes all digits.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3301 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3302 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3303 getdecchrs()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3304 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3305 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3306 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3307 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3308
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3309 for (i = 0; ; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3310 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3311 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3312 if (c < '0' || c > '9')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3313 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3314 nr *= 10;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3315 nr += c - '0';
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3316 ++regparse;
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
3317 curchr = -1; /* no longer valid */
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3318 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3319
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3320 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3321 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3322 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3323 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3324
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3325 /*
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3326 * get and return the value of the octal string immediately after the current
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3327 * position. Return -1 for invalid, or 0-255 for valid. Smart enough to handle
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3328 * numbers > 377 correctly (for example, 400 is treated as 40) and doesn't
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3329 * treat 8 or 9 as recognised characters. Position is updated:
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3330 * blahblah\%o210asdf
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
3331 * before-^ ^-after
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3332 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3333 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3334 getoctchrs()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3335 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3336 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3337 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3338 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3339
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3340 for (i = 0; i < 3 && nr < 040; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3341 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3342 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3343 if (c < '0' || c > '7')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3344 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3345 nr <<= 3;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3346 nr |= hex2nr(c);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3347 ++regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3348 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3349
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3350 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3351 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3352 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3353 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3354
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3355 /*
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3356 * Get a number after a backslash that is inside [].
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3357 * When nothing is recognized return a backslash.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3358 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3359 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3360 coll_get_char()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3361 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3362 int nr = -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3363
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3364 switch (*regparse++)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3365 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3366 case 'd': nr = getdecchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3367 case 'o': nr = getoctchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3368 case 'x': nr = gethexchrs(2); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3369 case 'u': nr = gethexchrs(4); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3370 case 'U': nr = gethexchrs(8); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3371 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3372 if (nr < 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3373 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3374 /* If getting the number fails be backwards compatible: the character
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3375 * is a backslash. */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3376 --regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3377 nr = '\\';
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3378 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3379 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3380 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3381
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3382 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3383 * read_limits - Read two integers to be taken as a minimum and maximum.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3384 * If the first character is '-', then the range is reversed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3385 * Should end with 'end'. If minval is missing, zero is default, if maxval is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 * missing, a very big number is the default.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3388 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 read_limits(minval, maxval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 long *minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 long *maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393 int reverse = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 char_u *first_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 long tmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 if (*regparse == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 /* Starts with '-', so reverse the range later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3400 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3401 reverse = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3402 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3403 first_char = regparse;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3404 *minval = getdigits(&regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3405 if (*regparse == ',') /* There is a comma */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3406 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407 if (vim_isdigit(*++regparse))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 *maxval = getdigits(&regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 *maxval = MAX_LIMIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 else if (VIM_ISDIGIT(*first_char))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 *maxval = *minval; /* It was \{n} or \{-n} */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3415 *maxval = MAX_LIMIT; /* It was \{} or \{-} */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 if (*regparse == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3417 regparse++; /* Allow either \{...} or \{...\} */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3418 if (*regparse != '}')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 sprintf((char *)IObuff, _("E554: Syntax error in %s{...}"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421 reg_magic == MAGIC_ALL ? "" : "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 EMSG_RET_FAIL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 * Reverse the range if there was a '-', or make sure it is in the right
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 * order otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 if ((!reverse && *minval > *maxval) || (reverse && *minval < *maxval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 tmp = *minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3432 *minval = *maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3433 *maxval = tmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435 skipchr(); /* let's be friends with the lexer again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3436 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 * vim_regexec and friends
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3443 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3444 * Global work variables for vim_regexec().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 /* The current match-position is remembered with these variables: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 static linenr_T reglnum; /* line number, relative to first line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 static char_u *regline; /* start of current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 static char_u *reginput; /* current input, points into "regline" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 static int need_clear_subexpr; /* subexpressions still need to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 * cleared */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 static int need_clear_zsubexpr = FALSE; /* extmatch subexpressions
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 * still need to be cleared */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 * Structure used to save the current input state, when it needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 * restored after trying a match. Used by reg_save() and reg_restore().
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3462 * Also stores the length of "backpos".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 union
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 char_u *ptr; /* reginput pointer, for single-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469 lpos_T pos; /* reginput pos, for multi-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3470 } rs_u;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3471 int rs_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 } regsave_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 /* struct to save start/end pointer/position in for \(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3477 union
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 lpos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 } se_u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 } save_se_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3484 /* used for BEHIND and NOBEHIND matching */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3485 typedef struct regbehind_S
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3486 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3487 regsave_T save_after;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3488 regsave_T save_behind;
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
3489 int save_need_clear_subexpr;
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3490 save_se_T save_start[NSUBEXP];
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3491 save_se_T save_end[NSUBEXP];
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3492 } regbehind_T;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3493
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 static char_u *reg_getline __ARGS((linenr_T lnum));
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3495 static long bt_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3496 static long regtry __ARGS((bt_regprog_T *prog, colnr_T col));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 static void cleanup_subexpr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3498 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 static void cleanup_zsubexpr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 #endif
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3501 static void save_subexpr __ARGS((regbehind_T *bp));
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3502 static void restore_subexpr __ARGS((regbehind_T *bp));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 static void reg_nextline __ARGS((void));
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3504 static void reg_save __ARGS((regsave_T *save, garray_T *gap));
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3505 static void reg_restore __ARGS((regsave_T *save, garray_T *gap));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 static int reg_save_equal __ARGS((regsave_T *save));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 static void save_se_multi __ARGS((save_se_T *savep, lpos_T *posp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 static void save_se_one __ARGS((save_se_T *savep, char_u **pp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3510 /* Save the sub-expressions before attempting a match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 #define save_se(savep, posp, pp) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 REG_MULTI ? save_se_multi((savep), (posp)) : save_se_one((savep), (pp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 /* After a failed match restore the sub-expressions. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 #define restore_se(savep, posp, pp) { \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 if (REG_MULTI) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517 *(posp) = (savep)->se_u.pos; \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 else \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519 *(pp) = (savep)->se_u.ptr; }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521 static int re_num_cmp __ARGS((long_u val, char_u *scan));
4891
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
3522 static int match_with_backref __ARGS((linenr_T start_lnum, colnr_T start_col, linenr_T end_lnum, colnr_T end_col, int *bytelen));
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
3523 static int regmatch __ARGS((char_u *prog));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3524 static int regrepeat __ARGS((char_u *p, long maxcount));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3526 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3527 int regnarrate = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3528 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3529
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 * Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 * Normally it gets the value of "rm_ic" or "rmm_ic", but when the pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533 * contains '\c' or '\C' the value is overruled.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 static int ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 * Similar to ireg_ic, but only for 'combining' characters. Set with \Z flag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 * in the regexp. Defaults to false, always.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 static int ireg_icombine;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3544
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 /*
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3546 * Copy of "rmm_maxcol": maximum column to search for a match. Zero when
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3547 * there is no maximum.
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3548 */
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 410
diff changeset
3549 static colnr_T ireg_maxcol;
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3550
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3551 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 * Sometimes need to save a copy of a line. Since alloc()/free() is very
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3553 * slow, we keep one allocated piece of memory and only re-allocate it when
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3554 * it's too small. It's freed in bt_regexec_both() when finished.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 */
1468
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
3556 static char_u *reg_tofree = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 static unsigned reg_tofreelen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 * These variables are set when executing a regexp to speed up the execution.
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
3561 * Which ones are set depends on whether a single-line or multi-line match is
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 * done:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3563 * single-line multi-line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3564 * reg_match &regmatch_T NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 * reg_mmatch NULL &regmmatch_T
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 * reg_startp reg_match->startp <invalid>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 * reg_endp reg_match->endp <invalid>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 * reg_startpos <invalid> reg_mmatch->startpos
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 * reg_endpos <invalid> reg_mmatch->endpos
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 * reg_win NULL window in which to search
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
3571 * reg_buf curbuf buffer in which to search
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572 * reg_firstlnum <invalid> first line in which to search
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 * reg_maxline 0 last line nr
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 * reg_line_lbr FALSE or TRUE FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 static regmatch_T *reg_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 static regmmatch_T *reg_mmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578 static char_u **reg_startp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 static char_u **reg_endp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 static lpos_T *reg_startpos = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 static lpos_T *reg_endpos = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 static win_T *reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 static buf_T *reg_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 static linenr_T reg_firstlnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 static linenr_T reg_maxline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 static int reg_line_lbr; /* "\n" in string is line break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3588 /* Values for rs_state in regitem_T. */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3589 typedef enum regstate_E
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3590 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3591 RS_NOPEN = 0 /* NOPEN and NCLOSE */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3592 , RS_MOPEN /* MOPEN + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3593 , RS_MCLOSE /* MCLOSE + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3594 #ifdef FEAT_SYN_HL
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3595 , RS_ZOPEN /* ZOPEN + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3596 , RS_ZCLOSE /* ZCLOSE + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3597 #endif
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3598 , RS_BRANCH /* BRANCH */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3599 , RS_BRCPLX_MORE /* BRACE_COMPLEX and trying one more match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3600 , RS_BRCPLX_LONG /* BRACE_COMPLEX and trying longest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3601 , RS_BRCPLX_SHORT /* BRACE_COMPLEX and trying shortest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3602 , RS_NOMATCH /* NOMATCH */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3603 , RS_BEHIND1 /* BEHIND / NOBEHIND matching rest */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3604 , RS_BEHIND2 /* BEHIND / NOBEHIND matching behind part */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3605 , RS_STAR_LONG /* STAR/PLUS/BRACE_SIMPLE longest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3606 , RS_STAR_SHORT /* STAR/PLUS/BRACE_SIMPLE shortest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3607 } regstate_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3608
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3609 /*
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3610 * When there are alternatives a regstate_T is put on the regstack to remember
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3611 * what we are doing.
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3612 * Before it may be another type of item, depending on rs_state, to remember
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3613 * more things.
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3614 */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3615 typedef struct regitem_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3616 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3617 regstate_T rs_state; /* what we are doing, one of RS_ above */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3618 char_u *rs_scan; /* current node in program */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3619 union
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3620 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3621 save_se_T sesave;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3622 regsave_T regsave;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3623 } rs_un; /* room for saving reginput */
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3624 short rs_no; /* submatch nr or BEHIND/NOBEHIND */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3625 } regitem_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3626
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3627 static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan));
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3628 static void regstack_pop __ARGS((char_u **scan));
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3629
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3630 /* used for STAR, PLUS and BRACE_SIMPLE matching */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3631 typedef struct regstar_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3632 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3633 int nextb; /* next byte */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3634 int nextb_ic; /* next byte reverse case */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3635 long count;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3636 long minval;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3637 long maxval;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3638 } regstar_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3639
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3640 /* used to store input position when a BACK was encountered, so that we now if
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3641 * we made any progress since the last time. */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3642 typedef struct backpos_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3643 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3644 char_u *bp_scan; /* "scan" where BACK was encountered */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3645 regsave_T bp_pos; /* last input position */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3646 } backpos_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3647
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3648 /*
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3649 * "regstack" and "backpos" are used by regmatch(). They are kept over calls
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3650 * to avoid invoking malloc() and free() often.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3651 * "regstack" is a stack with regitem_T items, sometimes preceded by regstar_T
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3652 * or regbehind_T.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3653 * "backpos_T" is a table with backpos_T for BACK
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3654 */
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3655 static garray_T regstack = {0, 0, 0, 0, NULL};
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3656 static garray_T backpos = {0, 0, 0, 0, NULL};
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3657
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3658 /*
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3659 * Both for regstack and backpos tables we use the following strategy of
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3660 * allocation (to reduce malloc/free calls):
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3661 * - Initial size is fairly small.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3662 * - When needed, the tables are grown bigger (8 times at first, double after
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3663 * that).
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3664 * - After executing the match we free the memory only if the array has grown.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3665 * Thus the memory is kept allocated when it's at the initial size.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3666 * This makes it fast while not keeping a lot of memory allocated.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3667 * A three times speed increase was observed when using many simple patterns.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3668 */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3669 #define REGSTACK_INITIAL 2048
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3670 #define BACKPOS_INITIAL 64
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3671
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3672 #if defined(EXITFREE) || defined(PROTO)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3673 void
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3674 free_regexp_stuff()
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3675 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3676 ga_clear(&regstack);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3677 ga_clear(&backpos);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3678 vim_free(reg_tofree);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3679 vim_free(reg_prev_sub);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3680 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3681 #endif
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3682
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684 * Get pointer to the line "lnum", which is relative to "reg_firstlnum".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3687 reg_getline(lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690 /* when looking behind for a match/no-match lnum is negative. But we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3691 * can't go before line 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3692 if (reg_firstlnum + lnum < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 return NULL;
482
6f8b578776ab updated for version 7.0131
vimboss
parents: 481
diff changeset
3694 if (lnum > reg_maxline)
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3695 /* Must have matched the "\n" in the last line. */
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3696 return (char_u *)"";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 return ml_get_buf(reg_buf, reg_firstlnum + lnum, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3699
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 static regsave_T behind_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 static char_u *reg_startzp[NSUBEXP]; /* Workspace to mark beginning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704 static char_u *reg_endzp[NSUBEXP]; /* and end of \z(...\) matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705 static lpos_T reg_startzpos[NSUBEXP]; /* idem, beginning pos */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3706 static lpos_T reg_endzpos[NSUBEXP]; /* idem, end pos */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 /* TRUE if using multi-line regexp. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 #define REG_MULTI (reg_match == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3712 static int bt_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col, int line_lbr));
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3713
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3714
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 * Match a regexp against a string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3717 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3718 * Uses curbuf for line count and 'iskeyword'.
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3719 * if "line_lbr" is TRUE consider a "\n" in "line" to be a line break.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3720 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3721 * Return TRUE if there is a match, FALSE if not.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3723 static int
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3724 bt_regexec_nl(rmp, line, col, line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3725 regmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 char_u *line; /* string to match against */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 colnr_T col; /* column to start looking for match */
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3728 int line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3730 reg_match = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731 reg_mmatch = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 reg_maxline = 0;
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
3733 reg_line_lbr = line_lbr;
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
3734 reg_buf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3735 reg_win = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 ireg_ic = rmp->rm_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 ireg_icombine = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 #endif
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3740 ireg_maxcol = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3741 return (bt_regexec_both(line, col, NULL) != 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3744 static long bt_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: 4244
diff changeset
3745
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3746 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3747 * Match a regexp against multiple lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3748 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749 * Uses curbuf for line count and 'iskeyword'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3750 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3751 * Return zero if there is no match. Return number of lines contained in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 * match otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3754 static long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3755 bt_regexec_multi(rmp, win, buf, lnum, col, tm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 regmmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 win_T *win; /* window in which to search or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758 buf_T *buf; /* buffer in which to search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759 linenr_T lnum; /* nr of line to start looking for match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 colnr_T col; /* column to start looking for match */
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3761 proftime_T *tm; /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 long r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 reg_match = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766 reg_mmatch = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 reg_buf = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 reg_win = win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 reg_firstlnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770 reg_maxline = reg_buf->b_ml.ml_line_count - lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771 reg_line_lbr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 ireg_ic = rmp->rmm_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 ireg_icombine = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775 #endif
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3776 ireg_maxcol = rmp->rmm_maxcol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3777
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3778 r = bt_regexec_both(NULL, col, tm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3779
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3780 return r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3783 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3784 * Match a regexp against a string ("line" points to the string) or multiple
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3785 * lines ("line" is NULL, use reg_getline()).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 static long
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3788 bt_regexec_both(line, col, tm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 colnr_T col; /* column to start looking for match */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1815
diff changeset
3791 proftime_T *tm UNUSED; /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3793 bt_regprog_T *prog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3794 char_u *s;
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3795 long retval = 0L;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3796
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3797 /* Create "regstack" and "backpos" if they are not allocated yet.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3798 * We allocate *_INITIAL amount of bytes first and then set the grow size
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3799 * to much bigger value to avoid many malloc calls in case of deep regular
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3800 * expressions. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3801 if (regstack.ga_data == NULL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3802 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3803 /* Use an item size of 1 byte, since we push different things
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3804 * onto the regstack. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3805 ga_init2(&regstack, 1, REGSTACK_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3806 ga_grow(&regstack, REGSTACK_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3807 regstack.ga_growsize = REGSTACK_INITIAL * 8;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3808 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3809
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3810 if (backpos.ga_data == NULL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3811 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3812 ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3813 ga_grow(&backpos, BACKPOS_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3814 backpos.ga_growsize = BACKPOS_INITIAL * 8;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3815 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3816
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3817 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3818 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3819 prog = (bt_regprog_T *)reg_mmatch->regprog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3820 line = reg_getline((linenr_T)0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3821 reg_startpos = reg_mmatch->startpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3822 reg_endpos = reg_mmatch->endpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3826 prog = (bt_regprog_T *)reg_match->regprog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3827 reg_startp = reg_match->startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3828 reg_endp = reg_match->endp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3829 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3831 /* Be paranoid... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3832 if (prog == NULL || line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3833 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3834 EMSG(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3835 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3837
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3838 /* Check validity of program. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3839 if (prog_magic_wrong())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3840 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3841
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3842 /* If the start column is past the maximum column: no need to try. */
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3843 if (ireg_maxcol > 0 && col >= ireg_maxcol)
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3844 goto theend;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3845
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3846 /* If pattern contains "\c" or "\C": overrule value of ireg_ic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3847 if (prog->regflags & RF_ICASE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3848 ireg_ic = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3849 else if (prog->regflags & RF_NOICASE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3850 ireg_ic = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3851
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3852 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3853 /* If pattern contains "\Z" overrule value of ireg_icombine */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3854 if (prog->regflags & RF_ICOMBINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3855 ireg_icombine = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3856 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3857
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3858 /* If there is a "must appear" string, look for it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3859 if (prog->regmust != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3860 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3861 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3862
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3863 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3864 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3865 c = (*mb_ptr2char)(prog->regmust);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3866 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3867 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3868 c = *prog->regmust;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3869 s = line + col;
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3870
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3871 /*
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3872 * This is used very often, esp. for ":global". Use three versions of
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3873 * the loop to avoid overhead of conditions.
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3874 */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3875 if (!ireg_ic
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3876 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3877 && !has_mbyte
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3878 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3879 )
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3880 while ((s = vim_strbyte(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3881 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3882 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3883 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3884 ++s;
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3885 }
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3886 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3887 else if (!ireg_ic || (!enc_utf8 && mb_char2len(c) > 1))
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3888 while ((s = vim_strchr(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3889 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3890 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3891 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3892 mb_ptr_adv(s);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3893 }
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3894 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3895 else
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3896 while ((s = cstrchr(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3897 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3898 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3899 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3900 mb_ptr_adv(s);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3901 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3902 if (s == NULL) /* Not present. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3903 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3904 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3905
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3906 regline = line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3907 reglnum = 0;
2578
766918de9e3a updated for version 7.3.004
Bram Moolenaar <bram@vim.org>
parents: 2307
diff changeset
3908 reg_toolong = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3910 /* Simplest case: Anchored match need be tried only once. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3911 if (prog->reganch)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3912 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3913 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3915 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3916 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3917 c = (*mb_ptr2char)(regline + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3918 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3919 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3920 c = regline[col];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3921 if (prog->regstart == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3922 || prog->regstart == c
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3923 || (ireg_ic && ((
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3924 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3925 (enc_utf8 && utf_fold(prog->regstart) == utf_fold(c)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3926 || (c < 255 && prog->regstart < 255 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3927 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
3928 MB_TOLOWER(prog->regstart) == MB_TOLOWER(c)))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3929 retval = regtry(prog, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3930 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3931 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3932 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3933 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3934 {
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3935 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3936 int tm_count = 0;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3937 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3938 /* Messy cases: unanchored match. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
3939 while (!got_int)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3940 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3941 if (prog->regstart != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3942 {
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3943 /* Skip until the char we know it must start with.
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3944 * Used often, do some work to avoid call overhead. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3945 if (!ireg_ic
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3946 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3947 && !has_mbyte
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3948 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3949 )
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3950 s = vim_strbyte(regline + col, prog->regstart);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3951 else
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3952 s = cstrchr(regline + col, prog->regstart);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3953 if (s == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3955 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3956 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3957 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3958 col = (int)(s - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3959 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3960
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3961 /* Check for maximum column to try. */
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3962 if (ireg_maxcol > 0 && col >= ireg_maxcol)
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3963 {
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3964 retval = 0;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3965 break;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3966 }
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3967
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3968 retval = regtry(prog, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3969 if (retval > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3970 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3971
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3972 /* if not currently on the first line, get it again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3973 if (reglnum != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3974 {
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3975 reglnum = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3976 regline = reg_getline((linenr_T)0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3978 if (regline[col] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3979 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3980 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3981 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
3982 col += (*mb_ptr2len)(regline + col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3983 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3984 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3985 ++col;
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3986 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3987 /* Check for timeout once in a twenty times to avoid overhead. */
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3988 if (tm != NULL && ++tm_count == 20)
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3989 {
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3990 tm_count = 0;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3991 if (profile_passed_limit(tm))
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3992 break;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3993 }
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3994 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3996 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3997
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3998 theend:
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3999 /* Free "reg_tofree" when it's a bit big.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4000 * Free regstack and backpos if they are bigger than their initial size. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4001 if (reg_tofreelen > 400)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4002 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4003 vim_free(reg_tofree);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4004 reg_tofree = NULL;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4005 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4006 if (regstack.ga_maxlen > REGSTACK_INITIAL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4007 ga_clear(&regstack);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4008 if (backpos.ga_maxlen > BACKPOS_INITIAL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4009 ga_clear(&backpos);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4010
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4011 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4012 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4013
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4014 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4015 static reg_extmatch_T *make_extmatch __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4017 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4018 * Create a new extmatch and mark it as referenced once.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4019 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4020 static reg_extmatch_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4021 make_extmatch()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4022 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4023 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4024
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4025 em = (reg_extmatch_T *)alloc_clear((unsigned)sizeof(reg_extmatch_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4026 if (em != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4027 em->refcnt = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4028 return em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4029 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4031 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4032 * Add a reference to an extmatch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4033 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4034 reg_extmatch_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4035 ref_extmatch(em)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4036 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4037 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4038 if (em != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4039 em->refcnt++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4040 return em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4043 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4044 * Remove a reference to an extmatch. If there are no references left, free
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4045 * the info.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4046 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4047 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4048 unref_extmatch(em)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4049 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4050 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4051 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4052
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4053 if (em != NULL && --em->refcnt <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4054 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4055 for (i = 0; i < NSUBEXP; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4056 vim_free(em->matches[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4057 vim_free(em);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4060 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4061
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4062 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4063 * regtry - try match of "prog" with at regline["col"].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4064 * Returns 0 for failure, number of lines contained in the match otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4065 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4066 static long
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4067 regtry(prog, col)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4068 bt_regprog_T *prog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 colnr_T col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4071 reginput = regline + col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4072 need_clear_subexpr = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 /* Clear the external match subpointers if necessary. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075 if (prog->reghasz == REX_SET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 need_clear_zsubexpr = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4078
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4079 if (regmatch(prog->program + 1) == 0)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4080 return 0;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4081
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4082 cleanup_subexpr();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4083 if (REG_MULTI)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4084 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4085 if (reg_startpos[0].lnum < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4087 reg_startpos[0].lnum = 0;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4088 reg_startpos[0].col = col;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4089 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4090 if (reg_endpos[0].lnum < 0)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4091 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4092 reg_endpos[0].lnum = reglnum;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4093 reg_endpos[0].col = (int)(reginput - regline);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4094 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4095 else
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4096 /* Use line number of "\ze". */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4097 reglnum = reg_endpos[0].lnum;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4098 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4099 else
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4100 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4101 if (reg_startp[0] == NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4102 reg_startp[0] = regline + col;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4103 if (reg_endp[0] == NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4104 reg_endp[0] = reginput;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4105 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106 #ifdef FEAT_SYN_HL
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4107 /* Package any found \z(...\) matches for export. Default is none. */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4108 unref_extmatch(re_extmatch_out);
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4109 re_extmatch_out = NULL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4110
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4111 if (prog->reghasz == REX_SET)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4112 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4113 int i;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4114
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4115 cleanup_zsubexpr();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4116 re_extmatch_out = make_extmatch();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4117 for (i = 0; i < NSUBEXP; i++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4119 if (REG_MULTI)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4121 /* Only accept single line matches. */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4122 if (reg_startzpos[i].lnum >= 0
5820
4901a36479f2 updated for version 7.4.253
Bram Moolenaar <bram@vim.org>
parents: 5794
diff changeset
4123 && reg_endzpos[i].lnum == reg_startzpos[i].lnum
4901a36479f2 updated for version 7.4.253
Bram Moolenaar <bram@vim.org>
parents: 5794
diff changeset
4124 && reg_endzpos[i].col >= reg_startzpos[i].col)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4125 re_extmatch_out->matches[i] =
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4126 vim_strnsave(reg_getline(reg_startzpos[i].lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4127 + reg_startzpos[i].col,
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4128 reg_endzpos[i].col - reg_startzpos[i].col);
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4129 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4130 else
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4131 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4132 if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4133 re_extmatch_out->matches[i] =
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4134 vim_strnsave(reg_startzp[i],
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4135 (int)(reg_endzp[i] - reg_startzp[i]));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4136 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137 }
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4138 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4139 #endif
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4140 return 1 + reglnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144 static int reg_prev_class __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 * Get class of previous character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4148 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4149 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4150 reg_prev_class()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4152 if (reginput > regline)
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4153 return mb_get_class_buf(reginput - 1
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4154 - (*mb_head_off)(regline, reginput - 1), reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4155 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4156 }
5735
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5504
diff changeset
4157 #endif
50dbef5e774a updated for version 7.4.212
Bram Moolenaar <bram@vim.org>
parents: 5504
diff changeset
4158
4730
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4159 static int reg_match_visual __ARGS((void));
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4160
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4161 /*
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4162 * Return TRUE if the current reginput position matches the Visual area.
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4163 */
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4164 static int
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4165 reg_match_visual()
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4166 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4167 pos_T top, bot;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4168 linenr_T lnum;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4169 colnr_T col;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4170 win_T *wp = reg_win == NULL ? curwin : reg_win;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4171 int mode;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4172 colnr_T start, end;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4173 colnr_T start2, end2;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4174 colnr_T cols;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4175
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4176 /* Check if the buffer is the current buffer. */
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4177 if (reg_buf != curbuf || VIsual.lnum == 0)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4178 return FALSE;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4179
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4180 if (VIsual_active)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4181 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4182 if (lt(VIsual, wp->w_cursor))
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4183 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4184 top = VIsual;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4185 bot = wp->w_cursor;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4186 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4187 else
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4188 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4189 top = wp->w_cursor;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4190 bot = VIsual;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4191 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4192 mode = VIsual_mode;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4193 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4194 else
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4195 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4196 if (lt(curbuf->b_visual.vi_start, curbuf->b_visual.vi_end))
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4197 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4198 top = curbuf->b_visual.vi_start;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4199 bot = curbuf->b_visual.vi_end;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4200 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4201 else
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4202 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4203 top = curbuf->b_visual.vi_end;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4204 bot = curbuf->b_visual.vi_start;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4205 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4206 mode = curbuf->b_visual.vi_mode;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4207 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4208 lnum = reglnum + reg_firstlnum;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4209 if (lnum < top.lnum || lnum > bot.lnum)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4210 return FALSE;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4211
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4212 if (mode == 'v')
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4213 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4214 col = (colnr_T)(reginput - regline);
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4215 if ((lnum == top.lnum && col < top.col)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4216 || (lnum == bot.lnum && col >= bot.col + (*p_sel != 'e')))
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4217 return FALSE;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4218 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4219 else if (mode == Ctrl_V)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4220 {
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4221 getvvcol(wp, &top, &start, NULL, &end);
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4222 getvvcol(wp, &bot, &start2, NULL, &end2);
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4223 if (start2 < start)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4224 start = start2;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4225 if (end2 > end)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4226 end = end2;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4227 if (top.col == MAXCOL || bot.col == MAXCOL)
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4228 end = MAXCOL;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4229 cols = win_linetabsize(wp, regline, (colnr_T)(reginput - regline));
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4230 if (cols < start || cols > end - (*p_sel == 'e'))
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4231 return FALSE;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4232 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4233 return TRUE;
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4234 }
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4235
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
4236 #define ADVANCE_REGINPUT() mb_ptr_adv(reginput)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4237
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4238 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4239 * The arguments from BRACE_LIMITS are stored here. They are actually local
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240 * to regmatch(), but they are here to reduce the amount of stack space used
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4241 * (it can be called recursively many times).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4243 static long bl_minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4244 static long bl_maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4245
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4246 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4247 * regmatch - main matching routine
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4248 *
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4249 * Conceptually the strategy is simple: Check to see whether the current node
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4250 * matches, push an item onto the regstack and loop to see whether the rest
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4251 * matches, and then act accordingly. In practice we make some effort to
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4252 * avoid using the regstack, in particular by going through "ordinary" nodes
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4253 * (that don't need to know whether the rest of the match failed) by a nested
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4254 * loop.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4255 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4256 * Returns TRUE when there is a match. Leaves reginput and reglnum just after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257 * the last matched character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 * Returns FALSE when there is no match. Leaves reginput and reglnum in an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 * undefined state!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4260 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4261 static int
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4262 regmatch(scan)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4263 char_u *scan; /* Current node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4264 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4265 char_u *next; /* Next node. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4266 int op;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4267 int c;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4268 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4269 int no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4270 int status; /* one of the RA_ values: */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4271 #define RA_FAIL 1 /* something failed, abort */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4272 #define RA_CONT 2 /* continue in inner loop */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4273 #define RA_BREAK 3 /* break inner loop */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4274 #define RA_MATCH 4 /* successful match */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4275 #define RA_NOMATCH 5 /* didn't match */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4276
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4277 /* Make "regstack" and "backpos" empty. They are allocated and freed in
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4278 * bt_regexec_both() to reduce malloc()/free() calls. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4279 regstack.ga_len = 0;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4280 backpos.ga_len = 0;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4281
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4282 /*
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4283 * Repeat until "regstack" is empty.
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4284 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4285 for (;;)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4286 {
5310
b04bdb2c5fce updated for version 7.4.008
Bram Moolenaar <bram@vim.org>
parents: 5221
diff changeset
4287 /* Some patterns may take a long time to match, e.g., "\([a-z]\+\)\+Q".
b04bdb2c5fce updated for version 7.4.008
Bram Moolenaar <bram@vim.org>
parents: 5221
diff changeset
4288 * Allow interrupting them with CTRL-C. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4289 fast_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4291 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 if (scan != NULL && regnarrate)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4293 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4294 mch_errmsg((char *)regprop(scan));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4295 mch_errmsg("(\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4297 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4298
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4299 /*
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4300 * Repeat for items that can be matched sequentially, without using the
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4301 * regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4302 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4303 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4304 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4305 if (got_int || scan == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4306 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4307 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4308 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4309 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4310 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4311
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4312 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4313 if (regnarrate)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4314 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4315 mch_errmsg((char *)regprop(scan));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4316 mch_errmsg("...\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4317 # ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4318 if (re_extmatch_in != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4320 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4322 mch_errmsg(_("External submatches:\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4323 for (i = 0; i < NSUBEXP; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4325 mch_errmsg(" \"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4326 if (re_extmatch_in->matches[i] != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4327 mch_errmsg((char *)re_extmatch_in->matches[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4328 mch_errmsg("\"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4329 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4330 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4331 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4332 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4333 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4334 next = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4335
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4336 op = OP(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337 /* Check for character class with NL added. */
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
4338 if (!reg_line_lbr && WITH_NL(op) && REG_MULTI
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
4339 && *reginput == NUL && reglnum <= reg_maxline)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 else if (reg_line_lbr && WITH_NL(op) && *reginput == '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4344 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4345 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4347 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4348 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4349 if (WITH_NL(op))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4350 op -= ADD_NL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4351 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4352 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4353 c = (*mb_ptr2char)(reginput);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4354 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4355 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4356 c = *reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4357 switch (op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4358 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359 case BOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4360 if (reginput != regline)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4361 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4362 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4364 case EOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4365 if (c != NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4366 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4367 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4369 case RE_BOF:
1458
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4370 /* We're not at the beginning of the file when below the first
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4371 * line where we started, not at the start of the line or we
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4372 * didn't start at the first line of the buffer. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4373 if (reglnum != 0 || reginput != regline
1458
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4374 || (REG_MULTI && reg_firstlnum > 1))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4375 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4376 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4377
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4378 case RE_EOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4379 if (reglnum != reg_maxline || c != NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4380 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4381 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4383 case CURSOR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4384 /* Check if the buffer is in a window and compare the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4385 * reg_win->w_cursor position to the match position. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4386 if (reg_win == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4387 || (reglnum + reg_firstlnum != reg_win->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4388 || ((colnr_T)(reginput - regline) != reg_win->w_cursor.col))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4389 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4390 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4391
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4392 case RE_MARK:
4732
0798b096bab3 updated for version 7.3.1113
Bram Moolenaar <bram@vim.org>
parents: 4730
diff changeset
4393 /* Compare the mark position to the match position. */
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4394 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4395 int mark = OPERAND(scan)[0];
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4396 int cmp = OPERAND(scan)[1];
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4397 pos_T *pos;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4398
4043
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4399 pos = getmark_buf(reg_buf, mark, FALSE);
1148
e1dc2698121c updated for version 7.1a
vimboss
parents: 1018
diff changeset
4400 if (pos == NULL /* mark doesn't exist */
4732
0798b096bab3 updated for version 7.3.1113
Bram Moolenaar <bram@vim.org>
parents: 4730
diff changeset
4401 || pos->lnum <= 0 /* mark isn't set in reg_buf */
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4402 || (pos->lnum == reglnum + reg_firstlnum
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4403 ? (pos->col == (colnr_T)(reginput - regline)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4404 ? (cmp == '<' || cmp == '>')
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4405 : (pos->col < (colnr_T)(reginput - regline)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4406 ? cmp != '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4407 : cmp != '<'))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4408 : (pos->lnum < reglnum + reg_firstlnum
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4409 ? cmp != '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4410 : cmp != '<')))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4411 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4412 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4413 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4414
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4415 case RE_VISUAL:
4730
749e2b2755d5 updated for version 7.3.1112
Bram Moolenaar <bram@vim.org>
parents: 4720
diff changeset
4416 if (!reg_match_visual())
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4417 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4418 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4419
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4420 case RE_LNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4421 if (!REG_MULTI || !re_num_cmp((long_u)(reglnum + reg_firstlnum),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4422 scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4423 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4424 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4425
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4426 case RE_COL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4427 if (!re_num_cmp((long_u)(reginput - regline) + 1, scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4428 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4429 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4430
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4431 case RE_VCOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4432 if (!re_num_cmp((long_u)win_linetabsize(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4433 reg_win == NULL ? curwin : reg_win,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4434 regline, (colnr_T)(reginput - regline)) + 1, scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4435 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4436 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4438 case BOW: /* \<word; reginput points to w */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4439 if (c == NUL) /* Can't match at end of line */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4440 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4441 #ifdef FEAT_MBYTE
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4442 else if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4444 int this_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4445
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4446 /* Get class of current and previous char (if it exists). */
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4447 this_class = mb_get_class_buf(reginput, reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4448 if (this_class <= 1)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4449 status = RA_NOMATCH; /* not on a word at all */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4450 else if (reg_prev_class() == this_class)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4451 status = RA_NOMATCH; /* previous char is in same word */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4452 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4453 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4454 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4455 {
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
4456 if (!vim_iswordc_buf(c, reg_buf) || (reginput > regline
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
4457 && vim_iswordc_buf(reginput[-1], reg_buf)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4458 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4460 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4461
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4462 case EOW: /* word\>; reginput points after d */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4463 if (reginput == regline) /* Can't match at start of line */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4464 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4465 #ifdef FEAT_MBYTE
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4466 else if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4468 int this_class, prev_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4469
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4470 /* Get class of current and previous char (if it exists). */
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4471 this_class = mb_get_class_buf(reginput, reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4472 prev_class = reg_prev_class();
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4473 if (this_class == prev_class
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4474 || prev_class == 0 || prev_class == 1)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4475 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4476 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4477 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4478 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4479 {
4043
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4480 if (!vim_iswordc_buf(reginput[-1], reg_buf)
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4481 || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4482 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4484 break; /* Matched with EOW */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4485
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4486 case ANY:
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
4487 /* ANY does not match new lines. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4488 if (c == NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4489 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4490 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4491 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4492 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4494 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4495 if (!vim_isIDc(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4496 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4497 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4498 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4499 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4500
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4501 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4502 if (VIM_ISDIGIT(*reginput) || !vim_isIDc(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4503 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4504 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4505 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4506 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4507
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4508 case KWORD:
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4509 if (!vim_iswordp_buf(reginput, reg_buf))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4510 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4511 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4512 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4513 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4514
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4515 case SKWORD:
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4516 if (VIM_ISDIGIT(*reginput) || !vim_iswordp_buf(reginput, reg_buf))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4517 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4518 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4519 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4520 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4521
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4522 case FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4523 if (!vim_isfilec(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4524 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4525 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4526 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4527 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4528
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4529 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4530 if (VIM_ISDIGIT(*reginput) || !vim_isfilec(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4531 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4532 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4533 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4534 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4535
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4536 case PRINT:
5221
9982ec574beb updated for version 7.4a.036
Bram Moolenaar <bram@vim.org>
parents: 4901
diff changeset
4537 if (!vim_isprintc(PTR2CHAR(reginput)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4538 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4539 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4540 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4541 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4542
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4543 case SPRINT:
5221
9982ec574beb updated for version 7.4a.036
Bram Moolenaar <bram@vim.org>
parents: 4901
diff changeset
4544 if (VIM_ISDIGIT(*reginput) || !vim_isprintc(PTR2CHAR(reginput)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4545 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4546 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4547 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4548 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4550 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4551 if (!vim_iswhite(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4552 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4553 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4554 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4555 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4557 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4558 if (c == NUL || vim_iswhite(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4559 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4560 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4561 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4562 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4564 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4565 if (!ri_digit(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4566 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4567 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4568 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4569 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4571 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4572 if (c == NUL || ri_digit(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4573 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4574 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4575 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4576 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4577
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4578 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4579 if (!ri_hex(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4580 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4581 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4582 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4583 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4585 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4586 if (c == NUL || ri_hex(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4587 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4588 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4589 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4590 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4591
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4592 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4593 if (!ri_octal(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4594 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4595 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4596 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4597 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4598
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4599 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4600 if (c == NUL || ri_octal(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4601 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4602 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4603 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4604 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4605
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4606 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4607 if (!ri_word(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4608 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4609 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4610 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4611 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4612
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4613 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4614 if (c == NUL || ri_word(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4615 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4616 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4617 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4618 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4619
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4620 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4621 if (!ri_head(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4622 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4623 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4624 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4625 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4627 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628 if (c == NUL || ri_head(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4629 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4630 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4631 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4632 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4634 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4635 if (!ri_alpha(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4636 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4637 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4638 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4639 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4640
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4641 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4642 if (c == NUL || ri_alpha(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4643 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4644 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4645 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4646 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4648 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4649 if (!ri_lower(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4650 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4651 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4652 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4653 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4655 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4656 if (c == NUL || ri_lower(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4657 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4658 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4659 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4660 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4662 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4663 if (!ri_upper(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4664 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4665 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4666 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4667 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4668
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4669 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4670 if (c == NUL || ri_upper(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4671 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4672 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4673 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4674 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4675
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4676 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4677 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4678 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4679 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4680
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4681 opnd = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4682 /* Inline the first byte, for speed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4683 if (*opnd != *reginput
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4684 && (!ireg_ic || (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4685 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4686 !enc_utf8 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4687 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
4688 MB_TOLOWER(*opnd) != MB_TOLOWER(*reginput))))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4689 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4690 else if (*opnd == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4691 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4692 /* match empty string always works; happens when "~" is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4693 * empty. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4694 }
5899
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4695 else
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4696 {
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4697 if (opnd[1] == NUL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4698 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4699 && !(enc_utf8 && ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4700 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4701 )
5899
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4702 {
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4703 len = 1; /* matched a single byte above */
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4704 }
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4705 else
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4706 {
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4707 /* Need to match first byte again for multi-byte. */
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4708 len = (int)STRLEN(opnd);
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4709 if (cstrncmp(opnd, reginput, &len) != 0)
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4710 status = RA_NOMATCH;
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4711 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4712 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4713 /* Check for following composing character. */
5899
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4714 if (status != RA_NOMATCH
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4715 && enc_utf8
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4716 && UTF_COMPOSINGLIKE(reginput, reginput + len)
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4717 && !ireg_icombine)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4718 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4719 /* raaron: This code makes a composing character get
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4720 * ignored, which is the correct behavior (sometimes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4721 * for voweled Hebrew texts. */
5899
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4722 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4723 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4724 #endif
5899
60cdaa05a6ad updated for version 7.4.292
Bram Moolenaar <bram@vim.org>
parents: 5897
diff changeset
4725 if (status != RA_NOMATCH)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4726 reginput += len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4728 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4729 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4731 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4732 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4733 if (c == NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4734 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4735 else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4736 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4737 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4738 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4739 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4740
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4741 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4742 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4743 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4744 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4745 int i, len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4746 char_u *opnd;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 856
diff changeset
4747 int opndc = 0, inpc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4748
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4749 opnd = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4750 /* Safety check (just in case 'encoding' was changed since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4751 * compiling the program). */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
4752 if ((len = (*mb_ptr2len)(opnd)) < 2)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4753 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4754 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4755 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4756 }
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4757 if (enc_utf8)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4758 opndc = mb_ptr2char(opnd);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4759 if (enc_utf8 && utf_iscomposing(opndc))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4760 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4761 /* When only a composing char is given match at any
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4762 * position where that composing char appears. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4763 status = RA_NOMATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4764 for (i = 0; reginput[i] != NUL; i += utf_char2len(inpc))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4765 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4766 inpc = mb_ptr2char(reginput + i);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4767 if (!utf_iscomposing(inpc))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4768 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4769 if (i > 0)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4770 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4771 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4772 else if (opndc == inpc)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4773 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4774 /* Include all following composing chars. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4775 len = i + mb_ptr2len(reginput + i);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4776 status = RA_MATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4777 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4778 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4779 }
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4780 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4781 else
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4782 for (i = 0; i < len; ++i)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4783 if (opnd[i] != reginput[i])
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4784 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4785 status = RA_NOMATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4786 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4787 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4788 reginput += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4790 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4791 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4792 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4793 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4794
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4795 case NOTHING:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4796 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4797
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4798 case BACK:
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4799 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4800 int i;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4801 backpos_T *bp;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4802
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4803 /*
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4804 * When we run into BACK we need to check if we don't keep
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4805 * looping without matching any input. The second and later
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4806 * times a BACK is encountered it fails if the input is still
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4807 * at the same position as the previous time.
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4808 * The positions are stored in "backpos" and found by the
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4809 * current value of "scan", the position in the RE program.
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4810 */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4811 bp = (backpos_T *)backpos.ga_data;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4812 for (i = 0; i < backpos.ga_len; ++i)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4813 if (bp[i].bp_scan == scan)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4814 break;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4815 if (i == backpos.ga_len)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4816 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4817 /* First time at this BACK, make room to store the pos. */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4818 if (ga_grow(&backpos, 1) == FAIL)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4819 status = RA_FAIL;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4820 else
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4821 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4822 /* get "ga_data" again, it may have changed */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4823 bp = (backpos_T *)backpos.ga_data;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4824 bp[i].bp_scan = scan;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4825 ++backpos.ga_len;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4826 }
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4827 }
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4828 else if (reg_save_equal(&bp[i].bp_pos))
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4829 /* Still at same position as last time, fail. */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4830 status = RA_NOMATCH;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4831
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4832 if (status != RA_FAIL && status != RA_NOMATCH)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4833 reg_save(&bp[i].bp_pos, &backpos);
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4834 }
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
4835 break;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
4836
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4837 case MOPEN + 0: /* Match start: \zs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4838 case MOPEN + 1: /* \( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4839 case MOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4840 case MOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4841 case MOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4842 case MOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4843 case MOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4844 case MOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 case MOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4846 case MOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 no = op - MOPEN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 cleanup_subexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4850 rp = regstack_push(RS_MOPEN, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4851 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4852 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4853 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4854 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4855 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4856 save_se(&rp->rs_un.sesave, &reg_startpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4857 &reg_startp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4858 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4859 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4861 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4862
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863 case NOPEN: /* \%( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 case NCLOSE: /* \) after \%( */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4865 if (regstack_push(RS_NOPEN, scan) == NULL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4866 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4867 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4868 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4871 case ZOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4872 case ZOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4873 case ZOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 case ZOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4875 case ZOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4876 case ZOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4877 case ZOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4878 case ZOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4879 case ZOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4880 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 no = op - ZOPEN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4882 cleanup_zsubexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4883 rp = regstack_push(RS_ZOPEN, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4884 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4885 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4886 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4887 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4888 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4889 save_se(&rp->rs_un.sesave, &reg_startzpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4890 &reg_startzp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4891 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4892 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4893 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4894 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4895 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4896
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4897 case MCLOSE + 0: /* Match end: \ze */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4898 case MCLOSE + 1: /* \) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4899 case MCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4900 case MCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 case MCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 case MCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 case MCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 case MCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 case MCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 case MCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 no = op - MCLOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909 cleanup_subexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4910 rp = regstack_push(RS_MCLOSE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4911 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4912 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4913 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4914 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4915 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4916 save_se(&rp->rs_un.sesave, &reg_endpos[no], &reg_endp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4917 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4918 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4919 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4920 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4921
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4923 case ZCLOSE + 1: /* \) after \z( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 case ZCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4925 case ZCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4926 case ZCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4927 case ZCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 case ZCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929 case ZCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 case ZCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 case ZCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4932 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4933 no = op - ZCLOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4934 cleanup_zsubexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4935 rp = regstack_push(RS_ZCLOSE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4936 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4937 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4938 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4939 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4940 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4941 save_se(&rp->rs_un.sesave, &reg_endzpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4942 &reg_endzp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4943 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4944 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4945 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4946 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4947 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4948
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949 case BACKREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 case BACKREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 case BACKREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 case BACKREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 case BACKREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4954 case BACKREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4955 case BACKREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4956 case BACKREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4957 case BACKREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4959 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 no = op - BACKREF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4962 cleanup_subexpr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4963 if (!REG_MULTI) /* Single-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
4965 if (reg_startp[no] == NULL || reg_endp[no] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4968 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4970 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4971 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4972 /* Compare current input with back-ref in the same
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4973 * line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4974 len = (int)(reg_endp[no] - reg_startp[no]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4975 if (cstrncmp(reg_startp[no], reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4976 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 else /* Multi-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
4981 if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4982 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4985 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4986 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4988 if (reg_startpos[no].lnum == reglnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4989 && reg_endpos[no].lnum == reglnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4991 /* Compare back-ref within the current line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 len = reg_endpos[no].col - reg_startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4993 if (cstrncmp(regline + reg_startpos[no].col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4994 reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4995 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4996 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4997 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4999 /* Messy situation: Need to compare between two
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5000 * lines. */
4901
56fbf60e9476 updated for version 7.3.1196
Bram Moolenaar <bram@vim.org>
parents: 4899
diff changeset
5001 int r = match_with_backref(
4891
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
5002 reg_startpos[no].lnum,
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
5003 reg_startpos[no].col,
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
5004 reg_endpos[no].lnum,
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
5005 reg_endpos[no].col,
4899
4837fd61be52 updated for version 7.3.1195
Bram Moolenaar <bram@vim.org>
parents: 4891
diff changeset
5006 &len);
4901
56fbf60e9476 updated for version 7.3.1196
Bram Moolenaar <bram@vim.org>
parents: 4899
diff changeset
5007
56fbf60e9476 updated for version 7.3.1196
Bram Moolenaar <bram@vim.org>
parents: 4899
diff changeset
5008 if (r != RA_MATCH)
56fbf60e9476 updated for version 7.3.1196
Bram Moolenaar <bram@vim.org>
parents: 4899
diff changeset
5009 status = r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5010 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5011 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5012 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5013
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5014 /* Matched the backref, skip over it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5015 reginput += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5017 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5018
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5019 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5020 case ZREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5021 case ZREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5022 case ZREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5023 case ZREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5024 case ZREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5025 case ZREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5026 case ZREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5027 case ZREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 case ZREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5032 cleanup_zsubexpr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 no = op - ZREF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5034 if (re_extmatch_in != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5035 && re_extmatch_in->matches[no] != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5037 len = (int)STRLEN(re_extmatch_in->matches[no]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5038 if (cstrncmp(re_extmatch_in->matches[no],
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5039 reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5040 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5041 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5042 reginput += len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5043 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5044 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5045 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5046 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5047 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5049 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5050 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5051
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5052 case BRANCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5054 if (OP(next) != BRANCH) /* No choice. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5055 next = OPERAND(scan); /* Avoid recursion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5057 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5058 rp = regstack_push(RS_BRANCH, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5059 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5060 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5061 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5062 status = RA_BREAK; /* rest is below */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5063 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5065 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5066
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5067 case BRACE_LIMITS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5068 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5069 if (OP(next) == BRACE_SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5071 bl_minval = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 bl_maxval = OPERAND_MAX(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 else if (OP(next) >= BRACE_COMPLEX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075 && OP(next) < BRACE_COMPLEX + 10)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 no = OP(next) - BRACE_COMPLEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5078 brace_min[no] = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5079 brace_max[no] = OPERAND_MAX(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5080 brace_count[no] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5081 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5082 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5083 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5084 EMSG(_(e_internal)); /* Shouldn't happen */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5085 status = RA_FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5088 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5089
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 case BRACE_COMPLEX + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5091 case BRACE_COMPLEX + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5092 case BRACE_COMPLEX + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5093 case BRACE_COMPLEX + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5094 case BRACE_COMPLEX + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5095 case BRACE_COMPLEX + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096 case BRACE_COMPLEX + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5097 case BRACE_COMPLEX + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5098 case BRACE_COMPLEX + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5099 case BRACE_COMPLEX + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5100 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5101 no = op - BRACE_COMPLEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5102 ++brace_count[no];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5104 /* If not matched enough times yet, try one more */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5105 if (brace_count[no] <= (brace_min[no] <= brace_max[no]
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5106 ? brace_min[no] : brace_max[no]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5107 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5108 rp = regstack_push(RS_BRCPLX_MORE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5109 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5110 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5111 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5112 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5113 rp->rs_no = no;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5114 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5115 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5116 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5117 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5118 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5119 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5121 /* If matched enough times, may try matching some more */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5122 if (brace_min[no] <= brace_max[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5124 /* Range is the normal way around, use longest match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5125 if (brace_count[no] <= brace_max[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5126 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5127 rp = regstack_push(RS_BRCPLX_LONG, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5128 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5129 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5130 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5131 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5132 rp->rs_no = no;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5133 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5134 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5135 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5136 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5137 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5138 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5139 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5141 /* Range is backwards, use shortest match first */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5142 if (brace_count[no] <= brace_min[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5143 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5144 rp = regstack_push(RS_BRCPLX_SHORT, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5145 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5146 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5147 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5148 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5149 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5150 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5151 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5152 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5153 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5155 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5157 case BRACE_SIMPLE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5158 case STAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5159 case PLUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5160 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5161 regstar_T rst;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5162
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5164 * Lookahead to avoid useless match attempts when we know
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5165 * what character comes next.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5166 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5167 if (OP(next) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5168 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5169 rst.nextb = *OPERAND(next);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5170 if (ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5171 {
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5172 if (MB_ISUPPER(rst.nextb))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5173 rst.nextb_ic = MB_TOLOWER(rst.nextb);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5174 else
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5175 rst.nextb_ic = MB_TOUPPER(rst.nextb);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5177 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5178 rst.nextb_ic = rst.nextb;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5179 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5180 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5181 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5182 rst.nextb = NUL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5183 rst.nextb_ic = NUL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 if (op != BRACE_SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5187 rst.minval = (op == STAR) ? 0 : 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5188 rst.maxval = MAX_LIMIT;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5189 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5190 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5192 rst.minval = bl_minval;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5193 rst.maxval = bl_maxval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5194 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5195
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5197 * When maxval > minval, try matching as much as possible, up
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5198 * to maxval. When maxval < minval, try matching at least the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5199 * minimal number (since the range is backwards, that's also
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5200 * maxval!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5202 rst.count = regrepeat(OPERAND(scan), rst.maxval);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5203 if (got_int)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5204 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5205 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5206 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5207 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5208 if (rst.minval <= rst.maxval
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5209 ? rst.count >= rst.minval : rst.count >= rst.maxval)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5211 /* It could match. Prepare for trying to match what
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5212 * follows. The code is below. Parameters are stored in
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5213 * a regstar_T on the regstack. */
212
e39657bbbb98 updated for version 7.0060
vimboss
parents: 195
diff changeset
5214 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5215 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5216 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5217 status = RA_FAIL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5218 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5219 else if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5220 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5221 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5222 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5223 regstack.ga_len += sizeof(regstar_T);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5224 rp = regstack_push(rst.minval <= rst.maxval
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5225 ? RS_STAR_LONG : RS_STAR_SHORT, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5226 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5227 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5228 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5229 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5230 *(((regstar_T *)rp) - 1) = rst;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5231 status = RA_BREAK; /* skip the restore bits */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5233 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5235 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5236 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5237
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5238 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5239 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5241 case NOMATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5242 case MATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5243 case SUBPAT:
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5244 rp = regstack_push(RS_NOMATCH, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5245 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5246 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5247 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5248 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5249 rp->rs_no = op;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5250 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5251 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5252 /* We continue and handle the result when done. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5253 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5254 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5255
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5256 case BEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5257 case NOBEHIND:
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5258 /* Need a bit of room to store extra positions. */
212
e39657bbbb98 updated for version 7.0060
vimboss
parents: 195
diff changeset
5259 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5260 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5261 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5262 status = RA_FAIL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5263 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5264 else if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5265 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5266 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5268 regstack.ga_len += sizeof(regbehind_T);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5269 rp = regstack_push(RS_BEHIND1, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5270 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5271 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5272 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273 {
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5274 /* Need to save the subexpr to be able to restore them
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5275 * when there is a match but we don't use it. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5276 save_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5277
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5278 rp->rs_no = op;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5279 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5280 /* First try if what follows matches. If it does then we
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5281 * check the behind match by looping. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5283 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5284 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5286 case BHPOS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5287 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5288 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5289 if (behind_pos.rs_u.pos.col != (colnr_T)(reginput - regline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5290 || behind_pos.rs_u.pos.lnum != reglnum)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5291 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5292 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5293 else if (behind_pos.rs_u.ptr != reginput)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5294 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5295 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5296
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5297 case NEWL:
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5298 if ((c != NUL || !REG_MULTI || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5299 || reg_line_lbr) && (c != '\n' || !reg_line_lbr))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5300 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5301 else if (reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5302 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5303 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5304 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5305 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5307 case END:
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5308 status = RA_MATCH; /* Success! */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5309 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5311 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5312 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5313 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5314 printf("Illegal op code %d\n", op);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5315 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5316 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5317 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5318 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5319 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5320
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5321 /* If we can't continue sequentially, break the inner loop. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5322 if (status != RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5323 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5324
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5325 /* Continue in inner loop, advance to next item. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5326 scan = next;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5327
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5328 } /* end of inner loop */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5330 /*
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5331 * If there is something on the regstack execute the code for the state.
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5332 * If the state is popped then loop and use the older state.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5333 */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5334 while (regstack.ga_len > 0 && status != RA_FAIL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5335 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5336 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5337 switch (rp->rs_state)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5338 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5339 case RS_NOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5340 /* Result is passed on as-is, simply pop the state. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5341 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5342 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5343
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5344 case RS_MOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5345 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5346 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5347 restore_se(&rp->rs_un.sesave, &reg_startpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5348 &reg_startp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5349 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5350 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5351
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5352 #ifdef FEAT_SYN_HL
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5353 case RS_ZOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5354 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5355 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5356 restore_se(&rp->rs_un.sesave, &reg_startzpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5357 &reg_startzp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5358 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5359 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5360 #endif
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5361
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5362 case RS_MCLOSE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5363 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5364 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5365 restore_se(&rp->rs_un.sesave, &reg_endpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5366 &reg_endp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5367 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5368 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5369
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5370 #ifdef FEAT_SYN_HL
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5371 case RS_ZCLOSE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5372 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5373 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5374 restore_se(&rp->rs_un.sesave, &reg_endzpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5375 &reg_endzp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5376 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5377 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5378 #endif
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5379
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5380 case RS_BRANCH:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5381 if (status == RA_MATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5382 /* this branch matched, use it */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5383 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5384 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5385 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5386 if (status != RA_BREAK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5387 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5388 /* After a non-matching branch: try next one. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5389 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5390 scan = rp->rs_scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5391 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5392 if (scan == NULL || OP(scan) != BRANCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5393 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5394 /* no more branches, didn't find a match */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5395 status = RA_NOMATCH;
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5396 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5397 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5398 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5399 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5400 /* Prepare to try a branch. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5401 rp->rs_scan = regnext(scan);
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5402 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5403 scan = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5404 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5405 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5406 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5407
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5408 case RS_BRCPLX_MORE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5409 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5410 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5411 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5412 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5413 --brace_count[rp->rs_no]; /* decrement match count */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5414 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5415 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5416 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5417
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5418 case RS_BRCPLX_LONG:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5419 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5420 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5421 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5422 /* There was no match, but we did find enough matches. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5423 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5424 --brace_count[rp->rs_no];
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5425 /* continue with the items after "\{}" */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5426 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5427 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5428 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5429 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5430 scan = regnext(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5431 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5432
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5433 case RS_BRCPLX_SHORT:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5434 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5435 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5436 /* There was no match, try to match one more item. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5437 reg_restore(&rp->rs_un.regsave, &backpos);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5438 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5439 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5440 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5441 scan = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5442 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5443 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5444 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5445
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5446 case RS_NOMATCH:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5447 /* Pop the state. If the operand matches for NOMATCH or
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5448 * doesn't match for MATCH/SUBPAT, we fail. Otherwise backup,
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5449 * except for SUBPAT, and continue with the next item. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5450 if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5451 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5452 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5453 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5454 status = RA_CONT;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5455 if (rp->rs_no != SUBPAT) /* zero-width */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5456 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5457 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5458 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5459 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5460 scan = regnext(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5461 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5462
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5463 case RS_BEHIND1:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5464 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5465 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5466 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5467 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5468 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5469 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5470 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5471 /* The stuff after BEHIND/NOBEHIND matches. Now try if
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5472 * the behind part does (not) match before the current
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5473 * position in the input. This must be done at every
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5474 * position in the input and checking if the match ends at
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5475 * the current position. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5476
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5477 /* save the position after the found match for next */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5478 reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5479
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5480 /* Start looking for a match with operand at the current
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
5481 * position. Go back one character until we find the
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5482 * result, hitting the start of the line or the previous
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5483 * line (for multi-line matching).
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5484 * Set behind_pos to where the match should end, BHPOS
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5485 * will match it. Save the current value. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5486 (((regbehind_T *)rp) - 1)->save_behind = behind_pos;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5487 behind_pos = rp->rs_un.regsave;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5488
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5489 rp->rs_state = RS_BEHIND2;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5490
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5491 reg_restore(&rp->rs_un.regsave, &backpos);
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5492 scan = OPERAND(rp->rs_scan) + 4;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5493 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5494 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5495
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5496 case RS_BEHIND2:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5497 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5498 * Looping for BEHIND / NOBEHIND match.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5499 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5500 if (status == RA_MATCH && reg_save_equal(&behind_pos))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5501 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5502 /* found a match that ends where "next" started */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5503 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5504 if (rp->rs_no == BEHIND)
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5505 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5506 &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5507 else
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5508 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5509 /* But we didn't want a match. Need to restore the
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5510 * subexpr, because what follows matched, so they have
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5511 * been set. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5512 status = RA_NOMATCH;
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5513 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5514 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5515 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5516 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5517 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5518 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5519 {
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5520 long limit;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5521
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5522 /* No match or a match that doesn't end where we want it: Go
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5523 * back one character. May go to previous line once. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5524 no = OK;
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5525 limit = OPERAND_MIN(rp->rs_scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5526 if (REG_MULTI)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5527 {
4682
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5528 if (limit > 0
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5529 && ((rp->rs_un.regsave.rs_u.pos.lnum
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5530 < behind_pos.rs_u.pos.lnum
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5531 ? (colnr_T)STRLEN(regline)
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5532 : behind_pos.rs_u.pos.col)
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5533 - rp->rs_un.regsave.rs_u.pos.col >= limit))
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5534 no = FAIL;
2f51ee8825db updated for version 7.3.1088
Bram Moolenaar <bram@vim.org>
parents: 4679
diff changeset
5535 else if (rp->rs_un.regsave.rs_u.pos.col == 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5536 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5537 if (rp->rs_un.regsave.rs_u.pos.lnum
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5538 < behind_pos.rs_u.pos.lnum
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5539 || reg_getline(
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5540 --rp->rs_un.regsave.rs_u.pos.lnum)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5541 == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5542 no = FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5543 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5544 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5545 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5546 rp->rs_un.regsave.rs_u.pos.col =
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5547 (colnr_T)STRLEN(regline);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5548 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5549 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5550 else
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5551 {
4176
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5552 #ifdef FEAT_MBYTE
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5553 if (has_mbyte)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5554 rp->rs_un.regsave.rs_u.pos.col -=
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5555 (*mb_head_off)(regline, regline
4176
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5556 + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5557 else
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5558 #endif
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5559 --rp->rs_un.regsave.rs_u.pos.col;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5560 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5561 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5562 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5563 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5564 if (rp->rs_un.regsave.rs_u.ptr == regline)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5565 no = FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5566 else
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5567 {
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5568 mb_ptr_back(regline, rp->rs_un.regsave.rs_u.ptr);
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5569 if (limit > 0 && (long)(behind_pos.rs_u.ptr
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5570 - rp->rs_un.regsave.rs_u.ptr) > limit)
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5571 no = FAIL;
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5572 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5573 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5574 if (no == OK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5575 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5576 /* Advanced, prepare for finding match again. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5577 reg_restore(&rp->rs_un.regsave, &backpos);
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
5578 scan = OPERAND(rp->rs_scan) + 4;
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5579 if (status == RA_MATCH)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5580 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5581 /* We did match, so subexpr may have been changed,
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5582 * need to restore them for the next try. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5583 status = RA_NOMATCH;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5584 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5585 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5586 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5587 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5588 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5589 /* Can't advance. For NOBEHIND that's a match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5590 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5591 if (rp->rs_no == NOBEHIND)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5592 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5593 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5594 &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5595 status = RA_MATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5596 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5597 else
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5598 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5599 /* We do want a proper match. Need to restore the
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5600 * subexpr if we had a match, because they may have
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5601 * been set. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5602 if (status == RA_MATCH)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5603 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5604 status = RA_NOMATCH;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5605 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5606 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5607 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5608 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5609 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5610 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5611 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5612 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5613
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5614 case RS_STAR_LONG:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5615 case RS_STAR_SHORT:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5616 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5617 regstar_T *rst = ((regstar_T *)rp) - 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5618
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5619 if (status == RA_MATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5620 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5621 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5622 regstack.ga_len -= sizeof(regstar_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5623 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5624 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5625
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5626 /* Tried once already, restore input pointers. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5627 if (status != RA_BREAK)
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5628 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5629
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5630 /* Repeat until we found a position where it could match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5631 for (;;)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5632 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5633 if (status != RA_BREAK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5634 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5635 /* Tried first position already, advance. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5636 if (rp->rs_state == RS_STAR_LONG)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5637 {
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5638 /* Trying for longest match, but couldn't or
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5639 * didn't match -- back up one char. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5640 if (--rst->count < rst->minval)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5641 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5642 if (reginput == regline)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5643 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5644 /* backup to last char of previous line */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5645 --reglnum;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5646 regline = reg_getline(reglnum);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5647 /* Just in case regrepeat() didn't count
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5648 * right. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5649 if (regline == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5650 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5651 reginput = regline + STRLEN(regline);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5652 fast_breakcheck();
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5653 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5654 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5655 mb_ptr_back(regline, reginput);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5656 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5657 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5658 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5659 /* Range is backwards, use shortest match first.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5660 * Careful: maxval and minval are exchanged!
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5661 * Couldn't or didn't match: try advancing one
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5662 * char. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5663 if (rst->count == rst->minval
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5664 || regrepeat(OPERAND(rp->rs_scan), 1L) == 0)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5665 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5666 ++rst->count;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5667 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5668 if (got_int)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5669 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5670 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5671 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5672 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5673
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5674 /* If it could match, try it. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5675 if (rst->nextb == NUL || *reginput == rst->nextb
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5676 || *reginput == rst->nextb_ic)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5677 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5678 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5679 scan = regnext(rp->rs_scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5680 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5681 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5682 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5683 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5684 if (status != RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5685 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5686 /* Failed. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5687 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5688 regstack.ga_len -= sizeof(regstar_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5689 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5690 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5691 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5692 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5693 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5694
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5695 /* If we want to continue the inner loop or didn't pop a state
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5696 * continue matching loop */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5697 if (status == RA_CONT || rp == (regitem_T *)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5698 ((char *)regstack.ga_data + regstack.ga_len) - 1)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5699 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5700 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5701
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5702 /* May need to continue with the inner loop, starting at "scan". */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5703 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5704 continue;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5705
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5706 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5707 * If the regstack is empty or something failed we are done.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5708 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5709 if (regstack.ga_len == 0 || status == RA_FAIL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5710 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5711 if (scan == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5712 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5713 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5714 * We get here only if there's trouble -- normally "case END" is
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5715 * the terminating point.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5716 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5717 EMSG(_(e_re_corr));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 #ifdef DEBUG
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5719 printf("Premature EOL\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5720 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5721 }
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5722 if (status == RA_FAIL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5723 got_int = TRUE;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5724 return (status == RA_MATCH);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5725 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5726
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5727 } /* End of loop until the regstack is empty. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5728
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5729 /* NOTREACHED */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5730 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5731
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5732 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5733 * Push an item onto the regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5734 * Returns pointer to new item. Returns NULL when out of memory.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5735 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5736 static regitem_T *
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5737 regstack_push(state, scan)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5738 regstate_T state;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5739 char_u *scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5740 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5741 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5742
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5743 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5744 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5745 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5746 return NULL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5747 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5748 if (ga_grow(&regstack, sizeof(regitem_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5749 return NULL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5750
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5751 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5752 rp->rs_state = state;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5753 rp->rs_scan = scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5754
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5755 regstack.ga_len += sizeof(regitem_T);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5756 return rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5757 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5758
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5759 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5760 * Pop an item from the regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5761 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5762 static void
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5763 regstack_pop(scan)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5764 char_u **scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5765 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5766 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5767
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5768 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5769 *scan = rp->rs_scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5770
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5771 regstack.ga_len -= sizeof(regitem_T);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5772 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5773
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5774 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5775 * regrepeat - repeatedly match something simple, return how many.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5776 * Advances reginput (and reglnum) to just after the matched chars.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5777 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5778 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5779 regrepeat(p, maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5780 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5781 long maxcount; /* maximum number of matches allowed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5783 long count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5784 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5785 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5786 int mask;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5787 int testval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5788
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5789 scan = reginput; /* Make local copy of reginput for speed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5790 opnd = OPERAND(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5791 switch (OP(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5792 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5793 case ANY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5794 case ANY + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5795 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5797 /* Matching anything means we continue until end-of-line (or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5798 * end-of-file for ANY + ADD_NL), only limited by maxcount. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5799 while (*scan != NUL && count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5800 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5801 ++count;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5802 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5803 }
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5804 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5805 || reg_line_lbr || count == maxcount)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5806 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5807 ++count; /* count the line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5808 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5809 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5810 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5811 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5813 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5814
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5815 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5816 case IDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5817 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5818 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5819 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5820 case SIDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5821 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5822 {
4466
4ff8fa416a0d updated for version 7.3.981
Bram Moolenaar <bram@vim.org>
parents: 4460
diff changeset
5823 if (vim_isIDc(PTR2CHAR(scan)) && (testval || !VIM_ISDIGIT(*scan)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5824 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5825 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5826 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5827 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5828 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5829 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5830 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5831 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5832 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5833 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5834 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5835 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5837 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5838 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5839 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5840 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5841 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5842 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5843 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5844
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5845 case KWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5846 case KWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5847 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5848 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5849 case SKWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5850 case SKWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5851 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5852 {
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
5853 if (vim_iswordp_buf(scan, reg_buf)
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
5854 && (testval || !VIM_ISDIGIT(*scan)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5855 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5856 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5857 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5858 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5859 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5860 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5861 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5862 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5863 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5864 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5865 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5866 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5868 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5869 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5870 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5871 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5872 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5873 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5874 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5875
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5876 case FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5877 case FNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5878 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5879 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5880 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5881 case SFNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5882 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5883 {
4466
4ff8fa416a0d updated for version 7.3.981
Bram Moolenaar <bram@vim.org>
parents: 4460
diff changeset
5884 if (vim_isfilec(PTR2CHAR(scan)) && (testval || !VIM_ISDIGIT(*scan)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5885 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5886 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5887 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5888 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5889 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5890 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5891 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5892 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5893 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5894 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5895 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5896 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5898 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5899 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5900 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5901 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5902 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5904 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5905
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5906 case PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5907 case PRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5908 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5909 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5910 case SPRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5911 case SPRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5912 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5914 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5915 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5916 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5917 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5918 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5919 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5920 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5921 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5922 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5923 }
5221
9982ec574beb updated for version 7.4a.036
Bram Moolenaar <bram@vim.org>
parents: 4901
diff changeset
5924 else if (vim_isprintc(PTR2CHAR(scan)) == 1
9982ec574beb updated for version 7.4a.036
Bram Moolenaar <bram@vim.org>
parents: 4901
diff changeset
5925 && (testval || !VIM_ISDIGIT(*scan)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5926 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5927 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5928 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5929 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5930 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5931 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5932 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5933 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5934 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5935 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5937 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5938 case WHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5939 testval = mask = RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5940 do_class:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5941 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5942 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5943 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5944 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5945 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5946 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5947 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5948 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5949 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5950 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5951 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5952 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5953 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5954 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5955 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5956 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
5957 else if (has_mbyte && (l = (*mb_ptr2len)(scan)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5959 if (testval != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5960 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5961 scan += l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5963 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5964 else if ((class_tab[*scan] & mask) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5965 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5966 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5967 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5968 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5969 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5970 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5971 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5972 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5973
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5974 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5975 case NWHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5976 mask = RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5977 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5978 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5979 case DIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5980 testval = mask = RI_DIGIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5981 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5982 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5983 case NDIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5984 mask = RI_DIGIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5985 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5986 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5987 case HEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5988 testval = mask = RI_HEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5989 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5990 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5991 case NHEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5992 mask = RI_HEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5993 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5994 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5995 case OCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5996 testval = mask = RI_OCTAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5997 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5998 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5999 case NOCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6000 mask = RI_OCTAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6001 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6002 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6003 case WORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6004 testval = mask = RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6005 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6006 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6007 case NWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6008 mask = RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6009 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6010 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6011 case HEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6012 testval = mask = RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6013 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6014 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6015 case NHEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6016 mask = RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6017 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6018 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6019 case ALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6020 testval = mask = RI_ALPHA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6021 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6022 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6023 case NALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6024 mask = RI_ALPHA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6025 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6026 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6027 case LOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6028 testval = mask = RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6029 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6030 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6031 case NLOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6032 mask = RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6033 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6034 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6035 case UPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6036 testval = mask = RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6037 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6038 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6039 case NUPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6040 mask = RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6041 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6043 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6044 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6045 int cu, cl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6046
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6047 /* This doesn't do a multi-byte character, because a MULTIBYTECODE
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
6048 * would have been used for it. It does handle single-byte
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
6049 * characters, such as latin1. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6050 if (ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6051 {
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
6052 cu = MB_TOUPPER(*opnd);
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
6053 cl = MB_TOLOWER(*opnd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6054 while (count < maxcount && (*scan == cu || *scan == cl))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6056 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6057 scan++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6060 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6061 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6062 cu = *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6063 while (count < maxcount && *scan == cu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6065 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6066 scan++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6067 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6068 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6069 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6070 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6072 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6073 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6074 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6075 int i, len, cf = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6076
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6077 /* Safety check (just in case 'encoding' was changed since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6078 * compiling the program). */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
6079 if ((len = (*mb_ptr2len)(opnd)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6080 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6081 if (ireg_ic && enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6082 cf = utf_fold(utf_ptr2char(opnd));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6083 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6084 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6085 for (i = 0; i < len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6086 if (opnd[i] != scan[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6087 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6088 if (i < len && (!ireg_ic || !enc_utf8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6089 || utf_fold(utf_ptr2char(scan)) != cf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6090 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6091 scan += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6092 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6094 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6096 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6097 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6099 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6100 case ANYOF + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6101 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6102 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6104 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6105 case ANYBUT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6106 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6107 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6108 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6109 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6110 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6111 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6112 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6113 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6114 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6115 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6116 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6117 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6118 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6119 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6120 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6121 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6122 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6123 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
6124 else if (has_mbyte && (len = (*mb_ptr2len)(scan)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6125 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6126 if ((cstrchr(opnd, (*mb_ptr2char)(scan)) == NULL) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6127 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6128 scan += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6130 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6131 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6132 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6133 if ((cstrchr(opnd, *scan) == NULL) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6134 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6135 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6136 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6137 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6138 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6139 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6140
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6141 case NEWL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6142 while (count < maxcount
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6143 && ((*scan == NUL && reglnum <= reg_maxline && !reg_line_lbr
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6144 && REG_MULTI) || (*scan == '\n' && reg_line_lbr)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6145 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6146 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6147 if (reg_line_lbr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6148 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6149 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6150 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6153 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 default: /* Oh dear. Called inappropriately. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 printf("Called regrepeat with op code %d\n", OP(p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6165 reginput = scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6167 return (int)count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171 * regnext - dig the "next" pointer out of a node
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
6172 * Returns NULL when calculating size, when there is no next item and when
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
6173 * there is an error.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 regnext(p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 int offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
6181 if (p == JUST_CALC_SIZE || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184 offset = NEXT(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 if (offset == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6187
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6188 if (OP(p) == BACK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6189 return p - offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6191 return p + offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6192 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6194 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6195 * Check the regexp program for its magic number.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6196 * Return TRUE if it's wrong.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6197 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6199 prog_magic_wrong()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6200 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6201 regprog_T *prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6202
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6203 prog = REG_MULTI ? reg_mmatch->regprog : reg_match->regprog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6204 if (prog->engine == &nfa_regengine)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6205 /* For NFA matcher we don't check the magic */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6206 return FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6207
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6208 if (UCHARAT(((bt_regprog_T *)prog)->program) != REGMAGIC)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6210 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6211 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6212 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6213 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6214 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6215
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6216 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6217 * Cleanup the subexpressions, if this wasn't done yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6218 * This construction is used to clear the subexpressions only when they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6219 * used (to increase speed).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6220 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6221 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6222 cleanup_subexpr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6224 if (need_clear_subexpr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6226 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6227 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6228 /* Use 0xff to set lnum to -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6229 vim_memset(reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6230 vim_memset(reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6232 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6233 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6234 vim_memset(reg_startp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6235 vim_memset(reg_endp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6236 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6237 need_clear_subexpr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6238 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6241 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6242 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6243 cleanup_zsubexpr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6244 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6245 if (need_clear_zsubexpr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6246 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6247 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6249 /* Use 0xff to set lnum to -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6250 vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6251 vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6252 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6253 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6255 vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6256 vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6258 need_clear_zsubexpr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6260 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6261 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6263 /*
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6264 * Save the current subexpr to "bp", so that they can be restored
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6265 * later by restore_subexpr().
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6266 */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6267 static void
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6268 save_subexpr(bp)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6269 regbehind_T *bp;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6270 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6271 int i;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6272
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6273 /* When "need_clear_subexpr" is set we don't need to save the values, only
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6274 * remember that this flag needs to be set again when restoring. */
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6275 bp->save_need_clear_subexpr = need_clear_subexpr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6276 if (!need_clear_subexpr)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6277 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6278 for (i = 0; i < NSUBEXP; ++i)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6279 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6280 if (REG_MULTI)
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6281 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6282 bp->save_start[i].se_u.pos = reg_startpos[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6283 bp->save_end[i].se_u.pos = reg_endpos[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6284 }
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6285 else
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6286 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6287 bp->save_start[i].se_u.ptr = reg_startp[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6288 bp->save_end[i].se_u.ptr = reg_endp[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6289 }
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6290 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6291 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6292 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6293
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6294 /*
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6295 * Restore the subexpr from "bp".
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6296 */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6297 static void
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6298 restore_subexpr(bp)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6299 regbehind_T *bp;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6300 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6301 int i;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6302
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6303 /* Only need to restore saved values when they are not to be cleared. */
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6304 need_clear_subexpr = bp->save_need_clear_subexpr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6305 if (!need_clear_subexpr)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6306 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6307 for (i = 0; i < NSUBEXP; ++i)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6308 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6309 if (REG_MULTI)
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6310 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6311 reg_startpos[i] = bp->save_start[i].se_u.pos;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6312 reg_endpos[i] = bp->save_end[i].se_u.pos;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6313 }
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6314 else
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6315 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6316 reg_startp[i] = bp->save_start[i].se_u.ptr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6317 reg_endp[i] = bp->save_end[i].se_u.ptr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6318 }
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6319 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6320 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6321 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6322
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6323 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 * Advance reglnum, regline and reginput to the next line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6325 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6326 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6327 reg_nextline()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6328 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6329 regline = reg_getline(++reglnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6330 reginput = regline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6331 fast_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6333
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 * Save the input line and position in a regsave_T.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 static void
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6338 reg_save(save, gap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 regsave_T *save;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6340 garray_T *gap;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 save->rs_u.pos.col = (colnr_T)(reginput - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 save->rs_u.pos.lnum = reglnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348 save->rs_u.ptr = reginput;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6349 save->rs_len = gap->ga_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 * Restore the input line and position from a regsave_T.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355 static void
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6356 reg_restore(save, gap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357 regsave_T *save;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6358 garray_T *gap;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6360 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362 if (reglnum != save->rs_u.pos.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6363 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6364 /* only call reg_getline() when the line number changed to save
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6365 * a bit of time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6366 reglnum = save->rs_u.pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6367 regline = reg_getline(reglnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6369 reginput = regline + save->rs_u.pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 reginput = save->rs_u.ptr;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6373 gap->ga_len = save->rs_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6376 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6377 * Return TRUE if current position is equal to saved position.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 reg_save_equal(save)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6381 regsave_T *save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6382 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6383 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6384 return reglnum == save->rs_u.pos.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6385 && reginput == regline + save->rs_u.pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6386 return reginput == save->rs_u.ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6387 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6389 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6390 * Tentatively set the sub-expression start to the current position (after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6391 * calling regmatch() they will have changed). Need to save the existing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6392 * values for when there is no match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6393 * Use se_save() to use pointer (save_se_multi()) or position (save_se_one()),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6394 * depending on REG_MULTI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6395 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6396 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6397 save_se_multi(savep, posp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6398 save_se_T *savep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6399 lpos_T *posp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6400 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6401 savep->se_u.pos = *posp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6402 posp->lnum = reglnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6403 posp->col = (colnr_T)(reginput - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6404 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6405
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6406 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6407 save_se_one(savep, pp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6408 save_se_T *savep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6409 char_u **pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6410 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6411 savep->se_u.ptr = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6412 *pp = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6414
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6415 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6416 * Compare a number with the operand of RE_LNUM, RE_COL or RE_VCOL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6417 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6418 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 re_num_cmp(val, scan)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 long_u val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6421 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6423 long_u n = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6424
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 if (OPERAND_CMP(scan) == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 return val > n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6427 if (OPERAND_CMP(scan) == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6428 return val < n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429 return val == n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6430 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431
4891
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6432 /*
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6433 * Check whether a backreference matches.
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6434 * Returns RA_FAIL, RA_NOMATCH or RA_MATCH.
5504
ec5d11403c19 updated for version 7.4.101
Bram Moolenaar <bram@vim.org>
parents: 5353
diff changeset
6435 * If "bytelen" is not NULL, it is set to the byte length of the match in the
ec5d11403c19 updated for version 7.4.101
Bram Moolenaar <bram@vim.org>
parents: 5353
diff changeset
6436 * last line.
4891
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6437 */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6438 static int
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6439 match_with_backref(start_lnum, start_col, end_lnum, end_col, bytelen)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6440 linenr_T start_lnum;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6441 colnr_T start_col;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6442 linenr_T end_lnum;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6443 colnr_T end_col;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6444 int *bytelen;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6445 {
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6446 linenr_T clnum = start_lnum;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6447 colnr_T ccol = start_col;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6448 int len;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6449 char_u *p;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6450
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6451 if (bytelen != NULL)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6452 *bytelen = 0;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6453 for (;;)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6454 {
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6455 /* Since getting one line may invalidate the other, need to make copy.
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6456 * Slow! */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6457 if (regline != reg_tofree)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6458 {
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6459 len = (int)STRLEN(regline);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6460 if (reg_tofree == NULL || len >= (int)reg_tofreelen)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6461 {
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6462 len += 50; /* get some extra */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6463 vim_free(reg_tofree);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6464 reg_tofree = alloc(len);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6465 if (reg_tofree == NULL)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6466 return RA_FAIL; /* out of memory!*/
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6467 reg_tofreelen = len;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6468 }
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6469 STRCPY(reg_tofree, regline);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6470 reginput = reg_tofree + (reginput - regline);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6471 regline = reg_tofree;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6472 }
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6473
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6474 /* Get the line to compare with. */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6475 p = reg_getline(clnum);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6476 if (clnum == end_lnum)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6477 len = end_col - ccol;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6478 else
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6479 len = (int)STRLEN(p + ccol);
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6480
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6481 if (cstrncmp(p + ccol, reginput, &len) != 0)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6482 return RA_NOMATCH; /* doesn't match */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6483 if (bytelen != NULL)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6484 *bytelen += len;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6485 if (clnum == end_lnum)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6486 break; /* match and at end! */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6487 if (reglnum >= reg_maxline)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6488 return RA_NOMATCH; /* text too short */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6489
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6490 /* Advance to next line. */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6491 reg_nextline();
5504
ec5d11403c19 updated for version 7.4.101
Bram Moolenaar <bram@vim.org>
parents: 5353
diff changeset
6492 if (bytelen != NULL)
ec5d11403c19 updated for version 7.4.101
Bram Moolenaar <bram@vim.org>
parents: 5353
diff changeset
6493 *bytelen = 0;
4891
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6494 ++clnum;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6495 ccol = 0;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6496 if (got_int)
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6497 return RA_FAIL;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6498 }
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6499
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6500 /* found a match! Note that regline may now point to a copy of the line,
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6501 * that should not matter. */
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6502 return RA_MATCH;
4c42efb4c098 updated for version 7.3.1191
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
6503 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6505 #ifdef BT_REGEXP_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508 * regdump - dump a regexp onto stdout in vaguely comprehensible form
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6509 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6510 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6511 regdump(pattern, r)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6512 char_u *pattern;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6513 bt_regprog_T *r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6514 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6515 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6516 int op = EXACTLY; /* Arbitrary non-END op. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6517 char_u *next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6518 char_u *end = NULL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6519 FILE *f;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6520
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6521 #ifdef BT_REGEXP_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6522 f = fopen("bt_regexp_log.log", "a");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6523 #else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6524 f = stdout;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6525 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6526 if (f == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6527 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6528 fprintf(f, "-------------------------------------\n\r\nregcomp(%s):\r\n", pattern);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6529
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6530 s = r->program + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6531 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6532 * Loop until we find the END that isn't before a referred next (an END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6533 * can also appear in a NOMATCH operand).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6534 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6535 while (op != END || s <= end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6537 op = OP(s);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6538 fprintf(f, "%2d%s", (int)(s - r->program), regprop(s)); /* Where, what. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6539 next = regnext(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6540 if (next == NULL) /* Next ptr. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6541 fprintf(f, "(0)");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6542 else
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6543 fprintf(f, "(%d)", (int)((s - r->program) + (next - s)));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6544 if (end < next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6545 end = next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6546 if (op == BRACE_LIMITS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6547 {
4746
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6548 /* Two ints */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6549 fprintf(f, " minval %ld, maxval %ld", OPERAND_MIN(s), OPERAND_MAX(s));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6550 s += 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6551 }
4746
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6552 else if (op == BEHIND || op == NOBEHIND)
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6553 {
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6554 /* one int */
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6555 fprintf(f, " count %ld", OPERAND_MIN(s));
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6556 s += 4;
d1376091d18b updated for version 7.3.1120
Bram Moolenaar <bram@vim.org>
parents: 4744
diff changeset
6557 }
4770
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6558 else if (op == RE_LNUM || op == RE_COL || op == RE_VCOL)
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6559 {
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6560 /* one int plus comperator */
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6561 fprintf(f, " count %ld", OPERAND_MIN(s));
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6562 s += 5;
b20dbf3a5370 updated for version 7.3.1132
Bram Moolenaar <bram@vim.org>
parents: 4762
diff changeset
6563 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6564 s += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6565 if (op == ANYOF || op == ANYOF + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6566 || op == ANYBUT || op == ANYBUT + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6567 || op == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6568 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6569 /* Literal string, where present. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6570 fprintf(f, "\nxxxxxxxxx\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6571 while (*s != NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6572 fprintf(f, "%c", *s++);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6573 fprintf(f, "\nxxxxxxxxx\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6574 s++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6575 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6576 fprintf(f, "\r\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6578
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6579 /* Header fields of interest. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6580 if (r->regstart != NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6581 fprintf(f, "start `%s' 0x%x; ", r->regstart < 256
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6582 ? (char *)transchar(r->regstart)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6583 : "multibyte", r->regstart);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6584 if (r->reganch)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6585 fprintf(f, "anchored; ");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6586 if (r->regmust != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6587 fprintf(f, "must have \"%s\"", r->regmust);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6588 fprintf(f, "\r\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6589
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6590 #ifdef BT_REGEXP_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6591 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6592 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6593 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6594 #endif /* BT_REGEXP_DUMP */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6595
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6596 #ifdef DEBUG
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6597 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6598 * regprop - printable representation of opcode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6599 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6600 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6601 regprop(op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6602 char_u *op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6603 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6604 char *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6605 static char buf[50];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6606
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6607 STRCPY(buf, ":");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6608
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6609 switch ((int) OP(op))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6610 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6611 case BOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 p = "BOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 case EOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6615 p = "EOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6616 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6617 case RE_BOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 p = "BOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620 case RE_EOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 p = "EOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6622 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 case CURSOR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6624 p = "CURSOR";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625 break;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6626 case RE_VISUAL:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6627 p = "RE_VISUAL";
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6628 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6629 case RE_LNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6630 p = "RE_LNUM";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6631 break;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6632 case RE_MARK:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6633 p = "RE_MARK";
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6634 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6635 case RE_COL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6636 p = "RE_COL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6637 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6638 case RE_VCOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639 p = "RE_VCOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 case BOW:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 p = "BOW";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 case EOW:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645 p = "EOW";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6647 case ANY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6648 p = "ANY";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6649 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6650 case ANY + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6651 p = "ANY+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6652 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6653 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6654 p = "ANYOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6655 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6656 case ANYOF + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6657 p = "ANYOF+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6658 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6659 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6660 p = "ANYBUT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6661 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6662 case ANYBUT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6663 p = "ANYBUT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6664 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6665 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6666 p = "IDENT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6667 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6668 case IDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6669 p = "IDENT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6670 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6671 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6672 p = "SIDENT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6673 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6674 case SIDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6675 p = "SIDENT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6676 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6677 case KWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6678 p = "KWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6679 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6680 case KWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6681 p = "KWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6682 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6683 case SKWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6684 p = "SKWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6685 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6686 case SKWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6687 p = "SKWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6688 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6689 case FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6690 p = "FNAME";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6691 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6692 case FNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6693 p = "FNAME+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6694 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6695 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6696 p = "SFNAME";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6697 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6698 case SFNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6699 p = "SFNAME+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6700 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6701 case PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6702 p = "PRINT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6703 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6704 case PRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6705 p = "PRINT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6706 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6707 case SPRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6708 p = "SPRINT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6709 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6710 case SPRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6711 p = "SPRINT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6712 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6713 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6714 p = "WHITE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6715 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6716 case WHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6717 p = "WHITE+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6718 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6719 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6720 p = "NWHITE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6721 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6722 case NWHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6723 p = "NWHITE+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6724 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6725 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6726 p = "DIGIT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6727 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6728 case DIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6729 p = "DIGIT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6730 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6731 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6732 p = "NDIGIT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6733 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6734 case NDIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6735 p = "NDIGIT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6736 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6737 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6738 p = "HEX";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6739 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6740 case HEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6741 p = "HEX+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6742 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6743 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6744 p = "NHEX";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6745 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6746 case NHEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6747 p = "NHEX+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6748 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6749 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6750 p = "OCTAL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6751 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6752 case OCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6753 p = "OCTAL+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6755 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6756 p = "NOCTAL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6757 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6758 case NOCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6759 p = "NOCTAL+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6760 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6761 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6762 p = "WORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6763 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6764 case WORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6765 p = "WORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6766 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6767 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6768 p = "NWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6769 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6770 case NWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6771 p = "NWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774 p = "HEAD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6775 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 case HEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 p = "HEAD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 p = "NHEAD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6782 case NHEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6783 p = "NHEAD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6784 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6785 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6786 p = "ALPHA";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6787 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 case ALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6789 p = "ALPHA+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6790 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6791 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 p = "NALPHA";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6794 case NALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795 p = "NALPHA+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6797 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6798 p = "LOWER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6799 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6800 case LOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6801 p = "LOWER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6802 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6803 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 p = "NLOWER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806 case NLOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807 p = "NLOWER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6808 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810 p = "UPPER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 case UPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 p = "UPPER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6815 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6816 p = "NUPPER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6817 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6818 case NUPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819 p = "NUPPER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6820 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6821 case BRANCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6822 p = "BRANCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 p = "EXACTLY";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6827 case NOTHING:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6828 p = "NOTHING";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6830 case BACK:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831 p = "BACK";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6832 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6833 case END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6834 p = "END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6835 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836 case MOPEN + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837 p = "MATCH START";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839 case MOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840 case MOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6841 case MOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6842 case MOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6843 case MOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6844 case MOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6845 case MOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 case MOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 case MOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 sprintf(buf + STRLEN(buf), "MOPEN%d", OP(op) - MOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6849 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6850 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6851 case MCLOSE + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6852 p = "MATCH END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6853 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6854 case MCLOSE + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6855 case MCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 case MCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6857 case MCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 case MCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6859 case MCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 case MCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861 case MCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6862 case MCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6863 sprintf(buf + STRLEN(buf), "MCLOSE%d", OP(op) - MCLOSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6864 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6865 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6866 case BACKREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6867 case BACKREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868 case BACKREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 case BACKREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 case BACKREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 case BACKREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 case BACKREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6873 case BACKREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6874 case BACKREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6875 sprintf(buf + STRLEN(buf), "BACKREF%d", OP(op) - BACKREF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6876 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6877 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6878 case NOPEN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6879 p = "NOPEN";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6880 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6881 case NCLOSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6882 p = "NCLOSE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6883 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6884 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6885 case ZOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6886 case ZOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6887 case ZOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 case ZOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889 case ZOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6890 case ZOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6891 case ZOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6892 case ZOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893 case ZOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 sprintf(buf + STRLEN(buf), "ZOPEN%d", OP(op) - ZOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6895 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6896 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6897 case ZCLOSE + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6898 case ZCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6899 case ZCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6900 case ZCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901 case ZCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6902 case ZCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6903 case ZCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6904 case ZCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6905 case ZCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6906 sprintf(buf + STRLEN(buf), "ZCLOSE%d", OP(op) - ZCLOSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6908 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6909 case ZREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6910 case ZREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6911 case ZREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6912 case ZREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6913 case ZREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6914 case ZREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6915 case ZREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6916 case ZREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6917 case ZREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6918 sprintf(buf + STRLEN(buf), "ZREF%d", OP(op) - ZREF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6919 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6920 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6921 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6922 case STAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923 p = "STAR";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925 case PLUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926 p = "PLUS";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 case NOMATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929 p = "NOMATCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931 case MATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6932 p = "MATCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 case BEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6935 p = "BEHIND";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6936 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6937 case NOBEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6938 p = "NOBEHIND";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6939 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6940 case SUBPAT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6941 p = "SUBPAT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6942 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6943 case BRACE_LIMITS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6944 p = "BRACE_LIMITS";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6945 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6946 case BRACE_SIMPLE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 p = "BRACE_SIMPLE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6948 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6949 case BRACE_COMPLEX + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6950 case BRACE_COMPLEX + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6951 case BRACE_COMPLEX + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6952 case BRACE_COMPLEX + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6953 case BRACE_COMPLEX + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6954 case BRACE_COMPLEX + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6955 case BRACE_COMPLEX + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6956 case BRACE_COMPLEX + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6957 case BRACE_COMPLEX + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6958 case BRACE_COMPLEX + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6961 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 p = "MULTIBYTECODE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6965 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6967 case NEWL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6968 p = "NEWL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6969 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6970 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6971 sprintf(buf + STRLEN(buf), "corrupt %d", OP(op));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6972 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6973 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6974 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6975 if (p != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6976 STRCAT(buf, p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6977 return (char_u *)buf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6979 #endif /* DEBUG */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6980
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6981 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6982 static void mb_decompose __ARGS((int c, int *c1, int *c2, int *c3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6984 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6985 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6986 int a, b, c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6987 } decomp_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990 /* 0xfb20 - 0xfb4f */
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 270
diff changeset
6991 static decomp_T decomp_table[0xfb4f-0xfb20+1] =
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993 {0x5e2,0,0}, /* 0xfb20 alt ayin */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6994 {0x5d0,0,0}, /* 0xfb21 alt alef */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6995 {0x5d3,0,0}, /* 0xfb22 alt dalet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6996 {0x5d4,0,0}, /* 0xfb23 alt he */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6997 {0x5db,0,0}, /* 0xfb24 alt kaf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6998 {0x5dc,0,0}, /* 0xfb25 alt lamed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6999 {0x5dd,0,0}, /* 0xfb26 alt mem-sofit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7000 {0x5e8,0,0}, /* 0xfb27 alt resh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7001 {0x5ea,0,0}, /* 0xfb28 alt tav */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7002 {'+', 0, 0}, /* 0xfb29 alt plus */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7003 {0x5e9, 0x5c1, 0}, /* 0xfb2a shin+shin-dot */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7004 {0x5e9, 0x5c2, 0}, /* 0xfb2b shin+sin-dot */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7005 {0x5e9, 0x5c1, 0x5bc}, /* 0xfb2c shin+shin-dot+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 {0x5e9, 0x5c2, 0x5bc}, /* 0xfb2d shin+sin-dot+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7007 {0x5d0, 0x5b7, 0}, /* 0xfb2e alef+patah */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7008 {0x5d0, 0x5b8, 0}, /* 0xfb2f alef+qamats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7009 {0x5d0, 0x5b4, 0}, /* 0xfb30 alef+hiriq */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7010 {0x5d1, 0x5bc, 0}, /* 0xfb31 bet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7011 {0x5d2, 0x5bc, 0}, /* 0xfb32 gimel+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7012 {0x5d3, 0x5bc, 0}, /* 0xfb33 dalet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7013 {0x5d4, 0x5bc, 0}, /* 0xfb34 he+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 {0x5d5, 0x5bc, 0}, /* 0xfb35 vav+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015 {0x5d6, 0x5bc, 0}, /* 0xfb36 zayin+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016 {0xfb37, 0, 0}, /* 0xfb37 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017 {0x5d8, 0x5bc, 0}, /* 0xfb38 tet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 {0x5d9, 0x5bc, 0}, /* 0xfb39 yud+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7019 {0x5da, 0x5bc, 0}, /* 0xfb3a kaf sofit+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 {0x5db, 0x5bc, 0}, /* 0xfb3b kaf+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 {0x5dc, 0x5bc, 0}, /* 0xfb3c lamed+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022 {0xfb3d, 0, 0}, /* 0xfb3d -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 {0x5de, 0x5bc, 0}, /* 0xfb3e mem+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 {0xfb3f, 0, 0}, /* 0xfb3f -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7025 {0x5e0, 0x5bc, 0}, /* 0xfb40 nun+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026 {0x5e1, 0x5bc, 0}, /* 0xfb41 samech+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7027 {0xfb42, 0, 0}, /* 0xfb42 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028 {0x5e3, 0x5bc, 0}, /* 0xfb43 pe sofit+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029 {0x5e4, 0x5bc,0}, /* 0xfb44 pe+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030 {0xfb45, 0, 0}, /* 0xfb45 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 {0x5e6, 0x5bc, 0}, /* 0xfb46 tsadi+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 {0x5e7, 0x5bc, 0}, /* 0xfb47 qof+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033 {0x5e8, 0x5bc, 0}, /* 0xfb48 resh+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7034 {0x5e9, 0x5bc, 0}, /* 0xfb49 shin+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 {0x5ea, 0x5bc, 0}, /* 0xfb4a tav+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 {0x5d5, 0x5b9, 0}, /* 0xfb4b vav+holam */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037 {0x5d1, 0x5bf, 0}, /* 0xfb4c bet+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 {0x5db, 0x5bf, 0}, /* 0xfb4d kaf+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7039 {0x5e4, 0x5bf, 0}, /* 0xfb4e pe+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7040 {0x5d0, 0x5dc, 0} /* 0xfb4f alef-lamed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7041 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7043 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7044 mb_decompose(c, c1, c2, c3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7045 int c, *c1, *c2, *c3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7046 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7047 decomp_T d;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7048
4505
d037b9cbdaaa updated for version 7.3.1000
Bram Moolenaar <bram@vim.org>
parents: 4466
diff changeset
7049 if (c >= 0xfb20 && c <= 0xfb4f)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7050 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7051 d = decomp_table[c - 0xfb20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7052 *c1 = d.a;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7053 *c2 = d.b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7054 *c3 = d.c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7055 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7058 *c1 = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 *c2 = *c3 = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7061 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7062 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7063
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7064 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7065 * Compare two strings, ignore case if ireg_ic set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7066 * Return 0 if strings match, non-zero otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7067 * Correct the length "*n" when composing characters are ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7068 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7069 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7070 cstrncmp(s1, s2, n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7071 char_u *s1, *s2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7072 int *n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7074 int result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7076 if (!ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7077 result = STRNCMP(s1, s2, *n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7078 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7079 result = MB_STRNICMP(s1, s2, *n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7081 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7082 /* if it failed and it's utf8 and we want to combineignore: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7083 if (result != 0 && enc_utf8 && ireg_icombine)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7084 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7085 char_u *str1, *str2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7086 int c1, c2, c11, c12;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7087 int junk;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7088
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7089 /* we have to handle the strcmp ourselves, since it is necessary to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7090 * deal with the composing characters by ignoring them: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7091 str1 = s1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7092 str2 = s2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7093 c1 = c2 = 0;
507
a1059cda45f2 updated for version 7.0142
vimboss
parents: 492
diff changeset
7094 while ((int)(str1 - s1) < *n)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7096 c1 = mb_ptr2char_adv(&str1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7097 c2 = mb_ptr2char_adv(&str2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7099 /* decompose the character if necessary, into 'base' characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7100 * because I don't care about Arabic, I will hard-code the Hebrew
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7101 * which I *do* care about! So sue me... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7102 if (c1 != c2 && (!ireg_ic || utf_fold(c1) != utf_fold(c2)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7103 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7104 /* decomposition necessary? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7105 mb_decompose(c1, &c11, &junk, &junk);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7106 mb_decompose(c2, &c12, &junk, &junk);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7107 c1 = c11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7108 c2 = c12;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7109 if (c11 != c12 && (!ireg_ic || utf_fold(c11) != utf_fold(c12)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7110 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7111 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7112 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7113 result = c2 - c1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7114 if (result == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7115 *n = (int)(str2 - s2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7117 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7118
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7119 return result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7120 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7122 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7123 * cstrchr: This function is used a lot for simple searches, keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7124 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7125 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7126 cstrchr(s, c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7127 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7128 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7130 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7131 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7133 if (!ireg_ic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7134 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7135 || (!enc_utf8 && mb_char2len(c) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7136 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7137 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7138 return vim_strchr(s, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7139
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7140 /* tolower() and toupper() can be slow, comparing twice should be a lot
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7141 * faster (esp. when using MS Visual C++!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7142 * For UTF-8 need to use folded case. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7143 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7144 if (enc_utf8 && c > 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7145 cc = utf_fold(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7146 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7147 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7148 if (MB_ISUPPER(c))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7149 cc = MB_TOLOWER(c);
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7150 else if (MB_ISLOWER(c))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7151 cc = MB_TOUPPER(c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7152 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7153 return vim_strchr(s, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7154
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7155 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7156 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7157 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
7158 for (p = s; *p != NUL; p += (*mb_ptr2len)(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7159 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7160 if (enc_utf8 && c > 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7162 if (utf_fold(utf_ptr2char(p)) == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7163 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7165 else if (*p == c || *p == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7166 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7169 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7170 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7171 /* Faster version for when there are no multi-byte characters. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7172 for (p = s; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7173 if (*p == c || *p == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7174 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7175
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7176 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7177 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7179 /***************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7180 * regsub stuff *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7181 ***************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7183 /* This stuff below really confuses cc on an SGI -- webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7184 #ifdef __sgi
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7185 # undef __ARGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7186 # define __ARGS(x) ()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7187 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7189 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7190 * We should define ftpr as a pointer to a function returning a pointer to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7191 * a function returning a pointer to a function ...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7192 * This is impossible, so we declare a pointer to a function returning a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7193 * pointer to a function returning void. This should work for all compilers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7194 */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7195 typedef void (*(*fptr_T) __ARGS((int *, int)))();
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7196
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7197 static fptr_T do_upper __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7198 static fptr_T do_Upper __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7199 static fptr_T do_lower __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7200 static fptr_T do_Lower __ARGS((int *, int));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7201
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7202 static int vim_regsub_both __ARGS((char_u *source, char_u *dest, int copy, int magic, int backslash));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7203
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7204 static fptr_T
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7205 do_upper(d, c)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7206 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7207 int c;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7208 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7209 *d = MB_TOUPPER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7210
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7211 return (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7212 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7213
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7214 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7215 do_Upper(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7216 int *d;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7217 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7218 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7219 *d = MB_TOUPPER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7220
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7221 return (fptr_T)do_Upper;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7222 }
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7223
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7224 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7225 do_lower(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7226 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7227 int c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7228 {
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7229 *d = MB_TOLOWER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7230
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7231 return (fptr_T)NULL;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7232 }
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7233
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7234 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7235 do_Lower(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7236 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7237 int c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7238 {
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7239 *d = MB_TOLOWER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7240
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7241 return (fptr_T)do_Lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7243
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7244 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7245 * regtilde(): Replace tildes in the pattern by the old pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7246 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7247 * Short explanation of the tilde: It stands for the previous replacement
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7248 * pattern. If that previous pattern also contains a ~ we should go back a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7249 * step further... But we insert the previous pattern into the current one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7250 * and remember that.
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7251 * This still does not handle the case where "magic" changes. So require the
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7252 * user to keep his hands off of "magic".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7253 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7254 * The tildes are parsed once before the first call to vim_regsub().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7255 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7256 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7257 regtilde(source, magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7258 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7259 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7260 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7261 char_u *newsub = source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7262 char_u *tmpsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7263 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7264 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7265 int prevlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7266
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7267 for (p = newsub; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7268 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7269 if ((*p == '~' && magic) || (*p == '\\' && *(p + 1) == '~' && !magic))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7271 if (reg_prev_sub != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7272 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7273 /* length = len(newsub) - 1 + len(prev_sub) + 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7274 prevlen = (int)STRLEN(reg_prev_sub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7275 tmpsub = alloc((unsigned)(STRLEN(newsub) + prevlen));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7276 if (tmpsub != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7278 /* copy prefix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7279 len = (int)(p - newsub); /* not including ~ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7280 mch_memmove(tmpsub, newsub, (size_t)len);
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7281 /* interpret tilde */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7282 mch_memmove(tmpsub + len, reg_prev_sub, (size_t)prevlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7283 /* copy postfix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7284 if (!magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7285 ++p; /* back off \ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7286 STRCPY(tmpsub + len + prevlen, p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7287
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7288 if (newsub != source) /* already allocated newsub */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7289 vim_free(newsub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7290 newsub = tmpsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7291 p = newsub + len + prevlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7292 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7293 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7294 else if (magic)
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
7295 STRMOVE(p, p + 1); /* remove '~' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296 else
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
7297 STRMOVE(p, p + 2); /* remove '\~' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7298 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7300 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7301 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7302 if (*p == '\\' && p[1]) /* skip escaped characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7305 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
7306 p += (*mb_ptr2len)(p) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7307 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7308 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 vim_free(reg_prev_sub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 if (newsub != source) /* newsub was allocated, just keep it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7313 reg_prev_sub = newsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7314 else /* no ~ found, need to save newsub */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7315 reg_prev_sub = vim_strsave(newsub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7316 return newsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7317 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7318
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7319 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7320 static int can_f_submatch = FALSE; /* TRUE when submatch() can be used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7322 /* These pointers are used instead of reg_match and reg_mmatch for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7323 * reg_submatch(). Needed for when the substitution string is an expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7324 * that contains a call to substitute() and submatch(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7325 static regmatch_T *submatch_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7326 static regmmatch_T *submatch_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7327 static linenr_T submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7328 static linenr_T submatch_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7329 static int submatch_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7330 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7332 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7333 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7334 * vim_regsub() - perform substitutions after a vim_regexec() or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7335 * vim_regexec_multi() match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7336 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7337 * If "copy" is TRUE really copy into "dest".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7338 * If "copy" is FALSE nothing is copied, this is just to find out the length
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7339 * of the result.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7340 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7341 * If "backslash" is TRUE, a backslash will be removed later, need to double
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7342 * them to keep them, and insert a backslash before a CR to avoid it being
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7343 * replaced with a line break later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7344 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7345 * Note: The matched text must not change between the call of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7346 * vim_regexec()/vim_regexec_multi() and vim_regsub()! It would make the back
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7347 * references invalid!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7348 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7349 * Returns the size of the replacement, including terminating NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7350 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7351 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7352 vim_regsub(rmp, source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7353 regmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7354 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7355 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7356 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7357 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7358 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7360 reg_match = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7361 reg_mmatch = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7362 reg_maxline = 0;
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
7363 reg_buf = curbuf;
5836
43c6cd07c8de updated for version 7.4.261
Bram Moolenaar <bram@vim.org>
parents: 5820
diff changeset
7364 reg_line_lbr = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7365 return vim_regsub_both(source, dest, copy, magic, backslash);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7366 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7369 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7370 vim_regsub_multi(rmp, lnum, source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7371 regmmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7374 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7377 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7379 reg_match = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7380 reg_mmatch = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7381 reg_buf = curbuf; /* always works on the current buffer! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7382 reg_firstlnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7383 reg_maxline = curbuf->b_ml.ml_line_count - lnum;
5836
43c6cd07c8de updated for version 7.4.261
Bram Moolenaar <bram@vim.org>
parents: 5820
diff changeset
7384 reg_line_lbr = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7385 return vim_regsub_both(source, dest, copy, magic, backslash);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7386 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7388 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7389 vim_regsub_both(source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7390 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7391 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7392 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7393 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7394 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7395 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7396 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7397 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7398 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7399 int c;
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7400 int cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7401 int no = -1;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7402 fptr_T func_all = (fptr_T)NULL;
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7403 fptr_T func_one = (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7404 linenr_T clnum = 0; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7405 int len = 0; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7406 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7407 static char_u *eval_result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7408 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7409
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7410 /* Be paranoid... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7411 if (source == NULL || dest == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7412 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7413 EMSG(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7414 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7416 if (prog_magic_wrong())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7417 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7418 src = source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7419 dst = dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7420
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7422 * When the substitute part starts with "\=" evaluate it as an expression.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424 if (source[0] == '\\' && source[1] == '='
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 && !can_f_submatch /* can't do this recursively */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431 /* To make sure that the length doesn't change between checking the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7432 * length and copying the string, and to speed up things, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 * resulting string is saved from the call with "copy" == FALSE to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434 * call with "copy" == TRUE. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 if (eval_result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 STRCPY(dest, eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 dst += STRLEN(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7441 vim_free(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7442 eval_result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7443 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7444 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7445 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7447 win_T *save_reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7448 int save_ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7449
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7450 vim_free(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7451
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7452 /* The expression may contain substitute(), which calls us
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7453 * recursively. Make sure submatch() gets the text from the first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7454 * level. Don't need to save "reg_buf", because
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7455 * vim_regexec_multi() can't be called recursively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7456 submatch_match = reg_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7457 submatch_mmatch = reg_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7458 submatch_firstlnum = reg_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7459 submatch_maxline = reg_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7460 submatch_line_lbr = reg_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7461 save_reg_win = reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7462 save_ireg_ic = ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7463 can_f_submatch = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7464
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
7465 eval_result = eval_to_string(source + 2, NULL, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7466 if (eval_result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7467 {
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7468 int had_backslash = FALSE;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7469
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
7470 for (s = eval_result; *s != NUL; mb_ptr_adv(s))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7471 {
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7472 /* Change NL to CR, so that it becomes a line break,
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7473 * unless called from vim_regexec_nl().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7474 * Skip over a backslashed character. */
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7475 if (*s == NL && !submatch_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7476 *s = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7477 else if (*s == '\\' && s[1] != NUL)
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7478 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 ++s;
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7480 /* Change NL to CR here too, so that this works:
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7481 * :s/abc\\\ndef/\="aaa\\\nbbb"/ on text:
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7482 * abc\
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7483 * def
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7484 * Not when called from vim_regexec_nl().
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7485 */
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7486 if (*s == NL && !submatch_line_lbr)
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7487 *s = CAR;
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7488 had_backslash = TRUE;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7489 }
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7490 }
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7491 if (had_backslash && backslash)
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7492 {
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7493 /* Backslashes will be consumed, need to double them. */
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7494 s = vim_strsave_escaped(eval_result, (char_u *)"\\");
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7495 if (s != NULL)
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7496 {
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7497 vim_free(eval_result);
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7498 eval_result = s;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7499 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7502 dst += STRLEN(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7503 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505 reg_match = submatch_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506 reg_mmatch = submatch_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7507 reg_firstlnum = submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7508 reg_maxline = submatch_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7509 reg_line_lbr = submatch_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 reg_win = save_reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7511 ireg_ic = save_ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7512 can_f_submatch = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7514 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7517 while ((c = *src++) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7518 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7519 if (c == '&' && magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 no = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 else if (c == '\\' && *src != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 if (*src == '&' && !magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7525 ++src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 no = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 else if ('0' <= *src && *src <= '9')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 no = *src++ - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 else if (vim_strchr((char_u *)"uUlLeE", *src))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 switch (*src++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 {
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7536 case 'u': func_one = (fptr_T)do_upper;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7538 case 'U': func_all = (fptr_T)do_Upper;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7540 case 'l': func_one = (fptr_T)do_lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7542 case 'L': func_all = (fptr_T)do_Lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 case 'e':
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7545 case 'E': func_one = func_all = (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 if (no < 0) /* Ordinary character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 {
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7552 if (c == K_SPECIAL && src[0] != NUL && src[1] != NUL)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7553 {
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7554 /* Copy a special key as-is. */
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7555 if (copy)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7556 {
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7557 *dst++ = c;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7558 *dst++ = *src++;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7559 *dst++ = *src++;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7560 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7561 else
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7562 {
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7563 dst += 3;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7564 src += 2;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7565 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7566 continue;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7567 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7568
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7569 if (c == '\\' && *src != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7570 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7571 /* Check for abbreviations -- webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7572 switch (*src)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7573 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7574 case 'r': c = CAR; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7575 case 'n': c = NL; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 case 't': c = TAB; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7577 /* Oh no! \e already has meaning in subst pat :-( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7578 /* case 'e': c = ESC; ++src; break; */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7579 case 'b': c = Ctrl_H; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7580
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7581 /* If "backslash" is TRUE the backslash will be removed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7582 * later. Used to insert a literal CR. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7583 default: if (backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7585 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7586 *dst = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7587 ++dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7588 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7589 c = *src++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7590 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 }
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7592 #ifdef FEAT_MBYTE
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7593 else if (has_mbyte)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7594 c = mb_ptr2char(src - 1);
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7595 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7596
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597 /* Write to buffer, if copy is set. */
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7598 if (func_one != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7599 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7600 func_one = (fptr_T)(func_one(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7601 else if (func_all != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7602 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7603 func_all = (fptr_T)(func_all(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7604 else /* just copy */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7605 cc = c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7606
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7607 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7608 if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609 {
2307
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7610 int totlen = mb_ptr2len(src - 1);
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7611
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 if (copy)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7613 mb_char2bytes(cc, dst);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7614 dst += mb_char2len(cc) - 1;
2307
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7615 if (enc_utf8)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7616 {
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7617 int clen = utf_ptr2len(src - 1);
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7618
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7619 /* If the character length is shorter than "totlen", there
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7620 * are composing characters; copy them as-is. */
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7621 if (clen < totlen)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7622 {
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7623 if (copy)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7624 mch_memmove(dst + 1, src - 1 + clen,
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7625 (size_t)(totlen - clen));
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7626 dst += totlen - clen;
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7627 }
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7628 }
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7629 src += totlen - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7631 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7632 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7633 if (copy)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7634 *dst = cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7635 dst++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7636 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7637 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7638 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7639 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7640 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7641 clnum = reg_mmatch->startpos[no].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7642 if (clnum < 0 || reg_mmatch->endpos[no].lnum < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7643 s = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7644 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7646 s = reg_getline(clnum) + reg_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7647 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7648 len = reg_mmatch->endpos[no].col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7649 - reg_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7650 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7651 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7652 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7654 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7655 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7656 s = reg_match->startp[no];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7657 if (reg_match->endp[no] == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7658 s = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7659 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7660 len = (int)(reg_match->endp[no] - s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7661 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7662 if (s != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7664 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7665 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7666 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7667 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7668 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7669 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7670 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7671 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7672 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7673 *dst = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7674 ++dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7675 s = reg_getline(++clnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7676 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7677 len = reg_mmatch->endpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7678 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7679 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7680 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7681 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7682 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7683 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7684 else if (*s == NUL) /* we hit NUL. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7685 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7686 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7687 EMSG(_(e_re_damg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7688 goto exit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7689 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7690 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7691 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7692 if (backslash && (*s == CAR || *s == '\\'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7693 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7694 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7695 * Insert a backslash in front of a CR, otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7696 * it will be replaced by a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7697 * Number of backslashes will be halved later,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7698 * double them here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7699 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7700 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7701 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7702 dst[0] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7703 dst[1] = *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7705 dst += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7706 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7707 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7708 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7709 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7710 if (has_mbyte)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7711 c = mb_ptr2char(s);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7712 else
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7713 #endif
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7714 c = *s;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7715
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7716 if (func_one != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7717 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7718 func_one = (fptr_T)(func_one(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7719 else if (func_all != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7720 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7721 func_all = (fptr_T)(func_all(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7722 else /* just copy */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7723 cc = c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7724
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7725 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7726 if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7727 {
1332
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7728 int l;
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7729
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7730 /* Copy composing characters separately, one
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7731 * at a time. */
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7732 if (enc_utf8)
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7733 l = utf_ptr2len(s) - 1;
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7734 else
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7735 l = mb_ptr2len(s) - 1;
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7736
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7737 s += l;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7738 len -= l;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7739 if (copy)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7740 mb_char2bytes(cc, dst);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7741 dst += mb_char2len(cc) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7742 }
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7743 else
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7744 #endif
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7745 if (copy)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7746 *dst = cc;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7747 dst++;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7748 }
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7749
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7750 ++s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7751 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7752 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7754 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7755 no = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7756 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7757 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7758 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7759 *dst = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7761 exit:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7762 return (int)((dst - dest) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7763 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7765 #ifdef FEAT_EVAL
2012
b99303b1483f updated for version 7.2-309
vimboss
parents: 2011
diff changeset
7766 static char_u *reg_getline_submatch __ARGS((linenr_T lnum));
b99303b1483f updated for version 7.2-309
vimboss
parents: 2011
diff changeset
7767
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7768 /*
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7769 * Call reg_getline() with the line numbers from the submatch. If a
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7770 * substitute() was used the reg_maxline and other values have been
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7771 * overwritten.
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7772 */
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7773 static char_u *
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7774 reg_getline_submatch(lnum)
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7775 linenr_T lnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7776 {
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7777 char_u *s;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7778 linenr_T save_first = reg_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7779 linenr_T save_max = reg_maxline;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7780
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7781 reg_firstlnum = submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7782 reg_maxline = submatch_maxline;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7783
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7784 s = reg_getline(lnum);
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7785
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7786 reg_firstlnum = save_first;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7787 reg_maxline = save_max;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7788 return s;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7789 }
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7790
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7791 /*
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7792 * Used for the submatch() function: get the string from the n'th submatch in
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7793 * allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7794 * Returns NULL when not in a ":s" command and for a non-existing submatch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7795 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7796 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7797 reg_submatch(no)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7798 int no;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7799 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7800 char_u *retval = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7801 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7802 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7803 int round;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7804 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7805
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7806 if (!can_f_submatch || no < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7807 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7808
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7809 if (submatch_match == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7811 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7812 * First round: compute the length and allocate memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7813 * Second round: copy the text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7814 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7815 for (round = 1; round <= 2; ++round)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7816 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7817 lnum = submatch_mmatch->startpos[no].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7818 if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7819 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7820
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7821 s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7822 if (s == NULL) /* anti-crash check, cannot happen? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7823 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7824 if (submatch_mmatch->endpos[no].lnum == lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7825 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7826 /* Within one line: take form start to end col. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7827 len = submatch_mmatch->endpos[no].col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7828 - submatch_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7829 if (round == 2)
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 410
diff changeset
7830 vim_strncpy(retval, s, len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7831 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7832 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7833 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7834 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7835 /* Multiple lines: take start line from start col, middle
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7836 * lines completely and end line up to end col. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7837 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7838 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7839 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7840 STRCPY(retval, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7841 retval[len] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7842 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7843 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7844 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7845 while (lnum < submatch_mmatch->endpos[no].lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7846 {
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7847 s = reg_getline_submatch(lnum++);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7848 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7849 STRCPY(retval + len, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7850 len += (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7851 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7852 retval[len] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7853 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7855 if (round == 2)
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7856 STRNCPY(retval + len, reg_getline_submatch(lnum),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7857 submatch_mmatch->endpos[no].col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7858 len += submatch_mmatch->endpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7859 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7860 retval[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7861 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7863
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7864 if (retval == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7865 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7866 retval = lalloc((long_u)len, TRUE);
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7867 if (retval == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7868 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7870 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7871 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7872 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7873 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
7874 s = submatch_match->startp[no];
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
7875 if (s == NULL || submatch_match->endp[no] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7876 retval = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7877 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7878 retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7881 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7882 }
5794
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7883
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7884 /*
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7885 * Used for the submatch() function with the optional non-zero argument: get
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7886 * the list of strings from the n'th submatch in allocated memory with NULs
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7887 * represented in NLs.
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7888 * Returns a list of allocated strings. Returns NULL when not in a ":s"
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7889 * command, for a non-existing submatch and for any error.
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7890 */
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7891 list_T *
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7892 reg_submatch_list(no)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7893 int no;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7894 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7895 char_u *s;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7896 linenr_T slnum;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7897 linenr_T elnum;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7898 colnr_T scol;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7899 colnr_T ecol;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7900 int i;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7901 list_T *list;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7902 int error = FALSE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7903
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7904 if (!can_f_submatch || no < 0)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7905 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7906
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7907 if (submatch_match == NULL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7908 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7909 slnum = submatch_mmatch->startpos[no].lnum;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7910 elnum = submatch_mmatch->endpos[no].lnum;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7911 if (slnum < 0 || elnum < 0)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7912 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7913
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7914 scol = submatch_mmatch->startpos[no].col;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7915 ecol = submatch_mmatch->endpos[no].col;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7916
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7917 list = list_alloc();
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7918 if (list == NULL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7919 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7920
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7921 s = reg_getline_submatch(slnum) + scol;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7922 if (slnum == elnum)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7923 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7924 if (list_append_string(list, s, ecol - scol) == FAIL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7925 error = TRUE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7926 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7927 else
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7928 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7929 if (list_append_string(list, s, -1) == FAIL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7930 error = TRUE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7931 for (i = 1; i < elnum - slnum; i++)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7932 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7933 s = reg_getline_submatch(slnum + i);
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7934 if (list_append_string(list, s, -1) == FAIL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7935 error = TRUE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7936 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7937 s = reg_getline_submatch(elnum);
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7938 if (list_append_string(list, s, ecol) == FAIL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7939 error = TRUE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7940 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7941 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7942 else
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7943 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7944 s = submatch_match->startp[no];
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7945 if (s == NULL || submatch_match->endp[no] == NULL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7946 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7947 list = list_alloc();
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7948 if (list == NULL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7949 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7950 if (list_append_string(list, s,
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7951 (int)(submatch_match->endp[no] - s)) == FAIL)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7952 error = TRUE;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7953 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7954
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7955 if (error)
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7956 {
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7957 list_free(list, TRUE);
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7958 return NULL;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7959 }
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7960 return list;
a63d0cd691dc updated for version 7.4.241
Bram Moolenaar <bram@vim.org>
parents: 5735
diff changeset
7961 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7962 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7963
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7964 static regengine_T bt_regengine =
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7965 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7966 bt_regcomp,
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
7967 bt_regfree,
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7968 bt_regexec_nl,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7969 bt_regexec_multi
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7970 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7971 ,(char_u *)""
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7972 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7973 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7974
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7975
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7976 #include "regexp_nfa.c"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7977
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7978 static regengine_T nfa_regengine =
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7979 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7980 nfa_regcomp,
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
7981 nfa_regfree,
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7982 nfa_regexec_nl,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7983 nfa_regexec_multi
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7984 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7985 ,(char_u *)""
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7986 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7987 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7988
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7989 /* Which regexp engine to use? Needed for vim_regcomp().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7990 * Must match with 'regexpengine'. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7991 static int regexp_engine = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7992 #define AUTOMATIC_ENGINE 0
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7993 #define BACKTRACKING_ENGINE 1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7994 #define NFA_ENGINE 2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7995 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7996 static char_u regname[][30] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7997 "AUTOMATIC Regexp Engine",
4579
7a2be4a39423 updated for version 7.3.1037
Bram Moolenaar <bram@vim.org>
parents: 4505
diff changeset
7998 "BACKTRACKING Regexp Engine",
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7999 "NFA Regexp Engine"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8000 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8001 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8002
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8003 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8004 * Compile a regular expression into internal code.
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8005 * Returns the program in allocated memory.
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8006 * Use vim_regfree() to free the memory.
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8007 * Returns NULL for an error.
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8008 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8009 regprog_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8010 vim_regcomp(expr_arg, re_flags)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8011 char_u *expr_arg;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8012 int re_flags;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8013 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8014 regprog_T *prog = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8015 char_u *expr = expr_arg;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8016
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8017 regexp_engine = p_re;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8018
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8019 /* Check for prefix "\%#=", that sets the regexp engine */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8020 if (STRNCMP(expr, "\\%#=", 4) == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8021 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8022 int newengine = expr[4] - '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8023
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8024 if (newengine == AUTOMATIC_ENGINE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8025 || newengine == BACKTRACKING_ENGINE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8026 || newengine == NFA_ENGINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8027 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8028 regexp_engine = expr[4] - '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8029 expr += 5;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8030 #ifdef DEBUG
5897
b5972833add9 updated for version 7.4.291
Bram Moolenaar <bram@vim.org>
parents: 5838
diff changeset
8031 smsg((char_u *)"New regexp mode selected (%d): %s",
b5972833add9 updated for version 7.4.291
Bram Moolenaar <bram@vim.org>
parents: 5838
diff changeset
8032 regexp_engine, regname[newengine]);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8033 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8034 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8035 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8036 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8037 EMSG(_("E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be used "));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8038 regexp_engine = AUTOMATIC_ENGINE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8039 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8040 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8041 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8042 bt_regengine.expr = expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8043 nfa_regengine.expr = expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8044 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8045
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8046 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8047 * First try the NFA engine, unless backtracking was requested.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8048 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8049 if (regexp_engine != BACKTRACKING_ENGINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8050 prog = nfa_regengine.regcomp(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8051 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8052 prog = bt_regengine.regcomp(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8053
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8054 if (prog == NULL) /* error compiling regexp with initial engine */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8055 {
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
8056 #ifdef BT_REGEXP_DEBUG_LOG
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8057 if (regexp_engine != BACKTRACKING_ENGINE) /* debugging log for NFA */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8058 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8059 FILE *f;
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
8060 f = fopen(BT_REGEXP_DEBUG_LOG_NAME, "a");
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8061 if (f)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8062 {
4762
47906f888725 updated for version 7.3.1128
Bram Moolenaar <bram@vim.org>
parents: 4760
diff changeset
8063 fprintf(f, "Syntax error in \"%s\"\n", expr);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8064 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8065 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8066 else
4460
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
8067 EMSG2("(NFA) Could not open \"%s\" to write !!!",
fe8a0a6a1c2a updated for version 7.3.978
Bram Moolenaar <bram@vim.org>
parents: 4444
diff changeset
8068 BT_REGEXP_DEBUG_LOG_NAME);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8069 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8070 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8071 /*
5353
2d3fbc68b3a8 updated for version 7.4.029
Bram Moolenaar <bram@vim.org>
parents: 5310
diff changeset
8072 * If the NFA engine failed, the backtracking engine won't work either.
2d3fbc68b3a8 updated for version 7.4.029
Bram Moolenaar <bram@vim.org>
parents: 5310
diff changeset
8073 *
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8074 if (regexp_engine == AUTOMATIC_ENGINE)
4762
47906f888725 updated for version 7.3.1128
Bram Moolenaar <bram@vim.org>
parents: 4760
diff changeset
8075 prog = bt_regengine.regcomp(expr, re_flags);
5353
2d3fbc68b3a8 updated for version 7.4.029
Bram Moolenaar <bram@vim.org>
parents: 5310
diff changeset
8076 */
4762
47906f888725 updated for version 7.3.1128
Bram Moolenaar <bram@vim.org>
parents: 4760
diff changeset
8077 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8078
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8079 return prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8080 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8081
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8082 /*
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8083 * Free a compiled regexp program, returned by vim_regcomp().
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8084 */
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8085 void
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8086 vim_regfree(prog)
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8087 regprog_T *prog;
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8088 {
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8089 if (prog != NULL)
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8090 prog->engine->regfree(prog);
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8091 }
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8092
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4770
diff changeset
8093 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8094 * Match a regexp against a string.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8095 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8096 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8097 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8098 * Return TRUE if there is a match, FALSE if not.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8099 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8100 int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8101 vim_regexec(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8102 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8103 char_u *line; /* string to match against */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8104 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8105 {
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
8106 return rmp->regprog->engine->regexec_nl(rmp, line, col, FALSE);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8107 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8108
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8109 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8110 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8111 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8112 * Like vim_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: 4244
diff changeset
8113 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8114 int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8115 vim_regexec_nl(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8116 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8117 char_u *line;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8118 colnr_T col;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8119 {
5838
0ea551fa607d updated for version 7.4.262
Bram Moolenaar <bram@vim.org>
parents: 5836
diff changeset
8120 return rmp->regprog->engine->regexec_nl(rmp, line, col, TRUE);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8121 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8122 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8123
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8124 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8125 * Match a regexp against multiple lines.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8126 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8127 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8128 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8129 * 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: 4244
diff changeset
8130 * match otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8131 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8132 long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8133 vim_regexec_multi(rmp, win, buf, lnum, col, tm)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8134 regmmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8135 win_T *win; /* window in which to search or NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8136 buf_T *buf; /* buffer in which to search */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8137 linenr_T lnum; /* nr of line to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8138 colnr_T col; /* column to start looking for match */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8139 proftime_T *tm; /* timeout limit or NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8140 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8141 return rmp->regprog->engine->regexec_multi(rmp, win, buf, lnum, col, tm);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
8142 }