annotate src/regexp.c @ 4444:ccecb03e5e8b v7.3.970

updated for version 7.3.970 Problem: Syntax highlighting can be slow. Solution: Include the NFA regexp engine. Add the 'regexpengine' option to select which one is used. (various authors, including Ken Takata, Andrei Aiordachioaie, Russ Cox, Xiaozhou Liua, Ian Young)
author Bram Moolenaar <bram@vim.org>
date Sun, 19 May 2013 19:40:29 +0200
parents 7faeece39228
children fe8a0a6a1c2a
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
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
54 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 * The "internal use only" fields in regexp.h are present to pass info from
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 * compile to execute that permits the execute phase to run lots faster on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 * simple cases. They are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 * regstart char that must begin a match; NUL if none obvious; Can be a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 * multi-byte character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * reganch is the match anchored (at beginning-of-line only)?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 * regmust string (pointer into program) that match must include, or NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 * regmlen length of regmust string
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 * regflags RF_ values or'ed together
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 * Regstart and reganch permit very fast decisions on suitable starting points
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 * for a match, cutting down the work a lot. Regmust permits fast rejection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 * of lines that cannot possibly match. The regmust tests are costly enough
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 * that vim_regcomp() supplies a regmust only if the r.e. contains something
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 * potentially expensive (at present, the only such thing detected is * or +
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 * 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
74 * supplied because the test in vim_regexec() needs it and vim_regcomp() is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 * computing it anyway.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 * Structure for regexp "program". This is essentially a linear encoding
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 * of a nondeterministic finite-state machine (aka syntax charts or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 * "railroad normal form" in parsing technology). Each node is an opcode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 * plus a "next" pointer, possibly plus an operand. "Next" pointers of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 * pointer with a BRANCH on both ends of it is connecting two alternatives.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 * (Here we have one of the subtle syntax dependencies: an individual BRANCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 * (as opposed to a collection of them) is never concatenated with anything
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * because of operator precedence). The "next" pointer of a BRACES_COMPLEX
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
88 * node points to the node after the stuff to be repeated.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
89 * 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
90 * 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
91 * is the first node of the branch.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
92 * (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
93 * thing following the set of BRANCHes.)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 * pattern is coded like:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 * +-----------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 * | V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 * | ^ | ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 * +------+ +----------+
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 * V |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 * | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 * | +---------------+ |
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 *
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
112 * +----------------------+
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
113 * V |
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
114 * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
115 * | | ^ ^
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
116 * | +-----------+ |
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
117 * +--------------------------------------------------+
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
118 *
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
119 *
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 * +-------------------------+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 * V |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 * | | ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 * | +----------------+
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 * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 * | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 * | +----------------+ |
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 * | V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 * | | | | ^ ^
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 * | | | +-----+ |
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 *
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
142 * They all start with a BRANCH for "\|" alternatives, even when there is only
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 * one alternative.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 * The opcodes are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 /* definition number opnd? meaning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 #define END 0 /* End of program or NOMATCH operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 #define BOL 1 /* Match "" at beginning of line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 #define EOL 2 /* Match "" at end of line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 #define BRANCH 3 /* node Match this alternative, or the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 * next... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 #define BACK 4 /* Match "", "next" ptr points backward. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 #define EXACTLY 5 /* str Match this string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 #define NOTHING 6 /* Match empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 #define STAR 7 /* node Match this (simple) thing 0 or more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 * times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 #define PLUS 8 /* node Match this (simple) thing 1 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 MATCH 9 /* node match the operand zero-width */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 #define NOMATCH 10 /* node check for no match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 #define BEHIND 11 /* node look behind for a match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 #define NOBEHIND 12 /* node look behind for no match with operand */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 #define SUBPAT 13 /* node match the operand here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 #define BRACE_SIMPLE 14 /* node Match this (simple) thing between m and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 * n times (\{m,n\}). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 #define BOW 15 /* Match "" after [^a-zA-Z0-9_] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 #define EOW 16 /* Match "" at [^a-zA-Z0-9_] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 #define BRACE_LIMITS 17 /* nr nr define the min & max for BRACE_SIMPLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 * and BRACE_COMPLEX. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 #define NEWL 18 /* Match line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 #define BHPOS 19 /* End position for BEHIND or NOBEHIND */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 /* character classes: 20-48 normal, 50-78 include a line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 #define ADD_NL 30
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 #define FIRST_NL ANY + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 #define ANY 20 /* Match any one character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 #define ANYOF 21 /* str Match any character in this string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 #define ANYBUT 22 /* str Match any character not in this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 * string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 #define IDENT 23 /* Match identifier char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 #define SIDENT 24 /* Match identifier char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 #define KWORD 25 /* Match keyword char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 #define SKWORD 26 /* Match word char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 #define FNAME 27 /* Match file name char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 #define SFNAME 28 /* Match file name char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 #define PRINT 29 /* Match printable char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 #define SPRINT 30 /* Match printable char but no digit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 #define WHITE 31 /* Match whitespace char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 #define NWHITE 32 /* Match non-whitespace char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 #define DIGIT 33 /* Match digit char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 #define NDIGIT 34 /* Match non-digit char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 #define HEX 35 /* Match hex char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 #define NHEX 36 /* Match non-hex char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 #define OCTAL 37 /* Match octal char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 #define NOCTAL 38 /* Match non-octal char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 #define WORD 39 /* Match word char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 #define NWORD 40 /* Match non-word char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 #define HEAD 41 /* Match head char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 #define NHEAD 42 /* Match non-head char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 #define ALPHA 43 /* Match alpha char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 #define NALPHA 44 /* Match non-alpha char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 #define LOWER 45 /* Match lowercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 #define NLOWER 46 /* Match non-lowercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 #define UPPER 47 /* Match uppercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 #define NUPPER 48 /* Match non-uppercase char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 #define LAST_NL NUPPER + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 #define WITH_NL(op) ((op) >= FIRST_NL && (op) <= LAST_NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 #define MOPEN 80 /* -89 Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 * \( subexpr. MOPEN + 0 marks start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 * match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 #define MCLOSE 90 /* -99 Analogous to MOPEN. MCLOSE + 0 marks
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 * end of match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #define BACKREF 100 /* -109 node Match same string again \1-\9 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 # define ZOPEN 110 /* -119 Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 * \z( subexpr. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 # define ZCLOSE 120 /* -129 Analogous to ZOPEN. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 # define ZREF 130 /* -139 node Match external submatch \z1-\z9 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 #define BRACE_COMPLEX 140 /* -149 node Match nodes between m & n times */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 #define NOPEN 150 /* Mark this point in input as start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 \%( subexpr. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 #define NCLOSE 151 /* Analogous to NOPEN. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 #define MULTIBYTECODE 200 /* mbc Match one multi-byte character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 #define RE_BOF 201 /* Match "" at beginning of file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 #define RE_EOF 202 /* Match "" at end of file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 #define CURSOR 203 /* Match location of cursor. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 #define RE_LNUM 204 /* nr cmp Match line number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 #define RE_COL 205 /* nr cmp Match column number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 #define RE_VCOL 206 /* nr cmp Match virtual column number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
243 #define RE_MARK 207 /* mark cmp Match mark position */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
244 #define RE_VISUAL 208 /* Match Visual area */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
245
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 * Magic characters have a special meaning, they don't match literally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 * Magic characters are negative. This separates them from literal characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 * (possibly multi-byte). Only ASCII characters can be Magic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 #define Magic(x) ((int)(x) - 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 #define un_Magic(x) ((x) + 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 #define is_Magic(x) ((x) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 static int no_Magic __ARGS((int x));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 static int toggle_Magic __ARGS((int x));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 no_Magic(x)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 if (is_Magic(x))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 return un_Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 return x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 toggle_Magic(x)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 if (is_Magic(x))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 return un_Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 return Magic(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 * The first byte of the regexp internal "program" is actually this magic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 * 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
279 * most severe mutilation of the program by the caller.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 #define REGMAGIC 0234
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 * Opcode notes:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * BRANCH The set of branches constituting a single choice are hooked
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 * together with their "next" pointers, since precedence prevents
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 * anything being concatenated to any individual branch. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 * "next" pointer of the last BRANCH in a choice points to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 * thing following the whole choice. This is also where the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 * final "next" pointer of each individual branch points; each
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 * branch starts with the operand node of a BRANCH node.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 * BACK Normal "next" pointers all implicitly point forward; BACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 * exists to make loop structures possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 * STAR,PLUS '=', and complex '*' and '+', are implemented as circular
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 * BRANCH structures using BACK. Simple cases (one character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 * per match) are implemented with STAR and PLUS for speed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 * and to minimize recursive plunges.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 * node, and defines the min and max limits to be used for that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 * node.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 * MOPEN,MCLOSE ...are numbered at compile time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 * ZOPEN,ZCLOSE ...ditto
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 * A node is one char of opcode followed by two chars of "next" pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 * "Next" pointers are stored as two 8-bit bytes, high order first. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 * value is a positive offset from the opcode of the node containing it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 * An operand, if any, simply follows the node. (Note that much of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 * code generation knows about this implicit relationship.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 * Using two bytes for the "next" pointer is vast overkill for most things,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 * but allows patterns to get big without disasters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 #define OP(p) ((int)*(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 #define NEXT(p) (((*((p) + 1) & 0377) << 8) + (*((p) + 2) & 0377))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 #define OPERAND(p) ((p) + 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 /* Obtain an operand that was stored as four bytes, MSB first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 #define OPERAND_MIN(p) (((long)(p)[3] << 24) + ((long)(p)[4] << 16) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 + ((long)(p)[5] << 8) + (long)(p)[6])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 /* Obtain a second operand stored as four bytes. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 #define OPERAND_MAX(p) OPERAND_MIN((p) + 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 /* Obtain a second single-byte operand stored after a four bytes operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 #define OPERAND_CMP(p) (p)[7]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 * Utility definitions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 #define UCHARAT(p) ((int)*(char_u *)(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 /* Used for an error (down from) vim_regcomp(): give the error message, set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 * rc_did_emsg and return NULL */
653
5acda076fb0c updated for version 7.0192
vimboss
parents: 639
diff changeset
339 #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
340 #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
341 #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
342 #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
343 #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
344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 #define MAX_LIMIT (32767L << 16L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 static int re_multi_type __ARGS((int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 static int cstrncmp __ARGS((char_u *s1, char_u *s2, int *n));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 static char_u *cstrchr __ARGS((char_u *, int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
351 #ifdef BT_REGEXP_DUMP
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
352 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
353 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 static char_u *regprop __ARGS((char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
358 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
359 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
360 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
361 static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
362
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 #define NOT_MULTI 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 #define MULTI_ONE 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 #define MULTI_MULT 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 * Return NOT_MULTI if c is not a "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 * Return MULTI_ONE if c is a single "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 * Return MULTI_MULT if c is a multi "multi" operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 re_multi_type(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 if (c == Magic('@') || c == Magic('=') || c == Magic('?'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 return MULTI_ONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 if (c == Magic('*') || c == Magic('+') || c == Magic('{'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 return MULTI_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 return NOT_MULTI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 * Flags to be passed up and down.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 #define HASWIDTH 0x1 /* Known never to match null string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 #define SIMPLE 0x2 /* Simple enough to be STAR/PLUS operand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 #define SPSTART 0x4 /* Starts with * or +. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 #define HASNL 0x8 /* Contains some \n. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 #define HASLOOKBH 0x10 /* Contains "\@<=" or "\@<!". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 #define WORST 0 /* Worst case. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 * 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
394 * instead.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 #define JUST_CALC_SIZE ((char_u *) -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
398 static char_u *reg_prev_sub = NULL;
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
399
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 * REGEXP_INRANGE contains all characters which are always special in a []
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 * range after '\'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 * REGEXP_ABBR contains all characters which act as abbreviations after '\'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 * These are:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 * \n - New line (NL).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 * \r - Carriage Return (CR).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 * \t - Tab (TAB).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 * \e - Escape (ESC).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 * \b - Backspace (Ctrl_H).
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
410 * \d - Character code in decimal, eg \d123
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
411 * \o - Character code in octal, eg \o80
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
412 * \x - Character code in hex, eg \x4a
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
413 * \u - Multibyte character code, eg \u20ac
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
414 * \U - Long multibyte character code, eg \U12345678
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 static char_u REGEXP_INRANGE[] = "]^-n\\";
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
417 static char_u REGEXP_ABBR[] = "nrtebdoxuU";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 static int backslash_trans __ARGS((int c));
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
420 static int get_char_class __ARGS((char_u **pp));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
421 static int get_equi_class __ARGS((char_u **pp));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
422 static void reg_equi_class __ARGS((int c));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
423 static int get_coll_element __ARGS((char_u **pp));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 static char_u *skip_anyof __ARGS((char_u *p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 static void init_class_tab __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 * Translate '\x' to its control character, except "\n", which is Magic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 backslash_trans(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 case 'r': return CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 case 't': return TAB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 case 'e': return ESC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 case 'b': return BS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 /*
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
445 * Check for a character class name "[:name:]". "pp" points to the '['.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 * Returns one of the CLASS_ items. CLASS_NONE means that no item was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 * recognized. Otherwise "pp" is advanced to after the item.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 static int
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
450 get_char_class(pp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 char_u **pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 static const char *(class_names[]) =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 "alnum:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 #define CLASS_ALNUM 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 "alpha:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 #define CLASS_ALPHA 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 "blank:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 #define CLASS_BLANK 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 "cntrl:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 #define CLASS_CNTRL 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 "digit:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 #define CLASS_DIGIT 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 "graph:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 #define CLASS_GRAPH 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 "lower:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 #define CLASS_LOWER 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 "print:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 #define CLASS_PRINT 7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 "punct:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 #define CLASS_PUNCT 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 "space:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 #define CLASS_SPACE 9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 "upper:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 #define CLASS_UPPER 10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 "xdigit:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 #define CLASS_XDIGIT 11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 "tab:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 #define CLASS_TAB 12
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 "return:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 #define CLASS_RETURN 13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 "backspace:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 #define CLASS_BACKSPACE 14
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 "escape:]",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 #define CLASS_ESCAPE 15
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 #define CLASS_NONE 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 if ((*pp)[1] == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 {
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1815
diff changeset
493 for (i = 0; i < (int)(sizeof(class_names) / sizeof(*class_names)); ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 *pp += STRLEN(class_names[i]) + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 return CLASS_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 * Specific version of character class functions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 * Using a table to keep this fast.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 static short class_tab[256];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 #define RI_DIGIT 0x01
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 #define RI_HEX 0x02
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 #define RI_OCTAL 0x04
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 #define RI_WORD 0x08
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 #define RI_HEAD 0x10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 #define RI_ALPHA 0x20
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 #define RI_LOWER 0x40
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 #define RI_UPPER 0x80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 #define RI_WHITE 0x100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 init_class_tab()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 static int done = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 if (done)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 for (i = 0; i < 256; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 if (i >= '0' && i <= '7')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 class_tab[i] = RI_DIGIT + RI_HEX + RI_OCTAL + RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 else if (i >= '8' && i <= '9')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 else if (i >= 'a' && i <= 'f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 else if ((i >= 'g' && i <= 'i') || (i >= 'j' && i <= 'r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 || (i >= 's' && i <= 'z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 else if (i >= 'g' && i <= 'z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 else if (i >= 'A' && i <= 'F')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 else if ((i >= 'G' && i <= 'I') || ( i >= 'J' && i <= 'R')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 || (i >= 'S' && i <= 'Z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 else if (i >= 'G' && i <= 'Z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 else if (i == '_')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 class_tab[i] = RI_WORD + RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 class_tab[i] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 class_tab[' '] |= RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 class_tab['\t'] |= RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 done = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 # define ri_digit(c) (c < 0x100 && (class_tab[c] & RI_DIGIT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 # define ri_hex(c) (c < 0x100 && (class_tab[c] & RI_HEX))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 # define ri_octal(c) (c < 0x100 && (class_tab[c] & RI_OCTAL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 # define ri_word(c) (c < 0x100 && (class_tab[c] & RI_WORD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 # define ri_head(c) (c < 0x100 && (class_tab[c] & RI_HEAD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 # define ri_alpha(c) (c < 0x100 && (class_tab[c] & RI_ALPHA))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 # define ri_lower(c) (c < 0x100 && (class_tab[c] & RI_LOWER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 # define ri_upper(c) (c < 0x100 && (class_tab[c] & RI_UPPER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 # define ri_white(c) (c < 0x100 && (class_tab[c] & RI_WHITE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 # define ri_digit(c) (class_tab[c] & RI_DIGIT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 # define ri_hex(c) (class_tab[c] & RI_HEX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 # define ri_octal(c) (class_tab[c] & RI_OCTAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 # define ri_word(c) (class_tab[c] & RI_WORD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 # define ri_head(c) (class_tab[c] & RI_HEAD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 # define ri_alpha(c) (class_tab[c] & RI_ALPHA)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 # define ri_lower(c) (class_tab[c] & RI_LOWER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 # define ri_upper(c) (class_tab[c] & RI_UPPER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 # define ri_white(c) (class_tab[c] & RI_WHITE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 /* flags for regflags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 #define RF_ICASE 1 /* ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 #define RF_NOICASE 2 /* don't ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 #define RF_HASNL 4 /* can match a NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 #define RF_ICOMBINE 8 /* ignore combining characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 #define RF_LOOKBH 16 /* uses "\@<=" or "\@<!" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 * Global work variables for vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 static char_u *regparse; /* Input-scan pointer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 static int prevchr_len; /* byte length of previous char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 static int num_complex_braces; /* Complex \{...} count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 static int regnpar; /* () count. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 static int regnzpar; /* \z() count. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 static int re_has_z; /* \z item detected */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 static char_u *regcode; /* Code-emit pointer, or JUST_CALC_SIZE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 static long regsize; /* Code size. */
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
605 static int reg_toolong; /* TRUE when offset out of range */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 static char_u had_endbrace[NSUBEXP]; /* flags, TRUE if end of () found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 static unsigned regflags; /* RF_ flags for prog */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 static long brace_min[10]; /* Minimums for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 static long brace_max[10]; /* Maximums for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 static int brace_count[10]; /* Current counts for complex brace repeats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 static int had_eol; /* TRUE when EOL found by vim_regcomp() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 static int one_exactly = FALSE; /* only do one char for EXACTLY */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 static int reg_magic; /* magicness of the pattern: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 #define MAGIC_NONE 1 /* "\V" very unmagic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 #define MAGIC_OFF 2 /* "\M" or 'magic' off */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 #define MAGIC_ON 3 /* "\m" or 'magic' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 #define MAGIC_ALL 4 /* "\v" very magic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 static int reg_string; /* matching with a string instead of a buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 line */
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
624 static int reg_strict; /* "[abc" is illegal */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 * META contains all characters that may be magic, except '^' and '$'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 static char_u META[] = "%&()*+.123456789<=>?@ACDFHIKLMOPSUVWX[_acdfhiklmnopsuvwxz{|~";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 /* META[] is used often enough to justify turning it into a table. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 static char_u META_flags[] = {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 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
636 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
637 /* % & ( ) * + . */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 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
639 /* 1 2 3 4 5 6 7 8 9 < = > ? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 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
641 /* @ A C D F H I K L M O */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 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
643 /* P S U V W X Z [ _ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 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
645 /* a c d f h i k l m n o */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 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
647 /* p s u v w x z { | ~ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 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
649 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
652 static int curchr; /* currently parsed character */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
653 /* 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
654 * 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
655 * because ^ was taken to be magic -- webb */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
656 static int prevchr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
657 static int prevprevchr; /* previous-previous character */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
658 static int nextchr; /* used for ungetchr() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 /* arguments for reg() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 #define REG_NOPAREN 0 /* toplevel reg() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 #define REG_PAREN 1 /* \(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 #define REG_ZPAREN 2 /* \z(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 #define REG_NPAREN 3 /* \%(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 * Forward declarations for vim_regcomp()'s friends.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 static void initchr __ARGS((char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 static int getchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 static void skipchr_keepstart __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 static int peekchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 static void skipchr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 static void ungetchr __ARGS((void));
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
675 static int gethexchrs __ARGS((int maxinputlen));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
676 static int getoctchrs __ARGS((void));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
677 static int getdecchrs __ARGS((void));
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
678 static int coll_get_char __ARGS((void));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 static void regcomp_start __ARGS((char_u *expr, int flags));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 static char_u *reg __ARGS((int, int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 static char_u *regbranch __ARGS((int *flagp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 static char_u *regconcat __ARGS((int *flagp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 static char_u *regpiece __ARGS((int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 static char_u *regatom __ARGS((int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 static char_u *regnode __ARGS((int));
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
686 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
687 static int use_multibytecode __ARGS((int c));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
688 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 static int prog_magic_wrong __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 static char_u *regnext __ARGS((char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 static void regc __ARGS((int b));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 static void regmbc __ARGS((int c));
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
694 # define REGMBC(x) regmbc(x);
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
695 # define CASEMBC(x) case x:
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
696 #else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
697 # define regmbc(c) regc(c)
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
698 # define REGMBC(x)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
699 # define CASEMBC(x)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 static void reginsert __ARGS((int, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 static void reginsert_limits __ARGS((int, long, long, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 static char_u *re_put_long __ARGS((char_u *pr, long_u val));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 static int read_limits __ARGS((long *, long *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 static void regtail __ARGS((char_u *, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 static void regoptail __ARGS((char_u *, char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
708 static regengine_T bt_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
709 static regengine_T nfa_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
710
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 * Return TRUE if compiled regular expression "prog" can match a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 re_multiline(prog)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 regprog_T *prog;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 return (prog->regflags & RF_HASNL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 * Return TRUE if compiled regular expression "prog" looks before the start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 * position (pattern contains "\@<=" or "\@<!").
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 re_lookbehind(prog)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 regprog_T *prog;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 return (prog->regflags & RF_LOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 /*
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
733 * Check for an equivalence class name "[=a=]". "pp" points to the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
734 * Returns a character representing the class. Zero means that no item was
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
735 * recognized. Otherwise "pp" is advanced to after the item.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
736 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
737 static int
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
738 get_equi_class(pp)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
739 char_u **pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
740 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
741 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
742 int l = 1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
743 char_u *p = *pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
744
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
745 if (p[1] == '=')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
746 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
747 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
748 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
749 l = (*mb_ptr2len)(p + 2);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
750 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
751 if (p[l + 2] == '=' && p[l + 3] == ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
752 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
753 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
754 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
755 c = mb_ptr2char(p + 2);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
756 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
757 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
758 c = p[2];
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
759 *pp += l + 4;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
760 return c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
761 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
762 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
763 return 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
764 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
765
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
766 #ifdef EBCDIC
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
767 /*
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
768 * 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
769 */
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
770 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
771 "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
772 "C\x68",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
773 "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
774 "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
775 "N\x69",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
776 "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
777 "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
778 "Y\xBA",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
779 "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
780 "c\x48",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
781 "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
782 "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
783 "n\x49",
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
784 "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
785 "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
786 "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
787 };
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
788 #endif
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
789
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
790 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
791 * Produce the bytes for equivalence class "c".
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
792 * 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
793 * NOTE: When changing this function, also change nfa_emit_equi_class()
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
794 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
795 static void
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
796 reg_equi_class(c)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
797 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
798 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
799 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
800 if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
492
81c06952fb1d updated for version 7.0135
vimboss
parents: 482
diff changeset
801 || STRCMP(p_enc, "iso-8859-15") == 0)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
802 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
803 {
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
804 #ifdef EBCDIC
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
805 int i;
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
806
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
807 /* 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
808 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
809 {
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
810 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
811 {
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
812 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
813
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
814 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
815 regmbc(*p++);
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
816 return;
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
817 }
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
818 }
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
819 #else
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
820 switch (c)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
821 {
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
822 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
823 CASEMBC(0x100) CASEMBC(0x102) CASEMBC(0x104) CASEMBC(0x1cd)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
824 CASEMBC(0x1de) CASEMBC(0x1e0) CASEMBC(0x1ea2)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
825 case '\303': case '\304': case '\305':
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
826 regmbc('A'); regmbc('\300'); regmbc('\301');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
827 regmbc('\302'); regmbc('\303'); regmbc('\304');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
828 regmbc('\305');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
829 REGMBC(0x100) REGMBC(0x102) REGMBC(0x104)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
830 REGMBC(0x1cd) REGMBC(0x1de) REGMBC(0x1e0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
831 REGMBC(0x1ea2)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
832 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
833 case 'B': CASEMBC(0x1e02) CASEMBC(0x1e06)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
834 regmbc('B'); REGMBC(0x1e02) REGMBC(0x1e06)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
835 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
836 case 'C': case '\307':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
837 CASEMBC(0x106) CASEMBC(0x108) CASEMBC(0x10a) CASEMBC(0x10c)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
838 regmbc('C'); regmbc('\307');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
839 REGMBC(0x106) REGMBC(0x108) REGMBC(0x10a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
840 REGMBC(0x10c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
841 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
842 case 'D': CASEMBC(0x10e) CASEMBC(0x110) CASEMBC(0x1e0a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
843 CASEMBC(0x1e0e) CASEMBC(0x1e10)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
844 regmbc('D'); REGMBC(0x10e) REGMBC(0x110)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
845 REGMBC(0x1e0a) REGMBC(0x1e0e) REGMBC(0x1e10)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
846 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
847 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
848 CASEMBC(0x112) CASEMBC(0x114) CASEMBC(0x116) CASEMBC(0x118)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
849 CASEMBC(0x11a) CASEMBC(0x1eba) CASEMBC(0x1ebc)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
850 regmbc('E'); regmbc('\310'); regmbc('\311');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
851 regmbc('\312'); regmbc('\313');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
852 REGMBC(0x112) REGMBC(0x114) REGMBC(0x116)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
853 REGMBC(0x118) REGMBC(0x11a) REGMBC(0x1eba)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
854 REGMBC(0x1ebc)
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 'F': CASEMBC(0x1e1e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
857 regmbc('F'); REGMBC(0x1e1e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
858 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
859 case 'G': CASEMBC(0x11c) CASEMBC(0x11e) CASEMBC(0x120)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
860 CASEMBC(0x122) CASEMBC(0x1e4) CASEMBC(0x1e6) CASEMBC(0x1f4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
861 CASEMBC(0x1e20)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
862 regmbc('G'); REGMBC(0x11c) REGMBC(0x11e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
863 REGMBC(0x120) REGMBC(0x122) REGMBC(0x1e4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
864 REGMBC(0x1e6) REGMBC(0x1f4) REGMBC(0x1e20)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
865 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
866 case 'H': CASEMBC(0x124) CASEMBC(0x126) CASEMBC(0x1e22)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
867 CASEMBC(0x1e26) CASEMBC(0x1e28)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
868 regmbc('H'); REGMBC(0x124) REGMBC(0x126)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
869 REGMBC(0x1e22) REGMBC(0x1e26) REGMBC(0x1e28)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
870 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
871 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
872 CASEMBC(0x128) CASEMBC(0x12a) CASEMBC(0x12c) CASEMBC(0x12e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
873 CASEMBC(0x130) CASEMBC(0x1cf) CASEMBC(0x1ec8)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
874 regmbc('I'); regmbc('\314'); regmbc('\315');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
875 regmbc('\316'); regmbc('\317');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
876 REGMBC(0x128) REGMBC(0x12a) REGMBC(0x12c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
877 REGMBC(0x12e) REGMBC(0x130) REGMBC(0x1cf)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
878 REGMBC(0x1ec8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
879 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
880 case 'J': CASEMBC(0x134)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
881 regmbc('J'); REGMBC(0x134)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
882 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
883 case 'K': CASEMBC(0x136) CASEMBC(0x1e8) CASEMBC(0x1e30)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
884 CASEMBC(0x1e34)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
885 regmbc('K'); REGMBC(0x136) REGMBC(0x1e8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
886 REGMBC(0x1e30) REGMBC(0x1e34)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
887 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
888 case 'L': CASEMBC(0x139) CASEMBC(0x13b) CASEMBC(0x13d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
889 CASEMBC(0x13f) CASEMBC(0x141) CASEMBC(0x1e3a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
890 regmbc('L'); REGMBC(0x139) REGMBC(0x13b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
891 REGMBC(0x13d) REGMBC(0x13f) REGMBC(0x141)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
892 REGMBC(0x1e3a)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
893 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
894 case 'M': CASEMBC(0x1e3e) CASEMBC(0x1e40)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
895 regmbc('M'); REGMBC(0x1e3e) REGMBC(0x1e40)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
896 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
897 case 'N': case '\321':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
898 CASEMBC(0x143) CASEMBC(0x145) CASEMBC(0x147) CASEMBC(0x1e44)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
899 CASEMBC(0x1e48)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
900 regmbc('N'); regmbc('\321');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
901 REGMBC(0x143) REGMBC(0x145) REGMBC(0x147)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
902 REGMBC(0x1e44) REGMBC(0x1e48)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
903 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
904 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
905 case '\326': case '\330':
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
906 CASEMBC(0x14c) CASEMBC(0x14e) CASEMBC(0x150) CASEMBC(0x1a0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
907 CASEMBC(0x1d1) CASEMBC(0x1ea) CASEMBC(0x1ec) CASEMBC(0x1ece)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
908 regmbc('O'); regmbc('\322'); regmbc('\323');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
909 regmbc('\324'); regmbc('\325'); regmbc('\326');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
910 regmbc('\330');
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
911 REGMBC(0x14c) REGMBC(0x14e) REGMBC(0x150)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
912 REGMBC(0x1a0) REGMBC(0x1d1) REGMBC(0x1ea)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
913 REGMBC(0x1ec) REGMBC(0x1ece)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
914 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
915 case 'P': case 0x1e54: case 0x1e56:
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
916 regmbc('P'); REGMBC(0x1e54) REGMBC(0x1e56)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
917 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
918 case 'R': CASEMBC(0x154) CASEMBC(0x156) CASEMBC(0x158)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
919 CASEMBC(0x1e58) CASEMBC(0x1e5e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
920 regmbc('R'); REGMBC(0x154) REGMBC(0x156) REGMBC(0x158)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
921 REGMBC(0x1e58) REGMBC(0x1e5e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
922 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
923 case 'S': CASEMBC(0x15a) CASEMBC(0x15c) CASEMBC(0x15e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
924 CASEMBC(0x160) CASEMBC(0x1e60)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
925 regmbc('S'); REGMBC(0x15a) REGMBC(0x15c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
926 REGMBC(0x15e) REGMBC(0x160) REGMBC(0x1e60)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
927 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
928 case 'T': CASEMBC(0x162) CASEMBC(0x164) CASEMBC(0x166)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
929 CASEMBC(0x1e6a) CASEMBC(0x1e6e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
930 regmbc('T'); REGMBC(0x162) REGMBC(0x164)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
931 REGMBC(0x166) REGMBC(0x1e6a) REGMBC(0x1e6e)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
932 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
933 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
934 CASEMBC(0x168) CASEMBC(0x16a) CASEMBC(0x16c) CASEMBC(0x16e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
935 CASEMBC(0x170) CASEMBC(0x172) CASEMBC(0x1af) CASEMBC(0x1d3)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
936 CASEMBC(0x1ee6)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
937 regmbc('U'); regmbc('\331'); regmbc('\332');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
938 regmbc('\333'); regmbc('\334');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
939 REGMBC(0x168) REGMBC(0x16a) REGMBC(0x16c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
940 REGMBC(0x16e) REGMBC(0x170) REGMBC(0x172)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
941 REGMBC(0x1af) REGMBC(0x1d3) REGMBC(0x1ee6)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
942 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
943 case 'V': CASEMBC(0x1e7c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
944 regmbc('V'); REGMBC(0x1e7c)
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 'W': CASEMBC(0x174) CASEMBC(0x1e80) CASEMBC(0x1e82)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
947 CASEMBC(0x1e84) CASEMBC(0x1e86)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
948 regmbc('W'); REGMBC(0x174) REGMBC(0x1e80)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
949 REGMBC(0x1e82) REGMBC(0x1e84) REGMBC(0x1e86)
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 'X': CASEMBC(0x1e8a) CASEMBC(0x1e8c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
952 regmbc('X'); REGMBC(0x1e8a) REGMBC(0x1e8c)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
953 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
954 case 'Y': case '\335':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
955 CASEMBC(0x176) CASEMBC(0x178) CASEMBC(0x1e8e) CASEMBC(0x1ef2)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
956 CASEMBC(0x1ef6) CASEMBC(0x1ef8)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
957 regmbc('Y'); regmbc('\335');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
958 REGMBC(0x176) REGMBC(0x178) REGMBC(0x1e8e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
959 REGMBC(0x1ef2) REGMBC(0x1ef6) REGMBC(0x1ef8)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
960 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
961 case 'Z': CASEMBC(0x179) CASEMBC(0x17b) CASEMBC(0x17d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
962 CASEMBC(0x1b5) CASEMBC(0x1e90) CASEMBC(0x1e94)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
963 regmbc('Z'); REGMBC(0x179) REGMBC(0x17b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
964 REGMBC(0x17d) REGMBC(0x1b5) REGMBC(0x1e90)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
965 REGMBC(0x1e94)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
966 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
967 case 'a': case '\340': case '\341': case '\342':
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
968 case '\343': case '\344': case '\345':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
969 CASEMBC(0x101) CASEMBC(0x103) CASEMBC(0x105) CASEMBC(0x1ce)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
970 CASEMBC(0x1df) CASEMBC(0x1e1) CASEMBC(0x1ea3)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
971 regmbc('a'); regmbc('\340'); regmbc('\341');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
972 regmbc('\342'); regmbc('\343'); regmbc('\344');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
973 regmbc('\345');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
974 REGMBC(0x101) REGMBC(0x103) REGMBC(0x105)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
975 REGMBC(0x1ce) REGMBC(0x1df) REGMBC(0x1e1)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
976 REGMBC(0x1ea3)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
977 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
978 case 'b': CASEMBC(0x1e03) CASEMBC(0x1e07)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
979 regmbc('b'); REGMBC(0x1e03) REGMBC(0x1e07)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
980 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
981 case 'c': case '\347':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
982 CASEMBC(0x107) CASEMBC(0x109) CASEMBC(0x10b) CASEMBC(0x10d)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
983 regmbc('c'); regmbc('\347');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
984 REGMBC(0x107) REGMBC(0x109) REGMBC(0x10b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
985 REGMBC(0x10d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
986 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
987 case 'd': CASEMBC(0x10f) CASEMBC(0x111) CASEMBC(0x1d0b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
988 CASEMBC(0x1e11)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
989 regmbc('d'); REGMBC(0x10f) REGMBC(0x111)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
990 REGMBC(0x1e0b) REGMBC(0x01e0f) REGMBC(0x1e11)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
991 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
992 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
993 CASEMBC(0x113) CASEMBC(0x115) CASEMBC(0x117) CASEMBC(0x119)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
994 CASEMBC(0x11b) CASEMBC(0x1ebb) CASEMBC(0x1ebd)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
995 regmbc('e'); regmbc('\350'); regmbc('\351');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
996 regmbc('\352'); regmbc('\353');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
997 REGMBC(0x113) REGMBC(0x115) REGMBC(0x117)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
998 REGMBC(0x119) REGMBC(0x11b) REGMBC(0x1ebb)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
999 REGMBC(0x1ebd)
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 'f': CASEMBC(0x1e1f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1002 regmbc('f'); REGMBC(0x1e1f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1003 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1004 case 'g': CASEMBC(0x11d) CASEMBC(0x11f) CASEMBC(0x121)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1005 CASEMBC(0x123) CASEMBC(0x1e5) CASEMBC(0x1e7) CASEMBC(0x1f5)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1006 CASEMBC(0x1e21)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1007 regmbc('g'); REGMBC(0x11d) REGMBC(0x11f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1008 REGMBC(0x121) REGMBC(0x123) REGMBC(0x1e5)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1009 REGMBC(0x1e7) REGMBC(0x1f5) REGMBC(0x1e21)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1010 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1011 case 'h': CASEMBC(0x125) CASEMBC(0x127) CASEMBC(0x1e23)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1012 CASEMBC(0x1e27) CASEMBC(0x1e29) CASEMBC(0x1e96)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1013 regmbc('h'); REGMBC(0x125) REGMBC(0x127)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1014 REGMBC(0x1e23) REGMBC(0x1e27) REGMBC(0x1e29)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1015 REGMBC(0x1e96)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1016 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1017 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
1018 CASEMBC(0x129) CASEMBC(0x12b) CASEMBC(0x12d) CASEMBC(0x12f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1019 CASEMBC(0x1d0) CASEMBC(0x1ec9)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1020 regmbc('i'); regmbc('\354'); regmbc('\355');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1021 regmbc('\356'); regmbc('\357');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1022 REGMBC(0x129) REGMBC(0x12b) REGMBC(0x12d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1023 REGMBC(0x12f) REGMBC(0x1d0) REGMBC(0x1ec9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1024 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1025 case 'j': CASEMBC(0x135) CASEMBC(0x1f0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1026 regmbc('j'); REGMBC(0x135) REGMBC(0x1f0)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1027 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1028 case 'k': CASEMBC(0x137) CASEMBC(0x1e9) CASEMBC(0x1e31)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1029 CASEMBC(0x1e35)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1030 regmbc('k'); REGMBC(0x137) REGMBC(0x1e9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1031 REGMBC(0x1e31) REGMBC(0x1e35)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1032 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1033 case 'l': CASEMBC(0x13a) CASEMBC(0x13c) CASEMBC(0x13e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1034 CASEMBC(0x140) CASEMBC(0x142) CASEMBC(0x1e3b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1035 regmbc('l'); REGMBC(0x13a) REGMBC(0x13c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1036 REGMBC(0x13e) REGMBC(0x140) REGMBC(0x142)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1037 REGMBC(0x1e3b)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1038 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1039 case 'm': CASEMBC(0x1e3f) CASEMBC(0x1e41)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1040 regmbc('m'); REGMBC(0x1e3f) REGMBC(0x1e41)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1041 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1042 case 'n': case '\361':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1043 CASEMBC(0x144) CASEMBC(0x146) CASEMBC(0x148) CASEMBC(0x149)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1044 CASEMBC(0x1e45) CASEMBC(0x1e49)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1045 regmbc('n'); regmbc('\361');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1046 REGMBC(0x144) REGMBC(0x146) REGMBC(0x148)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1047 REGMBC(0x149) REGMBC(0x1e45) REGMBC(0x1e49)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1048 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1049 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
1050 case '\366': case '\370':
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1051 CASEMBC(0x14d) CASEMBC(0x14f) CASEMBC(0x151) CASEMBC(0x1a1)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1052 CASEMBC(0x1d2) CASEMBC(0x1eb) CASEMBC(0x1ed) CASEMBC(0x1ecf)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1053 regmbc('o'); regmbc('\362'); regmbc('\363');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1054 regmbc('\364'); regmbc('\365'); regmbc('\366');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1055 regmbc('\370');
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1056 REGMBC(0x14d) REGMBC(0x14f) REGMBC(0x151)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1057 REGMBC(0x1a1) REGMBC(0x1d2) REGMBC(0x1eb)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1058 REGMBC(0x1ed) REGMBC(0x1ecf)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1059 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1060 case 'p': CASEMBC(0x1e55) CASEMBC(0x1e57)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1061 regmbc('p'); REGMBC(0x1e55) REGMBC(0x1e57)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1062 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1063 case 'r': CASEMBC(0x155) CASEMBC(0x157) CASEMBC(0x159)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1064 CASEMBC(0x1e59) CASEMBC(0x1e5f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1065 regmbc('r'); REGMBC(0x155) REGMBC(0x157) REGMBC(0x159)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1066 REGMBC(0x1e59) REGMBC(0x1e5f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1067 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1068 case 's': CASEMBC(0x15b) CASEMBC(0x15d) CASEMBC(0x15f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1069 CASEMBC(0x161) CASEMBC(0x1e61)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1070 regmbc('s'); REGMBC(0x15b) REGMBC(0x15d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1071 REGMBC(0x15f) REGMBC(0x161) REGMBC(0x1e61)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1072 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1073 case 't': CASEMBC(0x163) CASEMBC(0x165) CASEMBC(0x167)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1074 CASEMBC(0x1e6b) CASEMBC(0x1e6f) CASEMBC(0x1e97)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1075 regmbc('t'); REGMBC(0x163) REGMBC(0x165) REGMBC(0x167)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1076 REGMBC(0x1e6b) REGMBC(0x1e6f) REGMBC(0x1e97)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1077 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1078 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
1079 CASEMBC(0x169) CASEMBC(0x16b) CASEMBC(0x16d) CASEMBC(0x16f)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1080 CASEMBC(0x171) CASEMBC(0x173) CASEMBC(0x1b0) CASEMBC(0x1d4)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1081 CASEMBC(0x1ee7)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1082 regmbc('u'); regmbc('\371'); regmbc('\372');
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1083 regmbc('\373'); regmbc('\374');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1084 REGMBC(0x169) REGMBC(0x16b) REGMBC(0x16d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1085 REGMBC(0x16f) REGMBC(0x171) REGMBC(0x173)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1086 REGMBC(0x1b0) REGMBC(0x1d4) REGMBC(0x1ee7)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1087 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1088 case 'v': CASEMBC(0x1e7d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1089 regmbc('v'); REGMBC(0x1e7d)
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 'w': CASEMBC(0x175) CASEMBC(0x1e81) CASEMBC(0x1e83)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1092 CASEMBC(0x1e85) CASEMBC(0x1e87) CASEMBC(0x1e98)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1093 regmbc('w'); REGMBC(0x175) REGMBC(0x1e81)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1094 REGMBC(0x1e83) REGMBC(0x1e85) REGMBC(0x1e87)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1095 REGMBC(0x1e98)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1096 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1097 case 'x': CASEMBC(0x1e8b) CASEMBC(0x1e8d)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1098 regmbc('x'); REGMBC(0x1e8b) REGMBC(0x1e8d)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1099 return;
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1100 case 'y': case '\375': case '\377':
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1101 CASEMBC(0x177) CASEMBC(0x1e8f) CASEMBC(0x1e99)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1102 CASEMBC(0x1ef3) CASEMBC(0x1ef7) CASEMBC(0x1ef9)
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 233
diff changeset
1103 regmbc('y'); regmbc('\375'); regmbc('\377');
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1104 REGMBC(0x177) REGMBC(0x1e8f) REGMBC(0x1e99)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1105 REGMBC(0x1ef3) REGMBC(0x1ef7) REGMBC(0x1ef9)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1106 return;
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1107 case 'z': CASEMBC(0x17a) CASEMBC(0x17c) CASEMBC(0x17e)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1108 CASEMBC(0x1b6) CASEMBC(0x1e91) CASEMBC(0x1e95)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1109 regmbc('z'); REGMBC(0x17a) REGMBC(0x17c)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1110 REGMBC(0x17e) REGMBC(0x1b6) REGMBC(0x1e91)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
1111 REGMBC(0x1e95)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1112 return;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1113 }
2247
c40cd9aad546 Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
Bram Moolenaar <bram@vim.org>
parents: 2173
diff changeset
1114 #endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1115 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1116 regmbc(c);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1117 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1118
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1119 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1120 * Check for a collating element "[.a.]". "pp" points to the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1121 * Returns a character. Zero means that no item was recognized. Otherwise
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1122 * "pp" is advanced to after the item.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1123 * Currently only single characters are recognized!
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1124 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1125 static int
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1126 get_coll_element(pp)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1127 char_u **pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1128 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1129 int c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1130 int l = 1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1131 char_u *p = *pp;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1132
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1133 if (p[1] == '.')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1134 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1135 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1136 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
1137 l = (*mb_ptr2len)(p + 2);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1138 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1139 if (p[l + 2] == '.' && p[l + 3] == ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1140 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1141 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1142 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1143 c = mb_ptr2char(p + 2);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1144 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1145 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1146 c = p[2];
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1147 *pp += l + 4;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1148 return c;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1149 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1150 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1151 return 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1152 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1153
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1154
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1155 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1156 * Skip over a "[]" range.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1157 * "p" must point to the character after the '['.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1158 * The returned pointer is on the matching ']', or the terminating NUL.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1159 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1160 static char_u *
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1161 skip_anyof(p)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1162 char_u *p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1163 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1164 int cpo_lit; /* 'cpoptions' contains 'l' flag */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1165 int cpo_bsl; /* 'cpoptions' contains '\' flag */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1166 #ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1167 int l;
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
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
1170 cpo_lit = vim_strchr(p_cpo, CPO_LITERAL) != NULL;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
1171 cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1172
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1173 if (*p == '^') /* Complement of range. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1174 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1175 if (*p == ']' || *p == '-')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1176 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1177 while (*p != NUL && *p != ']')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1178 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1179 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
1180 if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1181 p += l;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1182 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1183 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1184 if (*p == '-')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1185 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1186 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1187 if (*p != ']' && *p != NUL)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1188 mb_ptr_adv(p);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1189 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1190 else if (*p == '\\'
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1191 && !cpo_bsl
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1192 && (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1193 || (!cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1194 p += 2;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1195 else if (*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 if (get_char_class(&p) == CLASS_NONE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1198 && get_equi_class(&p) == 0
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1199 && get_coll_element(&p) == 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1200 ++p; /* It was not a class name */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1201 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1202 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1203 ++p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1204 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1205
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1206 return p;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1207 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1208
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1209 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 * Skip past regular expression.
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 41
diff changeset
1211 * Stop at end of "startp" or where "dirc" is found ('/', '?', etc).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 * Take care of characters with a backslash in front of it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 * Skip strings inside [ and ].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 * When "newp" is not NULL and "dirc" is '?', make an allocated copy of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 * expression and change "\?" to "?". If "*newp" is not NULL the expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 * is changed in-place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 skip_regexp(startp, dirc, magic, newp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 char_u *startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 int dirc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 char_u **newp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 int mymagic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 char_u *p = startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 if (magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 mymagic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 mymagic = MAGIC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
1233 for (; p[0] != NUL; mb_ptr_adv(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 if (p[0] == dirc) /* found end of regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 if ((p[0] == '[' && mymagic >= MAGIC_ON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 || (p[0] == '\\' && p[1] == '[' && mymagic <= MAGIC_OFF))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 p = skip_anyof(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 if (p[0] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 else if (p[0] == '\\' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 if (dirc == '?' && newp != NULL && p[1] == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 /* change "\?" to "?", make a copy first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 if (*newp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 *newp = vim_strsave(startp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 if (*newp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 p = *newp + (p - startp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 if (*newp != NULL)
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
1256 STRMOVE(p, p + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 ++p; /* skip next character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 if (*p == 'v')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 mymagic = MAGIC_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 else if (*p == 'V')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 mymagic = MAGIC_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1271 static regprog_T *bt_regcomp __ARGS((char_u *expr, int re_flags));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1272
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1274 * 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
1275 * traditional back track matcher.
41
f529edb9bab3 updated for version 7.0025
vimboss
parents: 39
diff changeset
1276 * Returns the program in allocated space. Returns NULL for an error.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 * 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
1279 * 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
1280 * 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
1281 * generation turned off and size counting turned on, and once "for real".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 * 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
1283 * thing really will compile successfully, and we never have to move the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 * code and thus invalidate pointers into it. (Note that it has to be in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 * one piece because vim_free() must be able to free it all.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 * Whether upper/lower case is to be ignored is decided when executing the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 * program, it does not matter here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 * Beware that the optimization-preparation code in here knows about some
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 * of the structure of the compiled regexp.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 * "re_flags": RE_MAGIC and/or RE_STRING.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1294 static regprog_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1295 bt_regcomp(expr, re_flags)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 char_u *expr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 int re_flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1299 bt_regprog_T *r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 char_u *longest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 if (expr == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 EMSG_RET_NULL(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 init_class_tab();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 * First pass: determine size, legality.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 regcomp_start(expr, re_flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 regcode = JUST_CALC_SIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 regc(REGMAGIC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 if (reg(REG_NOPAREN, &flags) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 /* Small enough for pointer-storage convention? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 #ifdef SMALL_MALLOC /* 16 bit storage allocation */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 if (regsize >= 65536L - 256L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 EMSG_RET_NULL(_("E339: Pattern too long"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 /* Allocate space. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1326 r = (bt_regprog_T *)lalloc(sizeof(bt_regprog_T) + regsize, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 if (r == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 * Second pass: emit code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 regcomp_start(expr, re_flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 regcode = r->program;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 regc(REGMAGIC);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1336 if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 vim_free(r);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1339 if (reg_toolong)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1340 EMSG_RET_NULL(_("E339: Pattern too long"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 /* Dig out information for optimizations. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 r->regstart = NUL; /* Worst-case defaults. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 r->reganch = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 r->regmust = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 r->regmlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 r->regflags = regflags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 if (flags & HASNL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 r->regflags |= RF_HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 if (flags & HASLOOKBH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 r->regflags |= RF_LOOKBH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 /* Remember whether this pattern has any \z specials in it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 r->reghasz = re_has_z;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 scan = r->program + 1; /* First BRANCH. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 if (OP(regnext(scan)) == END) /* Only one top-level choice. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 scan = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 /* Starting-point info. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 if (OP(scan) == BOL || OP(scan) == RE_BOF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 r->reganch++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 scan = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 if (OP(scan) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 r->regstart = (*mb_ptr2char)(OPERAND(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 r->regstart = *OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 else if ((OP(scan) == BOW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 || OP(scan) == EOW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 || OP(scan) == NOTHING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 && OP(regnext(scan)) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 r->regstart = (*mb_ptr2char)(OPERAND(regnext(scan)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 r->regstart = *OPERAND(regnext(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 * If there's something expensive in the r.e., find the longest
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 * literal string that must appear and make it the regmust. Resolve
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 * ties in favor of later strings, since the regstart check works
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 * with the beginning of the r.e. and avoiding duplication
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 * strengthens checking. Not a strong reason, but sufficient in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 * absence of others.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 * 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
1404 * first. Used a lot for "#" and "*" commands. (Added by mool).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 if ((flags & SPSTART || OP(scan) == BOW || OP(scan) == EOW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 && !(flags & HASNL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 longest = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 for (; scan != NULL; scan = regnext(scan))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 longest = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 len = (int)STRLEN(OPERAND(scan));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 r->regmust = longest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 r->regmlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1421 #ifdef BT_REGEXP_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 regdump(expr, r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1424 r->engine = &bt_regengine;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1425 return (regprog_T *)r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 * 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
1430 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 regcomp_start(expr, re_flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 char_u *expr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 int re_flags; /* see vim_regcomp() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 initchr(expr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 if (re_flags & RE_MAGIC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 reg_magic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 reg_magic = MAGIC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 reg_string = (re_flags & RE_STRING);
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
1442 reg_strict = (re_flags & RE_STRICT);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 num_complex_braces = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 regnpar = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 vim_memset(had_endbrace, 0, sizeof(had_endbrace));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 regnzpar = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 re_has_z = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 regsize = 0L;
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1452 reg_toolong = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 regflags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 had_eol = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 * Check if during the previous call to vim_regcomp the EOL item "$" has been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 * found. This is messy, but it works fine.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 vim_regcomp_had_eol()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 return had_eol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1472 * Parse regular expression, i.e. main body or parenthesized thing.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 * Caller must absorb opening parenthesis.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 * Combining parenthesis handling with the base level of regular expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 * 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
1478 * follows makes it hard to avoid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 reg(paren, flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1482 int paren; /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 char_u *br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 char_u *ender;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 int parno = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 *flagp = HASWIDTH; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 if (paren == REG_ZPAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 /* Make a ZOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 if (regnzpar >= NSUBEXP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 EMSG_RET_NULL(_("E50: Too many \\z("));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 parno = regnzpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 regnzpar++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 ret = regnode(ZOPEN + parno);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 if (paren == REG_PAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 /* Make a MOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 if (regnpar >= NSUBEXP)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1509 EMSG2_RET_NULL(_("E51: Too many %s("), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 parno = regnpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 ++regnpar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 ret = regnode(MOPEN + parno);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 else if (paren == REG_NPAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 /* Make a NOPEN node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 ret = regnode(NOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 ret = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 /* Pick up the branches, linking them together. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 br = regbranch(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 if (br == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 if (ret != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 regtail(ret, br); /* [MZ]OPEN -> first. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 ret = br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 /* If one of the branches can be zero-width, the whole thing can.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 * If one of the branches has * at start or matches a line-break, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 * whole thing can. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 if (!(flags & HASWIDTH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 *flagp &= ~HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 while (peekchr() == Magic('|'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 br = regbranch(&flags);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1540 if (br == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 regtail(ret, br); /* BRANCH -> BRANCH. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 if (!(flags & HASWIDTH))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 *flagp &= ~HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 /* Make a closing node, and hook it on the end. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 ender = regnode(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 paren == REG_ZPAREN ? ZCLOSE + parno :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 paren == REG_PAREN ? MCLOSE + parno :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 paren == REG_NPAREN ? NCLOSE : END);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 regtail(ret, ender);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 /* Hook the tails of the branches to the closing node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 for (br = ret; br != NULL; br = regnext(br))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 regoptail(br, ender);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561 /* Check for proper termination. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562 if (paren != REG_NOPAREN && getchr() != Magic(')'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 if (paren == REG_ZPAREN)
308
74e9d19831c2 updated for version 7.0081
vimboss
parents: 297
diff changeset
1566 EMSG_RET_NULL(_("E52: Unmatched \\z("));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 if (paren == REG_NPAREN)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1570 EMSG2_RET_NULL(_(e_unmatchedpp), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 else
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1572 EMSG2_RET_NULL(_(e_unmatchedp), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 else if (paren == REG_NOPAREN && peekchr() != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 if (curchr == Magic(')'))
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1577 EMSG2_RET_NULL(_(e_unmatchedpar), reg_magic == MAGIC_ALL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 else
308
74e9d19831c2 updated for version 7.0081
vimboss
parents: 297
diff changeset
1579 EMSG_RET_NULL(_(e_trailing)); /* "Can't happen". */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 * Here we set the flag allowing back references to this set of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 * parentheses.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 if (paren == REG_PAREN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 had_endbrace[parno] = TRUE; /* have seen the close paren */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1592 * Parse one alternative of an | operator.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 * Implements the & operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 regbranch(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 char_u *chain = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 char_u *latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 *flagp = WORST | HASNL; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 ret = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 latest = regconcat(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 if (latest == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612 /* If one of the branches has width, the whole thing has. If one of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 * the branches anchors at start-of-line, the whole thing does.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 * If one of the branches uses look-behind, the whole thing does. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 *flagp |= flags & (HASWIDTH | SPSTART | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 /* If one of the branches doesn't match a line-break, the whole thing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 * doesn't. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618 *flagp &= ~HASNL | (flags & HASNL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 if (chain != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 regtail(chain, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 if (peekchr() != Magic('&'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 regtail(latest, regnode(END)); /* operand ends */
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1625 if (reg_toolong)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1626 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 reginsert(MATCH, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 chain = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1635 * Parse one alternative of an | or & operator.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 * Implements the concatenation operator.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 regconcat(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 char_u *first = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 char_u *chain = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 char_u *latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 int cont = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 *flagp = WORST; /* Tentatively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 while (cont)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 switch (peekchr())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 case Magic('|'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 case Magic('&'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 case Magic(')'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 cont = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 case Magic('Z'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 regflags |= RF_ICOMBINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 case Magic('c'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 regflags |= RF_ICASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 case Magic('C'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 regflags |= RF_NOICASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 case Magic('v'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 reg_magic = MAGIC_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 case Magic('m'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 reg_magic = MAGIC_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 case Magic('M'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 reg_magic = MAGIC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 case Magic('V'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 reg_magic = MAGIC_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 skipchr_keepstart();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 latest = regpiece(&flags);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
1696 if (latest == NULL || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 if (chain == NULL) /* First piece. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 *flagp |= flags & SPSTART;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 regtail(chain, latest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 chain = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 if (first == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 first = latest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 if (first == NULL) /* Loop ran zero times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 first = regnode(NOTHING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 return first;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1715 * Parse something followed by possible [*+=].
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 * Note that the branching code sequences used for = and the general cases
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 * of * and + are somewhat optimized: they use the same NOTHING node as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 * both the endmarker for their branch list and the body of the last branch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 * It might seem that this node could be dispensed with entirely, but the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 * endmarker role is not redundant.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 regpiece(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 char_u *next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 long minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1732 long maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 ret = regatom(&flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 op = peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739 if (re_multi_type(op) == NOT_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 *flagp = flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 /* default flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 *flagp = (WORST | SPSTART | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 switch (op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 case Magic('*'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 reginsert(STAR, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 /* Emit x* as (x&|), where & means "self". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 reginsert(BRANCH, ret); /* Either x */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 regoptail(ret, regnode(BACK)); /* and loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 regoptail(ret, ret); /* back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 regtail(ret, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 regtail(ret, regnode(NOTHING)); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 case Magic('+'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 reginsert(PLUS, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 /* Emit x+ as x(&|), where & means "self". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 next = regnode(BRANCH); /* Either */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 regtail(ret, next);
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
1772 regtail(regnode(BACK), ret); /* loop back */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 regtail(next, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 regtail(ret, regnode(NOTHING)); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 *flagp = (WORST | HASWIDTH | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 case Magic('@'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 int lop = END;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 switch (no_Magic(getchr()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 case '=': lop = MATCH; break; /* \@= */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 case '!': lop = NOMATCH; break; /* \@! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 case '>': lop = SUBPAT; break; /* \@> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 case '<': switch (no_Magic(getchr()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 case '=': lop = BEHIND; break; /* \@<= */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 case '!': lop = NOBEHIND; break; /* \@<! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 if (lop == END)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1795 EMSG2_RET_NULL(_("E59: invalid character after %s@"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 /* Look behind must match with behind_pos. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 if (lop == BEHIND || lop == NOBEHIND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 regtail(ret, regnode(BHPOS));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 *flagp |= HASLOOKBH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 regtail(ret, regnode(END)); /* operand ends */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 reginsert(lop, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 case Magic('?'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 case Magic('='):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 /* Emit x= as (x|) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 reginsert(BRANCH, ret); /* Either x */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 regtail(ret, regnode(BRANCH)); /* or */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 next = regnode(NOTHING); /* null. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 regtail(ret, next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 regoptail(ret, next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 case Magic('{'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 if (!read_limits(&minval, &maxval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 if (flags & SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 reginsert(BRACE_SIMPLE, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 if (num_complex_braces >= 10)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1829 EMSG2_RET_NULL(_("E60: Too many complex %s{...}s"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 reginsert(BRACE_COMPLEX + num_complex_braces, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 regoptail(ret, regnode(BACK));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 regoptail(ret, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 ++num_complex_braces;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 if (minval > 0 && maxval > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 *flagp = (HASWIDTH | (flags & (HASNL | HASLOOKBH)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 if (re_multi_type(peekchr()) != NOT_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 /* Can't have a multi follow a multi. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 if (peekchr() == Magic('*'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 sprintf((char *)IObuff, _("E61: Nested %s*"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 reg_magic >= MAGIC_ON ? "" : "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 sprintf((char *)IObuff, _("E62: Nested %s%c"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 reg_magic == MAGIC_ALL ? "" : "\\", no_Magic(peekchr()));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 EMSG_RET_NULL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1856 /* 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
1857 static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU";
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1858 static int classcodes[] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1859 ANY, IDENT, SIDENT, KWORD, SKWORD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1860 FNAME, SFNAME, PRINT, SPRINT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1861 WHITE, NWHITE, DIGIT, NDIGIT,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1862 HEX, NHEX, OCTAL, NOCTAL,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1863 WORD, NWORD, HEAD, NHEAD,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1864 ALPHA, NALPHA, LOWER, NLOWER,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1865 UPPER, NUPPER
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1866 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1867
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
1869 * Parse the lowest level.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 * Optimization: gobbles an entire sequence of ordinary characters so that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 * it can turn them into a single node, which is smaller to store and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 * faster to run. Don't do this when one_exactly is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 regatom(flagp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 int *flagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 int cpo_lit; /* 'cpoptions' contains 'l' flag */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
1882 int cpo_bsl; /* 'cpoptions' contains '\' flag */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 int extra = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 *flagp = WORST; /* Tentatively. */
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
1888 cpo_lit = vim_strchr(p_cpo, CPO_LITERAL) != NULL;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
1889 cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 case Magic('^'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 ret = regnode(BOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 case Magic('$'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 ret = regnode(EOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 had_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 case Magic('<'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 ret = regnode(BOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 case Magic('>'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 ret = regnode(EOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 case Magic('_'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 if (c == '^') /* "\_^" is start-of-line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 ret = regnode(BOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 if (c == '$') /* "\_$" is end-of-line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 ret = regnode(EOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 #if defined(FEAT_SYN_HL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 had_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 extra = ADD_NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 *flagp |= HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 /* "\_[" is character range plus newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 if (c == '[')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 goto collection;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 /* "\_x" is character class plus newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 * Character classes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 case Magic('.'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 case Magic('i'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 case Magic('I'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 case Magic('k'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 case Magic('K'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 case Magic('f'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 case Magic('F'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 case Magic('p'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 case Magic('P'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 case Magic('s'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 case Magic('S'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 case Magic('d'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 case Magic('D'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 case Magic('x'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 case Magic('X'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 case Magic('o'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 case Magic('O'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 case Magic('w'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 case Magic('W'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 case Magic('h'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 case Magic('H'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 case Magic('a'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 case Magic('A'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 case Magic('l'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 case Magic('L'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 case Magic('u'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 case Magic('U'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 p = vim_strchr(classchars, no_Magic(c));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 EMSG_RET_NULL(_("E63: invalid use of \\_"));
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1972 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1973 /* When '.' is followed by a composing char ignore the dot, so that
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1974 * the composing char is matched here. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1975 if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr()))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1976 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1977 c = getchr();
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1978 goto do_multibyte;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1979 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
1980 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 ret = regnode(classcodes[p - classchars] + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 case Magic('n'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 if (reg_string)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 /* In a string "\n" matches a newline character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 regc(NL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 /* In buffer text "\n" matches the end of a line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 ret = regnode(NEWL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 *flagp |= HASWIDTH | HASNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 case Magic('('):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 ret = reg(REG_PAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 case NUL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012 case Magic('|'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 case Magic('&'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 case Magic(')'):
1468
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
2015 if (one_exactly)
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
2016 EMSG_ONE_RET_NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 EMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 case Magic('='):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 case Magic('?'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 case Magic('+'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 case Magic('@'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 case Magic('{'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 case Magic('*'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 c = no_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 sprintf((char *)IObuff, _("E64: %s%c follows nothing"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 (c == '*' ? reg_magic >= MAGIC_ON : reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 ? "" : "\\", c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 EMSG_RET_NULL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 case Magic('~'): /* previous substitute pattern */
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 308
diff changeset
2034 if (reg_prev_sub != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2036 char_u *lp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2038 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 lp = reg_prev_sub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 while (*lp != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041 regc(*lp++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2042 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043 if (*reg_prev_sub != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2045 *flagp |= HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 if ((lp - reg_prev_sub) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 *flagp |= SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 EMSG_RET_NULL(_(e_nopresub));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 case Magic('1'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 case Magic('2'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 case Magic('3'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 case Magic('4'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 case Magic('5'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 case Magic('6'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 case Magic('7'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 case Magic('8'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 case Magic('9'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 int refnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 refnum = c - Magic('0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 * Check if the back reference is legal. We must have seen the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 * close brace.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 * TODO: Should also check that we don't refer to something
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 * that is repeated (+*=): what instance of the repetition
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 * should we match?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 if (!had_endbrace[refnum])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 /* Trick: check if "@<=" or "@<!" follows, in which case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 * the \1 can appear before the referenced match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 for (p = regparse; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 if (p[0] == '@' && p[1] == '<'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 && (p[2] == '!' || p[2] == '='))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 EMSG_RET_NULL(_("E65: Illegal back reference"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 ret = regnode(BACKREF + refnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 case Magic('z'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 {
741
ac1f1e69c50d updated for version 7.0222
vimboss
parents: 714
diff changeset
2094 #ifdef FEAT_SYN_HL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 case '(': if (reg_do_extmatch != REX_SET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 EMSG_RET_NULL(_("E66: \\z( not allowed here"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 ret = reg(REG_ZPAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 *flagp |= flags & (HASWIDTH|SPSTART|HASNL|HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 re_has_z = REX_SET;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 case '1':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 case '2':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 case '3':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 case '4':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 case '5':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 case '6':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 case '7':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 case '8':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 case '9': if (reg_do_extmatch != REX_USE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 EMSG_RET_NULL(_("E67: \\z1 et al. not allowed here"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 ret = regnode(ZREF + c - '0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 re_has_z = REX_USE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 break;
741
ac1f1e69c50d updated for version 7.0222
vimboss
parents: 714
diff changeset
2119 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 case 's': ret = regnode(MOPEN + 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 case 'e': ret = regnode(MCLOSE + 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 default: EMSG_RET_NULL(_("E68: Invalid character after \\z"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 case Magic('%'):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 c = no_Magic(getchr());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 switch (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 /* () without a back reference */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 case '(':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 if (one_exactly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 ret = reg(REG_NPAREN, &flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 /* Catch \%^ and \%$ regardless of where they appear in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 * pattern -- regardless of whether or not it makes sense. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 case '^':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 ret = regnode(RE_BOF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 case '$':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 ret = regnode(RE_EOF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 case '#':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 ret = regnode(CURSOR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2161 case 'V':
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2162 ret = regnode(RE_VISUAL);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2163 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2164
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 /* \%[abc]: Emit as a list of branches, all ending at the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 * branch which matches nothing. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 case '[':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 if (one_exactly) /* doesn't nest */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 EMSG_ONE_RET_NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 char_u *lastbranch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 char_u *lastnode = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 char_u *br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 ret = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 while ((c = getchr()) != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 if (c == NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2179 EMSG2_RET_NULL(_("E69: Missing ] after %s%%["),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 br = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 if (ret == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 ret = br;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 regtail(lastnode, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 ungetchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 one_exactly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 lastnode = regatom(flagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 one_exactly = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 if (lastnode == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 if (ret == NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2195 EMSG2_RET_NULL(_("E70: Empty %s%%[]"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 lastbranch = regnode(BRANCH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 br = regnode(NOTHING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 if (ret != JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 regtail(lastnode, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 regtail(lastbranch, br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 /* connect all branches to the NOTHING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 * branch at the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 for (br = ret; br != lastnode; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 if (OP(br) == BRANCH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 regtail(br, lastbranch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 br = OPERAND(br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 br = regnext(br);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 }
1701
4577899b8ff1 updated for version 7.2c-003
vimboss
parents: 1621
diff changeset
2216 *flagp &= ~(HASWIDTH | SIMPLE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2220 case 'd': /* %d123 decimal */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2221 case 'o': /* %o123 octal */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2222 case 'x': /* %xab hex 2 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2223 case 'u': /* %uabcd hex 4 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2224 case 'U': /* %U1234abcd hex 8 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2225 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2226 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2227
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2228 switch (c)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2229 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2230 case 'd': i = getdecchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2231 case 'o': i = getoctchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2232 case 'x': i = gethexchrs(2); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2233 case 'u': i = gethexchrs(4); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2234 case 'U': i = gethexchrs(8); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2235 default: i = -1; break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2236 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2237
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2238 if (i < 0)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2239 EMSG2_RET_NULL(
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2240 _("E678: Invalid character after %s%%[dxouU]"),
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2241 reg_magic == MAGIC_ALL);
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2242 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2243 if (use_multibytecode(i))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2244 ret = regnode(MULTIBYTECODE);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2245 else
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2246 #endif
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2247 ret = regnode(EXACTLY);
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2248 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2249 regc(0x0a);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2250 else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2251 #ifdef FEAT_MBYTE
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2252 regmbc(i);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2253 #else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2254 regc(i);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2255 #endif
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2256 regc(NUL);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2257 *flagp |= HASWIDTH;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2258 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2259 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2260
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 default:
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2262 if (VIM_ISDIGIT(c) || c == '<' || c == '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2263 || c == '\'')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 long_u n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 int cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 cmp = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 if (cmp == '<' || cmp == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 while (VIM_ISDIGIT(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 n = n * 10 + (c - '0');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 }
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2276 if (c == '\'' && n == 0)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2277 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2278 /* "\%'m", "\%<'m" and "\%>'m": Mark */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2279 c = getchr();
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2280 ret = regnode(RE_MARK);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2281 if (ret == JUST_CALC_SIZE)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2282 regsize += 2;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2283 else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2284 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2285 *regcode++ = c;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2286 *regcode++ = cmp;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2287 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2288 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2289 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
2290 else if (c == 'l' || c == 'c' || c == 'v')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292 if (c == 'l')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 ret = regnode(RE_LNUM);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 else if (c == 'c')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 ret = regnode(RE_COL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 ret = regnode(RE_VCOL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 if (ret == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 regsize += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 /* put the number and the optional
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303 * comparator after the opcode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 regcode = re_put_long(regcode, n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 *regcode++ = cmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2311 EMSG2_RET_NULL(_("E71: Invalid character after %s%%"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 reg_magic == MAGIC_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 case Magic('['):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 collection:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 char_u *lp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 * If there is no matching ']', we assume the '[' is a normal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 * character. This makes 'incsearch' and ":help [" work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 lp = skip_anyof(regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 if (*lp == ']') /* there is a matching ']' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329 int startc = -1; /* > 0 when next '-' is a range */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 int endc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 * In a character class, different parsing rules apply.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 * Not even \ is special anymore, nothing is.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 if (*regparse == '^') /* Complement of range. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 ret = regnode(ANYBUT + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 ret = regnode(ANYOF + extra);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 /* At the start ']' and '-' mean the literal character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 if (*regparse == ']' || *regparse == '-')
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2346 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2347 startc = *regparse;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 regc(*regparse++);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2349 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 while (*regparse != NUL && *regparse != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 if (*regparse == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 ++regparse;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 /* The '-' is not used for a range at the end and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 * after or before a '\n'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 if (*regparse == ']' || *regparse == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 || startc == -1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 || (regparse[0] == '\\' && regparse[1] == 'n'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 regc('-');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 startc = '-'; /* [--x] is a range */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2367 /* Also accept "a-[.z.]" */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2368 endc = 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2369 if (*regparse == '[')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2370 endc = get_coll_element(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2371 if (endc == 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2372 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 #ifdef FEAT_MBYTE
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2374 if (has_mbyte)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2375 endc = mb_ptr2char_adv(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2376 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 #endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2378 endc = *regparse++;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2379 }
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2380
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2381 /* Handle \o40, \x20 and \u20AC style sequences */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2382 if (endc == '\\' && !cpo_lit && !cpo_bsl)
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2383 endc = coll_get_char();
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2384
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 if (startc > endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 EMSG_RET_NULL(_(e_invrange));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 if (has_mbyte && ((*mb_char2len)(startc) > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 || (*mb_char2len)(endc) > 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 /* Limit to a range of 256 chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 if (endc > startc + 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 EMSG_RET_NULL(_(e_invrange));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 while (++startc <= endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 regmbc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 int alpha_only = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 /* for alphabetical range skip the gaps
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 * 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 if (isalpha(startc) && isalpha(endc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 alpha_only = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 while (++startc <= endc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 if (!alpha_only || isalpha(startc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 * Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 * accepts "\t", "\e", etc., but only when the 'l' flag in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 * 'cpoptions' is not included.
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2421 * Posix doesn't recognize backslash at all.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 else if (*regparse == '\\'
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2424 && !cpo_bsl
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 || (!cpo_lit
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 && vim_strchr(REGEXP_ABBR,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 regparse[1]) != NULL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 if (*regparse == 'n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 /* '\n' in range: also match NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 if (ret != JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 {
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2436 /* Using \n inside [^] does not change what
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2437 * matches. "[^\n]" is the same as ".". */
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2438 if (*ret == ANYOF)
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2439 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 *ret = ANYOF + ADD_NL;
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2441 *flagp |= HASNL;
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
2442 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 /* else: must have had a \n already */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 }
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2448 else if (*regparse == 'd'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2449 || *regparse == 'o'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2450 || *regparse == 'x'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2451 || *regparse == 'u'
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2452 || *regparse == 'U')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2453 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2454 startc = coll_get_char();
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2455 if (startc == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2456 regc(0x0a);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2457 else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2458 #ifdef FEAT_MBYTE
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2459 regmbc(startc);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2460 #else
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2461 regc(startc);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2462 #endif
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
2463 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 startc = backslash_trans(*regparse++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 else if (*regparse == '[')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 int c_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 int cu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2475 c_class = get_char_class(&regparse);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 startc = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 /* Characters assumed to be 8 bits! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 switch (c_class)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 case CLASS_NONE:
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2481 c_class = get_equi_class(&regparse);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2482 if (c_class != 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2483 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2484 /* produce equivalence class */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2485 reg_equi_class(c_class);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2486 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2487 else if ((c_class =
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2488 get_coll_element(&regparse)) != 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2489 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2490 /* produce a collating element */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2491 regmbc(c_class);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2492 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2493 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2494 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2495 /* literal '[', allow [[-x] as a range */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2496 startc = *regparse++;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2497 regc(startc);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2498 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2500 case CLASS_ALNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 if (isalnum(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 case CLASS_ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 if (isalpha(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 case CLASS_BLANK:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 regc(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 regc('\t');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 case CLASS_CNTRL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 if (iscntrl(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 case CLASS_DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 if (VIM_ISDIGIT(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 case CLASS_GRAPH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 if (isgraph(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 case CLASS_LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 for (cu = 1; cu <= 255; cu++)
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
2531 if (MB_ISLOWER(cu))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 case CLASS_PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 if (vim_isprintc(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 case CLASS_PUNCT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 if (ispunct(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 case CLASS_SPACE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 for (cu = 9; cu <= 13; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 regc(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 case CLASS_UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 for (cu = 1; cu <= 255; cu++)
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
2551 if (MB_ISUPPER(cu))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 case CLASS_XDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 for (cu = 1; cu <= 255; cu++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 if (vim_isxdigit(cu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 regc(cu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 case CLASS_TAB:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 regc('\t');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 case CLASS_RETURN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 regc('\r');
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_BACKSPACE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 regc('\b');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 case CLASS_ESCAPE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 regc('\033');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 /* produce a multibyte character, including any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 * following composing characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 startc = mb_ptr2char(regparse);
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
2583 len = (*mb_ptr2len)(regparse);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 if (enc_utf8 && utf_char2len(startc) != len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 startc = -1; /* composing chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 while (--len >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 regc(*regparse++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 startc = *regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 regc(startc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 prevchr_len = 1; /* last char was the ']' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 if (*regparse != ']')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 EMSG_RET_NULL(_(e_toomsbra)); /* Cannot happen? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 skipchr(); /* let's be friends with the lexer again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 }
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
2605 else if (reg_strict)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2606 EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 /* 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
2616 * before a multi and when it's a composing char. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2617 if (use_multibytecode(c))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2619 do_multibyte:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 ret = regnode(MULTIBYTECODE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 regmbc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 *flagp |= HASWIDTH | SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 ret = regnode(EXACTLY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 * Append characters as long as:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 * - there is no following multi, we then need the character in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 * front of it as a single character operand
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 * - not running into a Magic character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 * - "one_exactly" is not set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 * But always emit at least one character. Might be a Multi,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 * e.g., a "[" without matching "]".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 for (len = 0; c != NUL && (len == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 || (re_multi_type(peekchr()) == NOT_MULTI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 && !one_exactly
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 && !is_Magic(c))); ++len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 c = no_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 regmbc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2652 /* Need to get composing character too. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2655 l = utf_ptr2len(regparse);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2656 if (!UTF_COMPOSINGLIKE(regparse, regparse + l))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 break;
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2658 regmbc(utf_ptr2char(regparse));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2659 skipchr();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665 regc(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 c = getchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 ungetchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 regc(NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 *flagp |= HASWIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 if (len == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 *flagp |= SIMPLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2681 #ifdef FEAT_MBYTE
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2682 /*
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2683 * Return TRUE if MULTIBYTECODE should be used instead of EXACTLY for
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2684 * character "c".
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2685 */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2686 static int
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2687 use_multibytecode(c)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2688 int c;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2689 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2690 return has_mbyte && (*mb_char2len)(c) > 1
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2691 && (re_multi_type(peekchr()) != NOT_MULTI
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2692 || (enc_utf8 && utf_iscomposing(c)));
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2693 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2694 #endif
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
2695
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2697 * Emit a node.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 * Return pointer to generated code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 regnode(op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 char_u *ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 ret = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 if (ret == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 regsize += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 *regcode++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 *regcode++ = NUL; /* Null "next" pointer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 *regcode++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 * Emit (if appropriate) a byte of code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 regc(b)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 int b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 regsize++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 *regcode++ = b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 * Emit (if appropriate) a multi-byte character of code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2736 regmbc(c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2737 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 {
2974
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
2739 if (!has_mbyte && c > 0xff)
59130cd78dfc updated for version 7.3.259
Bram Moolenaar <bram@vim.org>
parents: 2904
diff changeset
2740 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 regsize += (*mb_char2len)(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 regcode += (*mb_char2bytes)(c, regcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2749 * Insert an operator in front of already-emitted operand
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 * Means relocating the operand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 reginsert(op, opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 char_u *place;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 regsize += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 src = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 regcode += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 dst = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 while (src > opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 *--dst = *--src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 place = opnd; /* Op node, where operand used to be. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 *place++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 *place = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2780 * Insert an operator in front of already-emitted operand.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 * The operator has the given limit values as operands. Also set next pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 * Means relocating the operand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 reginsert_limits(op, minval, maxval, opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 int op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 long minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 long maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 char_u *place;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 if (regcode == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 regsize += 11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 src = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 regcode += 11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 dst = regcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 while (src > opnd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 *--dst = *--src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 place = opnd; /* Op node, where operand used to be. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 *place++ = op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 *place++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 place = re_put_long(place, (long_u)minval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 place = re_put_long(place, (long_u)maxval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 regtail(opnd, place);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 * 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
2818 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 re_put_long(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 long_u val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 *p++ = (char_u) ((val >> 24) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 *p++ = (char_u) ((val >> 16) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826 *p++ = (char_u) ((val >> 8) & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 *p++ = (char_u) (val & 0377);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2829 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2832 * Set the next-pointer at the end of a node chain.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 regtail(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 char_u *val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 char_u *temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 int offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 if (p == JUST_CALC_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 /* Find last node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 scan = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 temp = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 if (temp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 scan = temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
2856 if (OP(scan) == BACK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 offset = (int)(scan - val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 offset = (int)(val - scan);
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2860 /* 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
2861 * 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
2862 * values in too many places. */
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2863 if (offset > 0xffff)
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2864 reg_toolong = TRUE;
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2865 else
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2866 {
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2867 *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2868 *(scan + 2) = (char_u) (offset & 0377);
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
2869 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2873 * Like regtail, on item after a BRANCH; nop if none.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 regoptail(p, val)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 char_u *val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 /* When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 if (p == NULL || p == JUST_CALC_SIZE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 || (OP(p) != BRANCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 regtail(OPERAND(p), val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 /*
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2889 * Functions for getting characters from the regexp input.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 static int at_start; /* True when on the first character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 static int prev_at_start; /* True when on the second character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2895 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2896 * Start parsing at "str".
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2897 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 initchr(str)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 regparse = str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 prevchr_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 curchr = prevprevchr = prevchr = nextchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 at_start = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2909 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2910 * Get the next character without advancing.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
2911 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 peekchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2915 static int after_slash = FALSE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2916
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 if (curchr == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 switch (curchr = regparse[0])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 case '[':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 /* magic when 'magic' is on */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 if (reg_magic >= MAGIC_ON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 curchr = Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 case '(':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 case ')':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 case '%':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 case '+':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 case '=':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 case '?':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 case '@':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 case '!':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 case '&':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 case '|':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 case '<':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 case '>':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 case '#': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 case '"': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 case '\'': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 case ',': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 case '-': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 case ':': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 case ';': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 case '`': /* future ext. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 case '/': /* Can't be used in / command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 /* magic only after "\v" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 if (reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 curchr = Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 case '*':
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2955 /* * is not magic as the very first character, eg "?*ptr", when
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2956 * after '^', eg "/^*ptr" and when after "\(", "\|", "\&". But
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2957 * "\(\*" is not magic, thus must be magic if "after_slash" */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2958 if (reg_magic >= MAGIC_ON
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2959 && !at_start
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2960 && !(prev_at_start && prevchr == Magic('^'))
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2961 && (after_slash
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2962 || (prevchr != Magic('(')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2963 && prevchr != Magic('&')
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
2964 && prevchr != Magic('|'))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965 curchr = Magic('*');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 case '^':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 /* '^' is only magic as the very first character and if it's after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 * "\(", "\|", "\&' or "\n" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 if (reg_magic >= MAGIC_OFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 && (at_start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 || reg_magic == MAGIC_ALL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 || prevchr == Magic('(')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 || prevchr == Magic('|')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 || prevchr == Magic('&')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 || prevchr == Magic('n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 || (no_Magic(prevchr) == '('
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 && prevprevchr == Magic('%'))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 curchr = Magic('^');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 at_start = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 case '$':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 /* '$' 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
2987 * either "\|", "\)", "\&", or "\n" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 if (reg_magic >= MAGIC_OFF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 char_u *p = regparse + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 /* ignore \c \C \m and \M after '$' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 || p[1] == 'm' || p[1] == 'M' || p[1] == 'Z'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 if (p[0] == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 || (p[0] == '\\'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 && (p[1] == '|' || p[1] == '&' || p[1] == ')'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999 || p[1] == 'n'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 || reg_magic == MAGIC_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 curchr = Magic('$');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 int c = regparse[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 curchr = '\\'; /* trailing '\' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010 else if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 vim_strchr(META, c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014 c <= '~' && META_flags[c]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 * META contains everything that may be magic sometimes,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 * except ^ and $ ("\^" and "\$" are only magic after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 * "\v"). We now fetch the next character and toggle its
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022 * magicness. Therefore, \ is so meta-magic that it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 * not in META.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3024 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025 curchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 prev_at_start = at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027 at_start = FALSE; /* be able to say "/\*ptr" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 ++regparse;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3029 ++after_slash;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030 peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 --regparse;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3032 --after_slash;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 curchr = toggle_Magic(curchr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 else if (vim_strchr(REGEXP_ABBR, c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 * Handle abbreviations, like "\t" for TAB -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 curchr = backslash_trans(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 curchr = toggle_Magic(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 * Next character can never be (made) magic?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 * Then backslashing it won't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 curchr = (*mb_ptr2char)(regparse + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 curchr = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 curchr = (*mb_ptr2char)(regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 return curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 * Eat one lexed character. Do this in a way that we can undo it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 skipchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 /* peekchr() eats a backslash, do the same here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 if (*regparse == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079 prevchr_len = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 prevchr_len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 if (regparse[prevchr_len] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 #ifdef FEAT_MBYTE
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
3085 if (enc_utf8)
1449
799c1db62b42 updated for version 7.1-164
vimboss
parents: 1347
diff changeset
3086 /* exclude composing chars that mb_ptr2len does include */
799c1db62b42 updated for version 7.1-164
vimboss
parents: 1347
diff changeset
3087 prevchr_len += utf_ptr2len(regparse + prevchr_len);
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
3088 else if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
3089 prevchr_len += (*mb_ptr2len)(regparse + prevchr_len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 ++prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094 regparse += prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095 prev_at_start = at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096 at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 prevprevchr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098 prevchr = curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 curchr = nextchr; /* use previously unget char, or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 nextchr = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 * Skip a character while keeping the value of prev_at_start for at_start.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105 * prevchr and prevprevchr are also kept.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 skipchr_keepstart()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 int as = prev_at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 int pr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 int prpr = prevprevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 at_start = as;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 prevchr = pr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 prevprevchr = prpr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3120 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3121 * 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
3122 * therefore we need a lexical analyzer.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3123 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 getchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127 int chr = peekchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 skipchr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 return chr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 }
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 * put character back. Works only once!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 ungetchr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 nextchr = curchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 curchr = prevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 prevchr = prevprevchr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 at_start = prev_at_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 prev_at_start = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 /* Backup regparse, so that it's at the same position as before the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 * getchr(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 regparse -= prevchr_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 /*
29
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3151 * Get and return the value of the hex string at the current position.
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3152 * Return -1 if there is no valid hex number.
ac33b7c03fac updated for version 7.0018
vimboss
parents: 24
diff changeset
3153 * The position is updated:
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3154 * blahblah\%x20asdf
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
3155 * before-^ ^-after
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3156 * The parameter controls the maximum number of input characters. This will be
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3157 * 2 when reading a \%x20 sequence and 4 when reading a \%u20AC sequence.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3158 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3159 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3160 gethexchrs(maxinputlen)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3161 int maxinputlen;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3162 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3163 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3164 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3165 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3166
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3167 for (i = 0; i < maxinputlen; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3168 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3169 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3170 if (!vim_isxdigit(c))
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3171 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3172 nr <<= 4;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3173 nr |= hex2nr(c);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3174 ++regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3175 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3176
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3177 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3178 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3179 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3180 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3181
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3182 /*
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3183 * get and return the value of the decimal string immediately after the
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3184 * current position. Return -1 for invalid. Consumes all digits.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3185 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3186 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3187 getdecchrs()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3188 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3189 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3190 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3191 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3192
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3193 for (i = 0; ; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3194 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3195 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3196 if (c < '0' || c > '9')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3197 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3198 nr *= 10;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3199 nr += c - '0';
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3200 ++regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3201 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3202
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3203 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3204 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3205 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3206 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3207
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3208 /*
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3209 * get and return the value of the octal string immediately after the current
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3210 * 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
3211 * numbers > 377 correctly (for example, 400 is treated as 40) and doesn't
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3212 * treat 8 or 9 as recognised characters. Position is updated:
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3213 * blahblah\%o210asdf
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
3214 * before-^ ^-after
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3215 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3216 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3217 getoctchrs()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3218 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3219 int nr = 0;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3220 int c;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3221 int i;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3222
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3223 for (i = 0; i < 3 && nr < 040; ++i)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3224 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3225 c = regparse[0];
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3226 if (c < '0' || c > '7')
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3227 break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3228 nr <<= 3;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3229 nr |= hex2nr(c);
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3230 ++regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3231 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3232
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3233 if (i == 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3234 return -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3235 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3236 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3237
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3238 /*
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3239 * Get a number after a backslash that is inside [].
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3240 * When nothing is recognized return a backslash.
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3241 */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3242 static int
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3243 coll_get_char()
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3244 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3245 int nr = -1;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3246
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3247 switch (*regparse++)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3248 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3249 case 'd': nr = getdecchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3250 case 'o': nr = getoctchrs(); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3251 case 'x': nr = gethexchrs(2); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3252 case 'u': nr = gethexchrs(4); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3253 case 'U': nr = gethexchrs(8); break;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3254 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3255 if (nr < 0)
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3256 {
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3257 /* If getting the number fails be backwards compatible: the character
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3258 * is a backslash. */
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3259 --regparse;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3260 nr = '\\';
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3261 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3262 return nr;
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3263 }
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3264
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 7
diff changeset
3265 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 * read_limits - Read two integers to be taken as a minimum and maximum.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267 * If the first character is '-', then the range is reversed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 * Should end with 'end'. If minval is missing, zero is default, if maxval is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269 * missing, a very big number is the default.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272 read_limits(minval, maxval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273 long *minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 long *maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276 int reverse = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 char_u *first_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 long tmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 if (*regparse == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 /* Starts with '-', so reverse the range later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 regparse++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 reverse = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 first_char = regparse;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287 *minval = getdigits(&regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 if (*regparse == ',') /* There is a comma */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3290 if (vim_isdigit(*++regparse))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3291 *maxval = getdigits(&regparse);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 *maxval = MAX_LIMIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 else if (VIM_ISDIGIT(*first_char))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 *maxval = *minval; /* It was \{n} or \{-n} */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 *maxval = MAX_LIMIT; /* It was \{} or \{-} */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 if (*regparse == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 regparse++; /* Allow either \{...} or \{...\} */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 153
diff changeset
3301 if (*regparse != '}')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 sprintf((char *)IObuff, _("E554: Syntax error in %s{...}"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304 reg_magic == MAGIC_ALL ? "" : "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 EMSG_RET_FAIL(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309 * 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
3310 * order otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3312 if ((!reverse && *minval > *maxval) || (reverse && *minval < *maxval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3314 tmp = *minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 *minval = *maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 *maxval = tmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3317 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3318 skipchr(); /* let's be friends with the lexer again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3319 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3320 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3322 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 * vim_regexec and friends
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327 * Global work variables for vim_regexec().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3330 /* The current match-position is remembered with these variables: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3331 static linenr_T reglnum; /* line number, relative to first line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3332 static char_u *regline; /* start of current line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3333 static char_u *reginput; /* current input, points into "regline" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3335 static int need_clear_subexpr; /* subexpressions still need to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3336 * cleared */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3337 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3338 static int need_clear_zsubexpr = FALSE; /* extmatch subexpressions
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3339 * still need to be cleared */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3341
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 * Structure used to save the current input state, when it needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 * restored after trying a match. Used by reg_save() and reg_restore().
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3345 * Also stores the length of "backpos".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349 union
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3350 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3351 char_u *ptr; /* reginput pointer, for single-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3352 lpos_T pos; /* reginput pos, for multi-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3353 } rs_u;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3354 int rs_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3355 } regsave_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3357 /* struct to save start/end pointer/position in for \(\) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3358 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3360 union
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3362 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3363 lpos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3364 } se_u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3365 } save_se_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3366
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3367 /* used for BEHIND and NOBEHIND matching */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3368 typedef struct regbehind_S
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3369 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3370 regsave_T save_after;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3371 regsave_T save_behind;
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
3372 int save_need_clear_subexpr;
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3373 save_se_T save_start[NSUBEXP];
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3374 save_se_T save_end[NSUBEXP];
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3375 } regbehind_T;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3376
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 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
3378 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
3379 static long regtry __ARGS((bt_regprog_T *prog, colnr_T col));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3380 static void cleanup_subexpr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3381 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3382 static void cleanup_zsubexpr __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3383 #endif
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3384 static void save_subexpr __ARGS((regbehind_T *bp));
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3385 static void restore_subexpr __ARGS((regbehind_T *bp));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 static void reg_nextline __ARGS((void));
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3387 static void reg_save __ARGS((regsave_T *save, garray_T *gap));
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
3388 static void reg_restore __ARGS((regsave_T *save, garray_T *gap));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 static int reg_save_equal __ARGS((regsave_T *save));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 static void save_se_multi __ARGS((save_se_T *savep, lpos_T *posp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 static void save_se_one __ARGS((save_se_T *savep, char_u **pp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393 /* Save the sub-expressions before attempting a match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 #define save_se(savep, posp, pp) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 REG_MULTI ? save_se_multi((savep), (posp)) : save_se_one((savep), (pp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 /* After a failed match restore the sub-expressions. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 #define restore_se(savep, posp, pp) { \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 if (REG_MULTI) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3400 *(posp) = (savep)->se_u.pos; \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3401 else \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3402 *(pp) = (savep)->se_u.ptr; }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3403
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3404 static int re_num_cmp __ARGS((long_u val, char_u *scan));
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
3405 static int regmatch __ARGS((char_u *prog));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3406 static int regrepeat __ARGS((char_u *p, long maxcount));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 int regnarrate = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 * Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 * 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
3415 * contains '\c' or '\C' the value is overruled.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3417 static int ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421 * Similar to ireg_ic, but only for 'combining' characters. Set with \Z flag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 * in the regexp. Defaults to false, always.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424 static int ireg_icombine;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 /*
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3428 * Copy of "rmm_maxcol": maximum column to search for a match. Zero when
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3429 * there is no maximum.
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3430 */
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 410
diff changeset
3431 static colnr_T ireg_maxcol;
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3432
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3433 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 * Sometimes need to save a copy of a line. Since alloc()/free() is very
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435 * 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
3436 * it's too small. It's freed in bt_regexec_both() when finished.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3437 */
1468
200b706675a5 updated for version 7.1-183
vimboss
parents: 1458
diff changeset
3438 static char_u *reg_tofree = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 static unsigned reg_tofreelen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442 * 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
3443 * 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
3444 * done:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 * single-line multi-line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 * reg_match &regmatch_T NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 * reg_mmatch NULL &regmmatch_T
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 * reg_startp reg_match->startp <invalid>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 * reg_endp reg_match->endp <invalid>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 * reg_startpos <invalid> reg_mmatch->startpos
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451 * reg_endpos <invalid> reg_mmatch->endpos
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 * 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
3453 * reg_buf curbuf buffer in which to search
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 * reg_firstlnum <invalid> first line in which to search
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 * reg_maxline 0 last line nr
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 * reg_line_lbr FALSE or TRUE FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 static regmatch_T *reg_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 static regmmatch_T *reg_mmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 static char_u **reg_startp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 static char_u **reg_endp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3462 static lpos_T *reg_startpos = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 static lpos_T *reg_endpos = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 static win_T *reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 static buf_T *reg_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 static linenr_T reg_firstlnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 static linenr_T reg_maxline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 static int reg_line_lbr; /* "\n" in string is line break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3470 /* Values for rs_state in regitem_T. */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3471 typedef enum regstate_E
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3472 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3473 RS_NOPEN = 0 /* NOPEN and NCLOSE */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3474 , RS_MOPEN /* MOPEN + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3475 , RS_MCLOSE /* MCLOSE + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3476 #ifdef FEAT_SYN_HL
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3477 , RS_ZOPEN /* ZOPEN + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3478 , RS_ZCLOSE /* ZCLOSE + [0-9] */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3479 #endif
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3480 , RS_BRANCH /* BRANCH */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3481 , RS_BRCPLX_MORE /* BRACE_COMPLEX and trying one more match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3482 , RS_BRCPLX_LONG /* BRACE_COMPLEX and trying longest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3483 , RS_BRCPLX_SHORT /* BRACE_COMPLEX and trying shortest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3484 , RS_NOMATCH /* NOMATCH */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3485 , RS_BEHIND1 /* BEHIND / NOBEHIND matching rest */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3486 , RS_BEHIND2 /* BEHIND / NOBEHIND matching behind part */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3487 , RS_STAR_LONG /* STAR/PLUS/BRACE_SIMPLE longest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3488 , RS_STAR_SHORT /* STAR/PLUS/BRACE_SIMPLE shortest match */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3489 } regstate_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3490
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3491 /*
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3492 * 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
3493 * what we are doing.
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3494 * 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
3495 * more things.
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3496 */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3497 typedef struct regitem_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3498 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3499 regstate_T rs_state; /* what we are doing, one of RS_ above */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3500 char_u *rs_scan; /* current node in program */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3501 union
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3502 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3503 save_se_T sesave;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3504 regsave_T regsave;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3505 } rs_un; /* room for saving reginput */
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
3506 short rs_no; /* submatch nr or BEHIND/NOBEHIND */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3507 } regitem_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3508
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3509 static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan));
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3510 static void regstack_pop __ARGS((char_u **scan));
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3511
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3512 /* used for STAR, PLUS and BRACE_SIMPLE matching */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3513 typedef struct regstar_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3514 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3515 int nextb; /* next byte */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3516 int nextb_ic; /* next byte reverse case */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3517 long count;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3518 long minval;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3519 long maxval;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3520 } regstar_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3521
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3522 /* 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
3523 * we made any progress since the last time. */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3524 typedef struct backpos_S
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3525 {
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3526 char_u *bp_scan; /* "scan" where BACK was encountered */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3527 regsave_T bp_pos; /* last input position */
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3528 } backpos_T;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3529
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3530 /*
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3531 * "regstack" and "backpos" are used by regmatch(). They are kept over calls
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3532 * to avoid invoking malloc() and free() often.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3533 * "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
3534 * or regbehind_T.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3535 * "backpos_T" is a table with backpos_T for BACK
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3536 */
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3537 static garray_T regstack = {0, 0, 0, 0, NULL};
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3538 static garray_T backpos = {0, 0, 0, 0, NULL};
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3539
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3540 /*
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3541 * Both for regstack and backpos tables we use the following strategy of
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3542 * allocation (to reduce malloc/free calls):
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3543 * - Initial size is fairly small.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3544 * - 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
3545 * that).
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3546 * - 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
3547 * 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
3548 * This makes it fast while not keeping a lot of memory allocated.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3549 * A three times speed increase was observed when using many simple patterns.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3550 */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3551 #define REGSTACK_INITIAL 2048
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3552 #define BACKPOS_INITIAL 64
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3553
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3554 #if defined(EXITFREE) || defined(PROTO)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3555 void
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3556 free_regexp_stuff()
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3557 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3558 ga_clear(&regstack);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3559 ga_clear(&backpos);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3560 vim_free(reg_tofree);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3561 vim_free(reg_prev_sub);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3562 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3563 #endif
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3564
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 * Get pointer to the line "lnum", which is relative to "reg_firstlnum".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 reg_getline(lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3571 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572 /* when looking behind for a match/no-match lnum is negative. But we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 * can't go before line 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 if (reg_firstlnum + lnum < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 return NULL;
482
6f8b578776ab updated for version 7.0131
vimboss
parents: 481
diff changeset
3576 if (lnum > reg_maxline)
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3577 /* Must have matched the "\n" in the last line. */
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3578 return (char_u *)"";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 return ml_get_buf(reg_buf, reg_firstlnum + lnum, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 static regsave_T behind_pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 static char_u *reg_startzp[NSUBEXP]; /* Workspace to mark beginning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 static char_u *reg_endzp[NSUBEXP]; /* and end of \z(...\) matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 static lpos_T reg_startzpos[NSUBEXP]; /* idem, beginning pos */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 static lpos_T reg_endzpos[NSUBEXP]; /* idem, end pos */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 /* TRUE if using multi-line regexp. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592 #define REG_MULTI (reg_match == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3594 static int bt_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3595
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3596 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3597 * Match a regexp against a string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3598 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3599 * Uses curbuf for line count and 'iskeyword'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3600 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3601 * Return TRUE if there is a match, FALSE if not.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3602 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3603 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3604 bt_regexec(rmp, line, col)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3605 regmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 char_u *line; /* string to match against */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 colnr_T col; /* column to start looking for match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 reg_match = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 reg_mmatch = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 reg_maxline = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 reg_line_lbr = FALSE;
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
3613 reg_buf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 reg_win = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615 ireg_ic = rmp->rm_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 ireg_icombine = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 #endif
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3619 ireg_maxcol = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3620 return (bt_regexec_both(line, col, NULL) != 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
3623 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
3624 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3625
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3626 static int bt_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3627
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 * Like vim_regexec(), but consider a "\n" in "line" to be a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3631 static int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3632 bt_regexec_nl(rmp, line, col)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3633 regmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634 char_u *line; /* string to match against */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 colnr_T col; /* column to start looking for match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 reg_match = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 reg_mmatch = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 reg_maxline = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 reg_line_lbr = TRUE;
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
3641 reg_buf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 reg_win = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 ireg_ic = rmp->rm_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 ireg_icombine = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 #endif
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3647 ireg_maxcol = 0;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3648 return (bt_regexec_both(line, col, NULL) != 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3652 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
3653
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655 * Match a regexp against multiple lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 * Uses curbuf for line count and 'iskeyword'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659 * Return zero if there is no match. Return number of lines contained in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3660 * match otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3662 static long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3663 bt_regexec_multi(rmp, win, buf, lnum, col, tm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3664 regmmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3665 win_T *win; /* window in which to search or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3666 buf_T *buf; /* buffer in which to search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3667 linenr_T lnum; /* nr of line to start looking for match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668 colnr_T col; /* column to start looking for match */
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3669 proftime_T *tm; /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3671 long r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3673 reg_match = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3674 reg_mmatch = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3675 reg_buf = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676 reg_win = win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 reg_firstlnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3678 reg_maxline = reg_buf->b_ml.ml_line_count - lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679 reg_line_lbr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680 ireg_ic = rmp->rmm_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 ireg_icombine = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 #endif
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3684 ireg_maxcol = rmp->rmm_maxcol;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3686 r = bt_regexec_both(NULL, col, tm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 return r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3691 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3692 * Match a regexp against a string ("line" points to the string) or multiple
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 * lines ("line" is NULL, use reg_getline()).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695 static long
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3696 bt_regexec_both(line, col, tm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 char_u *line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 colnr_T col; /* column to start looking for match */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1815
diff changeset
3699 proftime_T *tm UNUSED; /* timeout limit or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3701 bt_regprog_T *prog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702 char_u *s;
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3703 long retval = 0L;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3705 /* Create "regstack" and "backpos" if they are not allocated yet.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3706 * 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
3707 * 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
3708 * expressions. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3709 if (regstack.ga_data == NULL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3710 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3711 /* Use an item size of 1 byte, since we push different things
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3712 * onto the regstack. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3713 ga_init2(&regstack, 1, REGSTACK_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3714 ga_grow(&regstack, REGSTACK_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3715 regstack.ga_growsize = REGSTACK_INITIAL * 8;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3716 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3717
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3718 if (backpos.ga_data == NULL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3719 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3720 ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3721 ga_grow(&backpos, BACKPOS_INITIAL);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3722 backpos.ga_growsize = BACKPOS_INITIAL * 8;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3723 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3724
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3725 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3727 prog = (bt_regprog_T *)reg_mmatch->regprog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728 line = reg_getline((linenr_T)0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 reg_startpos = reg_mmatch->startpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3730 reg_endpos = reg_mmatch->endpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3733 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3734 prog = (bt_regprog_T *)reg_match->regprog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3735 reg_startp = reg_match->startp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 reg_endp = reg_match->endp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 /* Be paranoid... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3740 if (prog == NULL || line == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 EMSG(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3744 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3745
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3746 /* Check validity of program. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3747 if (prog_magic_wrong())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3748 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3750 /* If the start column is past the maximum column: no need to try. */
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3751 if (ireg_maxcol > 0 && col >= ireg_maxcol)
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3752 goto theend;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3753
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 /* If pattern contains "\c" or "\C": overrule value of ireg_ic */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 if (prog->regflags & RF_ICASE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 ireg_ic = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 else if (prog->regflags & RF_NOICASE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758 ireg_ic = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761 /* If pattern contains "\Z" overrule value of ireg_icombine */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 if (prog->regflags & RF_ICOMBINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 ireg_icombine = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766 /* If there is a "must appear" string, look for it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 if (prog->regmust != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 c = (*mb_ptr2char)(prog->regmust);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3776 c = *prog->regmust;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3777 s = line + col;
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3778
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3779 /*
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3780 * This is used very often, esp. for ":global". Use three versions of
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3781 * the loop to avoid overhead of conditions.
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3782 */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3783 if (!ireg_ic
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3784 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3785 && !has_mbyte
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3786 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3787 )
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3788 while ((s = vim_strbyte(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3789 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3790 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3791 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3792 ++s;
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3793 }
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3794 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3795 else if (!ireg_ic || (!enc_utf8 && mb_char2len(c) > 1))
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3796 while ((s = vim_strchr(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3797 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3798 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3799 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3800 mb_ptr_adv(s);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3801 }
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3802 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3803 else
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3804 while ((s = cstrchr(s, c)) != NULL)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3805 {
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3806 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3807 break; /* Found it. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3808 mb_ptr_adv(s);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3809 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3810 if (s == NULL) /* Not present. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3811 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3813
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3814 regline = line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3815 reglnum = 0;
2578
766918de9e3a updated for version 7.3.004
Bram Moolenaar <bram@vim.org>
parents: 2307
diff changeset
3816 reg_toolong = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3817
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3818 /* Simplest case: Anchored match need be tried only once. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3819 if (prog->reganch)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3820 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3821 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825 c = (*mb_ptr2char)(regline + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3826 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3827 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3828 c = regline[col];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3829 if (prog->regstart == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3830 || prog->regstart == c
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3831 || (ireg_ic && ((
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3832 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3833 (enc_utf8 && utf_fold(prog->regstart) == utf_fold(c)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3834 || (c < 255 && prog->regstart < 255 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3835 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
3836 MB_TOLOWER(prog->regstart) == MB_TOLOWER(c)))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3837 retval = regtry(prog, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3838 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3839 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3840 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3841 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3842 {
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3843 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3844 int tm_count = 0;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3845 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3846 /* Messy cases: unanchored match. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
3847 while (!got_int)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3848 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3849 if (prog->regstart != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3850 {
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3851 /* Skip until the char we know it must start with.
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3852 * Used often, do some work to avoid call overhead. */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3853 if (!ireg_ic
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3854 #ifdef FEAT_MBYTE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3855 && !has_mbyte
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3856 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3857 )
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3858 s = vim_strbyte(regline + col, prog->regstart);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3859 else
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
3860 s = cstrchr(regline + col, prog->regstart);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3861 if (s == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3862 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3863 retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3864 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3866 col = (int)(s - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3868
410
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3869 /* Check for maximum column to try. */
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3870 if (ireg_maxcol > 0 && col >= ireg_maxcol)
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3871 {
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3872 retval = 0;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3873 break;
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3874 }
c60ba877860b updated for version 7.0107
vimboss
parents: 359
diff changeset
3875
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3876 retval = regtry(prog, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3877 if (retval > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3878 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3880 /* if not currently on the first line, get it again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3881 if (reglnum != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3882 {
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
3883 reglnum = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3884 regline = reg_getline((linenr_T)0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3885 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3886 if (regline[col] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3887 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3888 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3889 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
3890 col += (*mb_ptr2len)(regline + col);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3891 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3892 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3893 ++col;
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3894 #ifdef FEAT_RELTIME
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3895 /* Check for timeout once in a twenty times to avoid overhead. */
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3896 if (tm != NULL && ++tm_count == 20)
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3897 {
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3898 tm_count = 0;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3899 if (profile_passed_limit(tm))
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3900 break;
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3901 }
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1520
diff changeset
3902 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3903 }
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 theend:
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3907 /* Free "reg_tofree" when it's a bit big.
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3908 * Free regstack and backpos if they are bigger than their initial size. */
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3909 if (reg_tofreelen > 400)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3910 {
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3911 vim_free(reg_tofree);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3912 reg_tofree = NULL;
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3913 }
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3914 if (regstack.ga_maxlen > REGSTACK_INITIAL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3915 ga_clear(&regstack);
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3916 if (backpos.ga_maxlen > BACKPOS_INITIAL)
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
3917 ga_clear(&backpos);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
3918
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3919 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3921
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3922 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3923 static reg_extmatch_T *make_extmatch __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3924
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3925 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3926 * Create a new extmatch and mark it as referenced once.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3927 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3928 static reg_extmatch_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3929 make_extmatch()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3930 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3931 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3932
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3933 em = (reg_extmatch_T *)alloc_clear((unsigned)sizeof(reg_extmatch_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3934 if (em != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3935 em->refcnt = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3936 return em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3937 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3938
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3939 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3940 * Add a reference to an extmatch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3941 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3942 reg_extmatch_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3943 ref_extmatch(em)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3944 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3945 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3946 if (em != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3947 em->refcnt++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3948 return em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3950
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3951 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3952 * Remove a reference to an extmatch. If there are no references left, free
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3953 * the info.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3954 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3955 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3956 unref_extmatch(em)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3957 reg_extmatch_T *em;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3959 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3961 if (em != NULL && --em->refcnt <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3962 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3963 for (i = 0; i < NSUBEXP; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3964 vim_free(em->matches[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3965 vim_free(em);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3966 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3967 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3968 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3970 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3971 * regtry - try match of "prog" with at regline["col"].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3972 * Returns 0 for failure, number of lines contained in the match otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3973 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3974 static long
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3975 regtry(prog, col)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
3976 bt_regprog_T *prog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3977 colnr_T col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3979 reginput = regline + col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3980 need_clear_subexpr = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3981 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3982 /* Clear the external match subpointers if necessary. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3983 if (prog->reghasz == REX_SET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3984 need_clear_zsubexpr = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3985 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3986
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3987 if (regmatch(prog->program + 1) == 0)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3988 return 0;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3989
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3990 cleanup_subexpr();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3991 if (REG_MULTI)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3992 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3993 if (reg_startpos[0].lnum < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3994 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3995 reg_startpos[0].lnum = 0;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3996 reg_startpos[0].col = col;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3997 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3998 if (reg_endpos[0].lnum < 0)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
3999 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4000 reg_endpos[0].lnum = reglnum;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4001 reg_endpos[0].col = (int)(reginput - regline);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4003 else
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4004 /* Use line number of "\ze". */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4005 reglnum = reg_endpos[0].lnum;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4006 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4007 else
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4008 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4009 if (reg_startp[0] == NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4010 reg_startp[0] = regline + col;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4011 if (reg_endp[0] == NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4012 reg_endp[0] = reginput;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4013 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4014 #ifdef FEAT_SYN_HL
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4015 /* Package any found \z(...\) matches for export. Default is none. */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4016 unref_extmatch(re_extmatch_out);
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4017 re_extmatch_out = NULL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4018
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4019 if (prog->reghasz == REX_SET)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4020 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4021 int i;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4022
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4023 cleanup_zsubexpr();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4024 re_extmatch_out = make_extmatch();
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4025 for (i = 0; i < NSUBEXP; i++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4026 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4027 if (REG_MULTI)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4028 {
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4029 /* Only accept single line matches. */
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4030 if (reg_startzpos[i].lnum >= 0
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4031 && reg_endzpos[i].lnum == reg_startzpos[i].lnum)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4032 re_extmatch_out->matches[i] =
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4033 vim_strnsave(reg_getline(reg_startzpos[i].lnum)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4034 + reg_startzpos[i].col,
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4035 reg_endzpos[i].col - reg_startzpos[i].col);
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4036 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4037 else
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4038 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4039 if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4040 re_extmatch_out->matches[i] =
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4041 vim_strnsave(reg_startzp[i],
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4042 (int)(reg_endzp[i] - reg_startzp[i]));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4043 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4044 }
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4045 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4046 #endif
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
4047 return 1 + reglnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4049
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4050 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4051 static int reg_prev_class __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4052
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4053 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4054 * Get class of previous character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4055 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4056 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4057 reg_prev_class()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4058 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4059 if (reginput > regline)
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4060 return mb_get_class_buf(reginput - 1
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4061 - (*mb_head_off)(regline, reginput - 1), reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4062 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4063 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4064
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4065 #endif
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
4066 #define ADVANCE_REGINPUT() mb_ptr_adv(reginput)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4067
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4068 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 * The arguments from BRACE_LIMITS are stored here. They are actually local
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4070 * to regmatch(), but they are here to reduce the amount of stack space used
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4071 * (it can be called recursively many times).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4072 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 static long bl_minval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 static long bl_maxval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 * regmatch - main matching routine
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4078 *
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4079 * Conceptually the strategy is simple: Check to see whether the current node
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4080 * 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
4081 * matches, and then act accordingly. In practice we make some effort to
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4082 * avoid using the regstack, in particular by going through "ordinary" nodes
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4083 * (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
4084 * loop.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4085 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086 * Returns TRUE when there is a match. Leaves reginput and reglnum just after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4087 * the last matched character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4088 * Returns FALSE when there is no match. Leaves reginput and reglnum in an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4089 * undefined state!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4090 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4091 static int
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4092 regmatch(scan)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4093 char_u *scan; /* Current node. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4094 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4095 char_u *next; /* Next node. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4096 int op;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4097 int c;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4098 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4099 int no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4100 int status; /* one of the RA_ values: */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4101 #define RA_FAIL 1 /* something failed, abort */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4102 #define RA_CONT 2 /* continue in inner loop */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4103 #define RA_BREAK 3 /* break inner loop */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4104 #define RA_MATCH 4 /* successful match */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4105 #define RA_NOMATCH 5 /* didn't match */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4106
1520
cd6175cc27d9 updated for version 7.1-235
vimboss
parents: 1468
diff changeset
4107 /* 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
4108 * bt_regexec_both() to reduce malloc()/free() calls. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4109 regstack.ga_len = 0;
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4110 backpos.ga_len = 0;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4111
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4112 /*
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4113 * Repeat until "regstack" is empty.
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4114 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4115 for (;;)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4116 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4117 /* Some patterns may cause a long time to match, even though they are not
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 * illegal. E.g., "\([a-z]\+\)\+Q". Allow breaking them with CTRL-C. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 fast_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4122 if (scan != NULL && regnarrate)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4124 mch_errmsg((char *)regprop(scan));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125 mch_errmsg("(\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4127 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4128
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4129 /*
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4130 * Repeat for items that can be matched sequentially, without using the
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4131 * regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4132 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4133 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4134 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4135 if (got_int || scan == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4136 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4137 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4138 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4139 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4140 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4141
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 if (regnarrate)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4145 mch_errmsg((char *)regprop(scan));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 mch_errmsg("...\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 # ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4148 if (re_extmatch_in != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4149 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4150 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4152 mch_errmsg(_("External submatches:\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4153 for (i = 0; i < NSUBEXP; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4154 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4155 mch_errmsg(" \"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4156 if (re_extmatch_in->matches[i] != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
4157 mch_errmsg((char *)re_extmatch_in->matches[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4158 mch_errmsg("\"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4159 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 next = regnext(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 op = OP(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167 /* Check for character class with NL added. */
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
4168 if (!reg_line_lbr && WITH_NL(op) && REG_MULTI
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
4169 && *reginput == NUL && reglnum <= reg_maxline)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4173 else if (reg_line_lbr && WITH_NL(op) && *reginput == '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4177 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4178 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 if (WITH_NL(op))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4180 op -= ADD_NL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4181 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4182 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4183 c = (*mb_ptr2char)(reginput);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4184 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4185 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4186 c = *reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4187 switch (op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4189 case BOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190 if (reginput != regline)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4191 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4192 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4194 case EOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4195 if (c != NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4196 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4197 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4198
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4199 case RE_BOF:
1458
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4200 /* 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
4201 * 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
4202 * didn't start at the first line of the buffer. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4203 if (reglnum != 0 || reginput != regline
1458
8a6c67218fcc updated for version 7.1-173
vimboss
parents: 1449
diff changeset
4204 || (REG_MULTI && reg_firstlnum > 1))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4205 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4206 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4207
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4208 case RE_EOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4209 if (reglnum != reg_maxline || c != NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4210 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4211 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4213 case CURSOR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4214 /* Check if the buffer is in a window and compare the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4215 * reg_win->w_cursor position to the match position. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4216 if (reg_win == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217 || (reglnum + reg_firstlnum != reg_win->w_cursor.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 || ((colnr_T)(reginput - regline) != reg_win->w_cursor.col))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4219 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4221
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4222 case RE_MARK:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4223 /* Compare the mark position to the match position. NOTE: Always
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4224 * uses the current buffer. */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4225 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4226 int mark = OPERAND(scan)[0];
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4227 int cmp = OPERAND(scan)[1];
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4228 pos_T *pos;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4229
4043
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4230 pos = getmark_buf(reg_buf, mark, FALSE);
1148
e1dc2698121c updated for version 7.1a
vimboss
parents: 1018
diff changeset
4231 if (pos == NULL /* mark doesn't exist */
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4232 || pos->lnum <= 0 /* mark isn't set (in curbuf) */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4233 || (pos->lnum == reglnum + reg_firstlnum
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4234 ? (pos->col == (colnr_T)(reginput - regline)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4235 ? (cmp == '<' || cmp == '>')
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4236 : (pos->col < (colnr_T)(reginput - regline)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4237 ? cmp != '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4238 : cmp != '<'))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4239 : (pos->lnum < reglnum + reg_firstlnum
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4240 ? cmp != '>'
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4241 : cmp != '<')))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4242 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4243 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4244 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4245
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4246 case RE_VISUAL:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4247 #ifdef FEAT_VISUAL
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4248 /* Check if the buffer is the current buffer. and whether the
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4249 * position is inside the Visual area. */
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4250 if (reg_buf != curbuf || VIsual.lnum == 0)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4251 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4252 else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4253 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4254 pos_T top, bot;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4255 linenr_T lnum;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4256 colnr_T col;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4257 win_T *wp = reg_win == NULL ? curwin : reg_win;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4258 int mode;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4259
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4260 if (VIsual_active)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4261 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4262 if (lt(VIsual, wp->w_cursor))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4263 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4264 top = VIsual;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4265 bot = wp->w_cursor;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4266 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4267 else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4268 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4269 top = wp->w_cursor;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4270 bot = VIsual;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4271 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4272 mode = VIsual_mode;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4273 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4274 else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4275 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4276 if (lt(curbuf->b_visual.vi_start, curbuf->b_visual.vi_end))
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
4277 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4278 top = curbuf->b_visual.vi_start;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4279 bot = curbuf->b_visual.vi_end;
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
4280 }
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
4281 else
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
4282 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4283 top = curbuf->b_visual.vi_end;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4284 bot = curbuf->b_visual.vi_start;
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
4285 }
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
4286 mode = curbuf->b_visual.vi_mode;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4287 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4288 lnum = reglnum + reg_firstlnum;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4289 col = (colnr_T)(reginput - regline);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4290 if (lnum < top.lnum || lnum > bot.lnum)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4291 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4292 else if (mode == 'v')
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4293 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4294 if ((lnum == top.lnum && col < top.col)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4295 || (lnum == bot.lnum
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4296 && col >= bot.col + (*p_sel != 'e')))
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4297 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4298 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4299 else if (mode == Ctrl_V)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4300 {
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4301 colnr_T start, end;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4302 colnr_T start2, end2;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 856
diff changeset
4303 colnr_T cols;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4304
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4305 getvvcol(wp, &top, &start, NULL, &end);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4306 getvvcol(wp, &bot, &start2, NULL, &end2);
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4307 if (start2 < start)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4308 start = start2;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4309 if (end2 > end)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4310 end = end2;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4311 if (top.col == MAXCOL || bot.col == MAXCOL)
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4312 end = MAXCOL;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 856
diff changeset
4313 cols = win_linetabsize(wp,
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4314 regline, (colnr_T)(reginput - regline));
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 856
diff changeset
4315 if (cols < start || cols > end - (*p_sel == 'e'))
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4316 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4317 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4318 }
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4319 #else
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4320 status = RA_NOMATCH;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4321 #endif
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4322 break;
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
4323
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4324 case RE_LNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4325 if (!REG_MULTI || !re_num_cmp((long_u)(reglnum + reg_firstlnum),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4326 scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4327 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4328 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4330 case RE_COL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4331 if (!re_num_cmp((long_u)(reginput - regline) + 1, scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4332 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4333 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4335 case RE_VCOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4336 if (!re_num_cmp((long_u)win_linetabsize(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337 reg_win == NULL ? curwin : reg_win,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4338 regline, (colnr_T)(reginput - regline)) + 1, scan))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4339 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 case BOW: /* \<word; reginput points to w */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 if (c == NUL) /* Can't match at end of line */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4344 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4345 #ifdef FEAT_MBYTE
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4346 else if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4348 int this_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4350 /* 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
4351 this_class = mb_get_class_buf(reginput, reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4352 if (this_class <= 1)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4353 status = RA_NOMATCH; /* not on a word at all */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4354 else if (reg_prev_class() == this_class)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4355 status = RA_NOMATCH; /* previous char is in same word */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4357 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4358 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359 {
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
4360 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
4361 && vim_iswordc_buf(reginput[-1], reg_buf)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4362 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4363 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4364 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4365
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4366 case EOW: /* word\>; reginput points after d */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4367 if (reginput == regline) /* Can't match at start of line */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4368 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4369 #ifdef FEAT_MBYTE
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4370 else if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4372 int this_class, prev_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4373
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4374 /* 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
4375 this_class = mb_get_class_buf(reginput, reg_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4376 prev_class = reg_prev_class();
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4377 if (this_class == prev_class
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4378 || prev_class == 0 || prev_class == 1)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4379 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4380 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4381 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4382 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4383 {
4043
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4384 if (!vim_iswordc_buf(reginput[-1], reg_buf)
80b041b994d1 updated for version 7.3.776
Bram Moolenaar <bram@vim.org>
parents: 2974
diff changeset
4385 || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf)))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4386 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4387 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4388 break; /* Matched with EOW */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4389
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4390 case ANY:
4084
2c12c4e2fae8 updated for version 7.3.796
Bram Moolenaar <bram@vim.org>
parents: 4069
diff changeset
4391 /* ANY does not match new lines. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4392 if (c == NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4393 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4394 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4395 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4396 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4397
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4398 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4399 if (!vim_isIDc(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4400 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4401 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4402 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4403 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4404
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4405 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4406 if (VIM_ISDIGIT(*reginput) || !vim_isIDc(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4407 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4408 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4409 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4410 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4412 case KWORD:
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4413 if (!vim_iswordp_buf(reginput, reg_buf))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4414 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4415 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4416 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4417 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4419 case SKWORD:
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
4420 if (VIM_ISDIGIT(*reginput) || !vim_iswordp_buf(reginput, reg_buf))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4421 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4422 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4423 ADVANCE_REGINPUT();
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 FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4427 if (!vim_isfilec(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4428 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4429 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4430 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4431 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4433 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4434 if (VIM_ISDIGIT(*reginput) || !vim_isfilec(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4435 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4436 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4437 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4438 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4439
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4440 case PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4441 if (ptr2cells(reginput) != 1)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4442 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4443 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4444 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4445 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4447 case SPRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4448 if (VIM_ISDIGIT(*reginput) || ptr2cells(reginput) != 1)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4449 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4450 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4451 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4452 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4453
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4454 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4455 if (!vim_iswhite(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4456 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4457 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4458 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4459 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4461 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4462 if (c == NUL || vim_iswhite(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4463 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4464 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4465 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4466 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4467
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4468 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4469 if (!ri_digit(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4470 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4471 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4472 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4473 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4474
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4475 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4476 if (c == NUL || ri_digit(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4477 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4478 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4479 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4480 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4481
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4482 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4483 if (!ri_hex(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4484 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4485 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4486 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4487 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4488
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4489 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4490 if (c == NUL || ri_hex(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4491 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4492 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4493 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4494 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4495
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4496 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4497 if (!ri_octal(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4498 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4499 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4500 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4501 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4502
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4503 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4504 if (c == NUL || ri_octal(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4505 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4506 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4507 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4508 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4510 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4511 if (!ri_word(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4512 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4513 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4514 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4515 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4516
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4517 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4518 if (c == NUL || ri_word(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4519 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4520 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4521 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4522 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4523
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4524 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4525 if (!ri_head(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4526 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4527 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4528 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4529 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4530
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4531 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4532 if (c == NUL || ri_head(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4533 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4534 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4535 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4536 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4537
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4538 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4539 if (!ri_alpha(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4540 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4541 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4542 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4543 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4544
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4545 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4546 if (c == NUL || ri_alpha(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4547 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4548 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4549 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4550 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4552 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4553 if (!ri_lower(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4554 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4555 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4556 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4557 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4558
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4559 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4560 if (c == NUL || ri_lower(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4561 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4562 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4563 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4564 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4565
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4566 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4567 if (!ri_upper(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4568 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4569 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4570 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4571 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4572
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4573 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4574 if (c == NUL || ri_upper(c))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4575 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4576 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4577 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4578 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4580 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4581 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4582 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4583 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4585 opnd = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4586 /* Inline the first byte, for speed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4587 if (*opnd != *reginput
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4588 && (!ireg_ic || (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4589 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4590 !enc_utf8 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4591 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
4592 MB_TOLOWER(*opnd) != MB_TOLOWER(*reginput))))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4593 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4594 else if (*opnd == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4595 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4596 /* match empty string always works; happens when "~" is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4597 * empty. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4598 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4599 else if (opnd[1] == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4600 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4601 && !(enc_utf8 && ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4602 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4603 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4604 ++reginput; /* matched a single char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4605 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4606 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4607 len = (int)STRLEN(opnd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4608 /* Need to match first byte again for multi-byte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4609 if (cstrncmp(opnd, reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4610 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4611 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4612 /* Check for following composing character. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4613 else if (enc_utf8
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4614 && UTF_COMPOSINGLIKE(reginput, reginput + len))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4615 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4616 /* raaron: This code makes a composing character get
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4617 * ignored, which is the correct behavior (sometimes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4618 * for voweled Hebrew texts. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4619 if (!ireg_icombine)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4620 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4621 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4622 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4623 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4624 reginput += len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4625 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4626 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4627 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4629 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4630 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4631 if (c == NUL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4632 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4633 else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4634 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4635 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4636 ADVANCE_REGINPUT();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4637 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4638
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4639 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4640 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4641 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4643 int i, len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4644 char_u *opnd;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 856
diff changeset
4645 int opndc = 0, inpc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4646
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4647 opnd = OPERAND(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4648 /* Safety check (just in case 'encoding' was changed since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4649 * compiling the program). */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
4650 if ((len = (*mb_ptr2len)(opnd)) < 2)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4651 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4652 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4653 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4654 }
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4655 if (enc_utf8)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4656 opndc = mb_ptr2char(opnd);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4657 if (enc_utf8 && utf_iscomposing(opndc))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4658 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4659 /* When only a composing char is given match at any
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4660 * position where that composing char appears. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4661 status = RA_NOMATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4662 for (i = 0; reginput[i] != NUL; i += utf_char2len(inpc))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4663 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4664 inpc = mb_ptr2char(reginput + i);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4665 if (!utf_iscomposing(inpc))
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4666 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4667 if (i > 0)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4668 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4669 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4670 else if (opndc == inpc)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4671 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4672 /* Include all following composing chars. */
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4673 len = i + mb_ptr2len(reginput + i);
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4674 status = RA_MATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4675 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4676 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4677 }
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4678 }
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4679 else
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4680 for (i = 0; i < len; ++i)
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4681 if (opnd[i] != reginput[i])
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4682 {
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4683 status = RA_NOMATCH;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4684 break;
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
4685 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4686 reginput += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4687 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4688 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4689 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4690 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4691 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4692
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4693 case NOTHING:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4694 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4695
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4696 case BACK:
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4697 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4698 int i;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4699 backpos_T *bp;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4700
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4701 /*
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4702 * 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
4703 * looping without matching any input. The second and later
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4704 * times a BACK is encountered it fails if the input is still
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4705 * at the same position as the previous time.
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4706 * The positions are stored in "backpos" and found by the
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4707 * current value of "scan", the position in the RE program.
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4708 */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4709 bp = (backpos_T *)backpos.ga_data;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4710 for (i = 0; i < backpos.ga_len; ++i)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4711 if (bp[i].bp_scan == scan)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4712 break;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4713 if (i == backpos.ga_len)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4714 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4715 /* First time at this BACK, make room to store the pos. */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4716 if (ga_grow(&backpos, 1) == FAIL)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4717 status = RA_FAIL;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4718 else
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4719 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4720 /* get "ga_data" again, it may have changed */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4721 bp = (backpos_T *)backpos.ga_data;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4722 bp[i].bp_scan = scan;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4723 ++backpos.ga_len;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4724 }
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4725 }
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4726 else if (reg_save_equal(&bp[i].bp_pos))
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4727 /* Still at same position as last time, fail. */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4728 status = RA_NOMATCH;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4729
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4730 if (status != RA_FAIL && status != RA_NOMATCH)
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4731 reg_save(&bp[i].bp_pos, &backpos);
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
4732 }
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
4733 break;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
4734
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4735 case MOPEN + 0: /* Match start: \zs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4736 case MOPEN + 1: /* \( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4737 case MOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4738 case MOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4739 case MOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4740 case MOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4741 case MOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4742 case MOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4743 case MOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4744 case MOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4746 no = op - MOPEN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4747 cleanup_subexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4748 rp = regstack_push(RS_MOPEN, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4749 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4750 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4751 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4752 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4753 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4754 save_se(&rp->rs_un.sesave, &reg_startpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4755 &reg_startp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4756 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4757 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4758 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4759 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4761 case NOPEN: /* \%( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4762 case NCLOSE: /* \) after \%( */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4763 if (regstack_push(RS_NOPEN, scan) == NULL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4764 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4765 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4766 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4767
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4768 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4769 case ZOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4770 case ZOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4771 case ZOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4772 case ZOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4773 case ZOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4774 case ZOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4775 case ZOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4776 case ZOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4777 case ZOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4778 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4779 no = op - ZOPEN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4780 cleanup_zsubexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4781 rp = regstack_push(RS_ZOPEN, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4782 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4783 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4784 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4785 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4786 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4787 save_se(&rp->rs_un.sesave, &reg_startzpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4788 &reg_startzp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4789 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4790 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4791 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4792 break;
7
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 MCLOSE + 0: /* Match end: \ze */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4796 case MCLOSE + 1: /* \) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4797 case MCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4798 case MCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4799 case MCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4800 case MCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4801 case MCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4802 case MCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4803 case MCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4804 case MCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4805 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4806 no = op - MCLOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4807 cleanup_subexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4808 rp = regstack_push(RS_MCLOSE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4809 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4810 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4811 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4812 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4813 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4814 save_se(&rp->rs_un.sesave, &reg_endpos[no], &reg_endp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4815 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4816 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4817 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4818 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4820 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4821 case ZCLOSE + 1: /* \) after \z( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4822 case ZCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4823 case ZCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4824 case ZCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4825 case ZCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4826 case ZCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4827 case ZCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4828 case ZCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4829 case ZCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4830 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4831 no = op - ZCLOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 cleanup_zsubexpr();
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
4833 rp = regstack_push(RS_ZCLOSE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4834 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4835 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4836 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4837 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4838 rp->rs_no = no;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4839 save_se(&rp->rs_un.sesave, &reg_endzpos[no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4840 &reg_endzp[no]);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4841 /* We simply continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4842 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4843 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4844 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4846
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847 case BACKREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 case BACKREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 case BACKREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4850 case BACKREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4851 case BACKREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 case BACKREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4853 case BACKREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4854 case BACKREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4855 case BACKREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4856 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4857 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4858 linenr_T clnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4859 colnr_T ccol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4861
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4862 no = op - BACKREF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863 cleanup_subexpr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 if (!REG_MULTI) /* Single-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4865 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
4866 if (reg_startp[no] == NULL || reg_endp[no] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4867 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4868 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4871 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4873 /* Compare current input with back-ref in the same
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 * line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4875 len = (int)(reg_endp[no] - reg_startp[no]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4876 if (cstrncmp(reg_startp[no], reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4877 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4878 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4880 else /* Multi-line regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
4882 if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4883 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4885 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4886 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4887 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4889 if (reg_startpos[no].lnum == reglnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 && reg_endpos[no].lnum == reglnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4891 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4892 /* Compare back-ref within the current line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4893 len = reg_endpos[no].col - reg_startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4894 if (cstrncmp(regline + reg_startpos[no].col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4895 reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4896 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4898 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4899 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4900 /* Messy situation: Need to compare between two
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 * lines. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 ccol = reg_startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 clnum = reg_startpos[no].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 /* Since getting one line may invalidate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 * the other, need to make copy. Slow! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 if (regline != reg_tofree)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4910 len = (int)STRLEN(regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4911 if (reg_tofree == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4912 || len >= (int)reg_tofreelen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4914 len += 50; /* get some extra */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4915 vim_free(reg_tofree);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4916 reg_tofree = alloc(len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4917 if (reg_tofree == NULL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4918 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4919 status = RA_FAIL; /* outof memory!*/
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4920 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4921 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 reg_tofreelen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4923 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 STRCPY(reg_tofree, regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4925 reginput = reg_tofree
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4926 + (reginput - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4927 regline = reg_tofree;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 /* Get the line to compare with. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 p = reg_getline(clnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4932 if (clnum == reg_endpos[no].lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4933 len = reg_endpos[no].col - ccol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4934 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4935 len = (int)STRLEN(p + ccol);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4937 if (cstrncmp(p + ccol, reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4938 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4939 status = RA_NOMATCH; /* doesn't match */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4940 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4941 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4942 if (clnum == reg_endpos[no].lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4943 break; /* match and at end! */
481
66080ac5dab7 updated for version 7.0130
vimboss
parents: 474
diff changeset
4944 if (reglnum >= reg_maxline)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4945 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4946 status = RA_NOMATCH; /* text too short */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4947 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4948 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 /* Advance to next line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 ++clnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 ccol = 0;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4954 if (got_int)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4955 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4956 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4957 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4958 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4959 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 /* found a match! Note that regline may now point
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4962 * to a copy of the line, that should not matter. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4965 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967 /* Matched the backref, skip over it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4968 reginput += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4970 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4971
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4972 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4973 case ZREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4974 case ZREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4975 case ZREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4976 case ZREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977 case ZREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 case ZREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 case ZREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 case ZREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4981 case ZREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4982 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4985 cleanup_zsubexpr();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4986 no = op - ZREF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4987 if (re_extmatch_in != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4988 && re_extmatch_in->matches[no] != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4989 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4990 len = (int)STRLEN(re_extmatch_in->matches[no]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4991 if (cstrncmp(re_extmatch_in->matches[no],
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 reginput, &len) != 0)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4993 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4994 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
4995 reginput += len;
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 /* Backref was not set: Match an empty string. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5000 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5001 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5002 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5003 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5004
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5005 case BRANCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5006 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5007 if (OP(next) != BRANCH) /* No choice. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5008 next = OPERAND(scan); /* Avoid recursion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5009 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5010 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5011 rp = regstack_push(RS_BRANCH, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5012 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5013 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5014 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5015 status = RA_BREAK; /* rest is below */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5017 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5018 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5019
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5020 case BRACE_LIMITS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5021 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5022 if (OP(next) == BRACE_SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5023 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5024 bl_minval = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5025 bl_maxval = OPERAND_MAX(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5026 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5027 else if (OP(next) >= BRACE_COMPLEX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 && OP(next) < BRACE_COMPLEX + 10)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 no = OP(next) - BRACE_COMPLEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031 brace_min[no] = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5032 brace_max[no] = OPERAND_MAX(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 brace_count[no] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5034 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5035 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5037 EMSG(_(e_internal)); /* Shouldn't happen */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5038 status = RA_FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5039 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5040 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5041 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5043 case BRACE_COMPLEX + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5044 case BRACE_COMPLEX + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5045 case BRACE_COMPLEX + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5046 case BRACE_COMPLEX + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5047 case BRACE_COMPLEX + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5048 case BRACE_COMPLEX + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5049 case BRACE_COMPLEX + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5050 case BRACE_COMPLEX + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5051 case BRACE_COMPLEX + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5052 case BRACE_COMPLEX + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5054 no = op - BRACE_COMPLEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5055 ++brace_count[no];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5056
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5057 /* If not matched enough times yet, try one more */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5058 if (brace_count[no] <= (brace_min[no] <= brace_max[no]
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5059 ? brace_min[no] : brace_max[no]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5060 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5061 rp = regstack_push(RS_BRCPLX_MORE, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5062 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5063 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5064 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5065 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5066 rp->rs_no = no;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5067 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5068 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5069 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5070 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5071 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 /* If matched enough times, may try matching some more */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075 if (brace_min[no] <= brace_max[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 /* Range is the normal way around, use longest match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5078 if (brace_count[no] <= brace_max[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5079 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5080 rp = regstack_push(RS_BRCPLX_LONG, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5081 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5082 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5083 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5084 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5085 rp->rs_no = no;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5086 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5087 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5088 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5089 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5091 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5092 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5094 /* Range is backwards, use shortest match first */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5095 if (brace_count[no] <= brace_min[no])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5097 rp = regstack_push(RS_BRCPLX_SHORT, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5098 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5099 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5100 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5101 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5102 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5103 /* We continue and handle the result when done. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5104 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5105 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5106 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5107 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5108 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5109
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5110 case BRACE_SIMPLE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5111 case STAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5112 case PLUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5113 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5114 regstar_T rst;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5116 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5117 * Lookahead to avoid useless match attempts when we know
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5118 * what character comes next.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5119 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5120 if (OP(next) == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5121 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5122 rst.nextb = *OPERAND(next);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5123 if (ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5124 {
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5125 if (MB_ISUPPER(rst.nextb))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5126 rst.nextb_ic = MB_TOLOWER(rst.nextb);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5127 else
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5128 rst.nextb_ic = MB_TOUPPER(rst.nextb);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5130 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5131 rst.nextb_ic = rst.nextb;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5132 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5133 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5134 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5135 rst.nextb = NUL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5136 rst.nextb_ic = NUL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5137 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5138 if (op != BRACE_SIMPLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5139 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5140 rst.minval = (op == STAR) ? 0 : 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5141 rst.maxval = MAX_LIMIT;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5142 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5143 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5144 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5145 rst.minval = bl_minval;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5146 rst.maxval = bl_maxval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5147 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5148
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5149 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5150 * When maxval > minval, try matching as much as possible, up
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5151 * to maxval. When maxval < minval, try matching at least the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5152 * minimal number (since the range is backwards, that's also
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5153 * maxval!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5154 */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5155 rst.count = regrepeat(OPERAND(scan), rst.maxval);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5156 if (got_int)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5157 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5158 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5159 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5160 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5161 if (rst.minval <= rst.maxval
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5162 ? rst.count >= rst.minval : rst.count >= rst.maxval)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5164 /* It could match. Prepare for trying to match what
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5165 * follows. The code is below. Parameters are stored in
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5166 * a regstar_T on the regstack. */
212
e39657bbbb98 updated for version 7.0060
vimboss
parents: 195
diff changeset
5167 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5168 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5169 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5170 status = RA_FAIL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5171 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5172 else if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5173 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5174 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5175 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5176 regstack.ga_len += sizeof(regstar_T);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5177 rp = regstack_push(rst.minval <= rst.maxval
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5178 ? RS_STAR_LONG : RS_STAR_SHORT, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5179 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5180 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5181 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5182 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5183 *(((regstar_T *)rp) - 1) = rst;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5184 status = RA_BREAK; /* skip the restore bits */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5188 else
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5189 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5190
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5192 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5194 case NOMATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5195 case MATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196 case SUBPAT:
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5197 rp = regstack_push(RS_NOMATCH, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5198 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5199 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5200 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5202 rp->rs_no = op;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5203 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5204 next = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5205 /* We continue and handle the result when done. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5206 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5207 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5208
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5209 case BEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 case NOBEHIND:
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5211 /* Need a bit of room to store extra positions. */
212
e39657bbbb98 updated for version 7.0060
vimboss
parents: 195
diff changeset
5212 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5213 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5214 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5215 status = RA_FAIL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5216 }
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5217 else if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5218 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5219 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5220 {
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5221 regstack.ga_len += sizeof(regbehind_T);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5222 rp = regstack_push(RS_BEHIND1, scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5223 if (rp == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5224 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5225 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5226 {
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5227 /* Need to save the subexpr to be able to restore them
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5228 * when there is a match but we don't use it. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5229 save_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5230
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5231 rp->rs_no = op;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5232 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5233 /* First try if what follows matches. If it does then we
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5234 * check the behind match by looping. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5236 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5237 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5238
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5239 case BHPOS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5240 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5241 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5242 if (behind_pos.rs_u.pos.col != (colnr_T)(reginput - regline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5243 || behind_pos.rs_u.pos.lnum != reglnum)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5244 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5245 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5246 else if (behind_pos.rs_u.ptr != reginput)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5247 status = RA_NOMATCH;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5248 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5249
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5250 case NEWL:
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5251 if ((c != NUL || !REG_MULTI || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5252 || reg_line_lbr) && (c != '\n' || !reg_line_lbr))
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5253 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5254 else if (reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5255 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5256 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5257 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5258 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5260 case END:
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5261 status = RA_MATCH; /* Success! */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5262 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5263
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5264 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5265 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5266 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 printf("Illegal op code %d\n", op);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5268 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5269 status = RA_FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5270 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5271 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5274 /* If we can't continue sequentially, break the inner loop. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5275 if (status != RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5276 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5277
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5278 /* Continue in inner loop, advance to next item. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5279 scan = next;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5280
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5281 } /* end of inner loop */
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 * 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
5285 * If the state is popped then loop and use the older state.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5286 */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5287 while (regstack.ga_len > 0 && status != RA_FAIL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5288 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5289 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5290 switch (rp->rs_state)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5291 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5292 case RS_NOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5293 /* Result is passed on as-is, simply pop the state. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5294 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5295 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5296
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5297 case RS_MOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5298 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5299 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5300 restore_se(&rp->rs_un.sesave, &reg_startpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5301 &reg_startp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5302 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5303 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5304
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5305 #ifdef FEAT_SYN_HL
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5306 case RS_ZOPEN:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5307 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5308 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5309 restore_se(&rp->rs_un.sesave, &reg_startzpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5310 &reg_startzp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5311 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5312 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5313 #endif
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5314
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5315 case RS_MCLOSE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5316 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5317 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5318 restore_se(&rp->rs_un.sesave, &reg_endpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5319 &reg_endp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5320 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5321 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5322
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5323 #ifdef FEAT_SYN_HL
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5324 case RS_ZCLOSE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5325 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5326 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5327 restore_se(&rp->rs_un.sesave, &reg_endzpos[rp->rs_no],
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5328 &reg_endzp[rp->rs_no]);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5329 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5330 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5331 #endif
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5332
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5333 case RS_BRANCH:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5334 if (status == RA_MATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5335 /* this branch matched, use it */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5336 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5337 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5338 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5339 if (status != RA_BREAK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5340 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5341 /* After a non-matching branch: try next one. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5342 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5343 scan = rp->rs_scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5344 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5345 if (scan == NULL || OP(scan) != BRANCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5346 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5347 /* no more branches, didn't find a match */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5348 status = RA_NOMATCH;
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 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5351 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5352 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5353 /* Prepare to try a branch. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5354 rp->rs_scan = regnext(scan);
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5355 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5356 scan = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5357 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5358 }
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
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5361 case RS_BRCPLX_MORE:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5362 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5363 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5364 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5365 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5366 --brace_count[rp->rs_no]; /* decrement match count */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5367 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5368 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5369 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5370
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5371 case RS_BRCPLX_LONG:
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 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5375 /* There was no match, but we did find enough matches. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5376 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5377 --brace_count[rp->rs_no];
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5378 /* continue with the items after "\{}" */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5379 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5380 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5381 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5382 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5383 scan = regnext(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5384 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5385
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5386 case RS_BRCPLX_SHORT:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5387 /* Pop the state. Restore pointers when there is no match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5388 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5389 /* There was no match, try to match one more item. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5390 reg_restore(&rp->rs_un.regsave, &backpos);
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5391 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5392 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5393 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5394 scan = OPERAND(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5395 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5396 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5397 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5398
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5399 case RS_NOMATCH:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5400 /* Pop the state. If the operand matches for NOMATCH or
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5401 * doesn't match for MATCH/SUBPAT, we fail. Otherwise backup,
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5402 * except for SUBPAT, and continue with the next item. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5403 if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5404 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5405 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5406 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5407 status = RA_CONT;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5408 if (rp->rs_no != SUBPAT) /* zero-width */
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5409 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5410 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5411 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5412 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5413 scan = regnext(scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5414 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5415
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5416 case RS_BEHIND1:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5417 if (status == RA_NOMATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5418 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5419 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5420 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5421 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5422 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5423 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5424 /* The stuff after BEHIND/NOBEHIND matches. Now try if
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5425 * the behind part does (not) match before the current
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5426 * position in the input. This must be done at every
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5427 * position in the input and checking if the match ends at
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5428 * the current position. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5429
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5430 /* save the position after the found match for next */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5431 reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5432
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5433 /* start looking for a match with operand at the current
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
5434 * position. Go back one character until we find the
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5435 * result, hitting the start of the line or the previous
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5436 * line (for multi-line matching).
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5437 * Set behind_pos to where the match should end, BHPOS
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5438 * will match it. Save the current value. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5439 (((regbehind_T *)rp) - 1)->save_behind = behind_pos;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5440 behind_pos = rp->rs_un.regsave;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5441
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5442 rp->rs_state = RS_BEHIND2;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5443
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5444 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5445 scan = OPERAND(rp->rs_scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5446 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5447 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5448
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5449 case RS_BEHIND2:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5450 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5451 * Looping for BEHIND / NOBEHIND match.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5452 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5453 if (status == RA_MATCH && reg_save_equal(&behind_pos))
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5454 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5455 /* found a match that ends where "next" started */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5456 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5457 if (rp->rs_no == BEHIND)
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5458 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5459 &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5460 else
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5461 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5462 /* But we didn't want a match. Need to restore the
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5463 * subexpr, because what follows matched, so they have
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5464 * been set. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5465 status = RA_NOMATCH;
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5466 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5467 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5468 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5469 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5470 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5471 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5472 {
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5473 /* 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
5474 * back one character. May go to previous line once. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5475 no = OK;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5476 if (REG_MULTI)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5477 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5478 if (rp->rs_un.regsave.rs_u.pos.col == 0)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5479 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5480 if (rp->rs_un.regsave.rs_u.pos.lnum
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5481 < behind_pos.rs_u.pos.lnum
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5482 || reg_getline(
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5483 --rp->rs_un.regsave.rs_u.pos.lnum)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5484 == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5485 no = FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5486 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5487 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5488 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5489 rp->rs_un.regsave.rs_u.pos.col =
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5490 (colnr_T)STRLEN(regline);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5491 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5492 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5493 else
4176
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5494 #ifdef FEAT_MBYTE
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5495 if (has_mbyte)
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5496 rp->rs_un.regsave.rs_u.pos.col -=
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5497 (*mb_head_off)(regline, regline
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5498 + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5499 else
1778d51fcbc3 updated for version 7.3.840
Bram Moolenaar <bram@vim.org>
parents: 4084
diff changeset
5500 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5501 --rp->rs_un.regsave.rs_u.pos.col;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5502 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5503 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5504 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5505 if (rp->rs_un.regsave.rs_u.ptr == regline)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5506 no = FAIL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5507 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5508 --rp->rs_un.regsave.rs_u.ptr;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5509 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5510 if (no == OK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5511 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5512 /* Advanced, prepare for finding match again. */
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5513 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5514 scan = OPERAND(rp->rs_scan);
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5515 if (status == RA_MATCH)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5516 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5517 /* We did match, so subexpr may have been changed,
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5518 * need to restore them for the next try. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5519 status = RA_NOMATCH;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5520 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5521 }
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5522 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5523 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5524 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5525 /* Can't advance. For NOBEHIND that's a match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5526 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5527 if (rp->rs_no == NOBEHIND)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5528 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5529 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5530 &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5531 status = RA_MATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5532 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5533 else
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5534 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5535 /* We do want a proper match. Need to restore the
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5536 * subexpr if we had a match, because they may have
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5537 * been set. */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5538 if (status == RA_MATCH)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5539 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5540 status = RA_NOMATCH;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5541 restore_subexpr(((regbehind_T *)rp) - 1);
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5542 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
5543 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5544 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5545 regstack.ga_len -= sizeof(regbehind_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5546 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5547 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5548 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5549
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5550 case RS_STAR_LONG:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5551 case RS_STAR_SHORT:
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5552 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5553 regstar_T *rst = ((regstar_T *)rp) - 1;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5554
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5555 if (status == RA_MATCH)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5556 {
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5557 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5558 regstack.ga_len -= sizeof(regstar_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5559 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5560 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5561
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5562 /* Tried once already, restore input pointers. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5563 if (status != RA_BREAK)
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5564 reg_restore(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5565
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5566 /* Repeat until we found a position where it could match. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5567 for (;;)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5568 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5569 if (status != RA_BREAK)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5570 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5571 /* Tried first position already, advance. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5572 if (rp->rs_state == RS_STAR_LONG)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5573 {
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5574 /* Trying for longest match, but couldn't or
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5575 * didn't match -- back up one char. */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5576 if (--rst->count < rst->minval)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5577 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5578 if (reginput == regline)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5579 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5580 /* backup to last char of previous line */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5581 --reglnum;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5582 regline = reg_getline(reglnum);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5583 /* Just in case regrepeat() didn't count
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5584 * right. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5585 if (regline == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5586 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5587 reginput = regline + STRLEN(regline);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5588 fast_breakcheck();
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5589 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5590 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5591 mb_ptr_back(regline, reginput);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5592 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5593 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5594 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5595 /* Range is backwards, use shortest match first.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5596 * Careful: maxval and minval are exchanged!
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5597 * Couldn't or didn't match: try advancing one
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5598 * char. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5599 if (rst->count == rst->minval
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5600 || regrepeat(OPERAND(rp->rs_scan), 1L) == 0)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5601 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5602 ++rst->count;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5603 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5604 if (got_int)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5605 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5606 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5607 else
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5608 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5609
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5610 /* If it could match, try it. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5611 if (rst->nextb == NUL || *reginput == rst->nextb
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5612 || *reginput == rst->nextb_ic)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5613 {
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
5614 reg_save(&rp->rs_un.regsave, &backpos);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5615 scan = regnext(rp->rs_scan);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5616 status = RA_CONT;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5617 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5618 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5619 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5620 if (status != RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5621 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5622 /* Failed. */
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5623 regstack_pop(&scan);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5624 regstack.ga_len -= sizeof(regstar_T);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5625 status = RA_NOMATCH;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5626 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5627 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5628 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5629 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5630
685
d7e33248b9c8 updated for version 7.0206
vimboss
parents: 653
diff changeset
5631 /* 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
5632 * continue matching loop */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5633 if (status == RA_CONT || rp == (regitem_T *)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5634 ((char *)regstack.ga_data + regstack.ga_len) - 1)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5635 break;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5636 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5637
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5638 /* May need to continue with the inner loop, starting at "scan". */
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5639 if (status == RA_CONT)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5640 continue;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5641
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5642 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5643 * If the regstack is empty or something failed we are done.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5644 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5645 if (regstack.ga_len == 0 || status == RA_FAIL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5646 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5647 if (scan == NULL)
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5648 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5649 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5650 * We get here only if there's trouble -- normally "case END" is
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5651 * the terminating point.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5652 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5653 EMSG(_(e_re_corr));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654 #ifdef DEBUG
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5655 printf("Premature EOL\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656 #endif
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5657 }
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5658 if (status == RA_FAIL)
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5659 got_int = TRUE;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5660 return (status == RA_MATCH);
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5661 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5662
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5663 } /* End of loop until the regstack is empty. */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5664
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5665 /* NOTREACHED */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5666 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5667
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5668 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5669 * Push an item onto the regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5670 * Returns pointer to new item. Returns NULL when out of memory.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5671 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5672 static regitem_T *
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5673 regstack_push(state, scan)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5674 regstate_T state;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5675 char_u *scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5676 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5677 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5678
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5679 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
189
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5680 {
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5681 EMSG(_(e_maxmempat));
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5682 return NULL;
504c627f7474 updated for version 7.0057
vimboss
parents: 180
diff changeset
5683 }
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5684 if (ga_grow(&regstack, sizeof(regitem_T)) == FAIL)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5685 return NULL;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5686
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5687 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5688 rp->rs_state = state;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5689 rp->rs_scan = scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5690
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5691 regstack.ga_len += sizeof(regitem_T);
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5692 return rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5693 }
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5694
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5695 /*
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5696 * Pop an item from the regstack.
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5697 */
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5698 static void
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5699 regstack_pop(scan)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5700 char_u **scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5701 {
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5702 regitem_T *rp;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5703
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5704 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5705 *scan = rp->rs_scan;
7e70fc748752 updated for version 7.0056
vimboss
parents: 179
diff changeset
5706
270
a20218704019 updated for version 7.0072
vimboss
parents: 236
diff changeset
5707 regstack.ga_len -= sizeof(regitem_T);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 * regrepeat - repeatedly match something simple, return how many.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5712 * Advances reginput (and reglnum) to just after the matched chars.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5713 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5714 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5715 regrepeat(p, maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5716 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5717 long maxcount; /* maximum number of matches allowed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5719 long count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5720 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5721 char_u *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5722 int mask;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5723 int testval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5725 scan = reginput; /* Make local copy of reginput for speed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5726 opnd = OPERAND(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5727 switch (OP(p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5729 case ANY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5730 case ANY + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5731 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5732 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5733 /* Matching anything means we continue until end-of-line (or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5734 * end-of-file for ANY + ADD_NL), only limited by maxcount. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5735 while (*scan != NUL && count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5736 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5737 ++count;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5738 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5739 }
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5740 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5741 || reg_line_lbr || count == maxcount)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5742 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5743 ++count; /* count the line-break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5744 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5745 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5746 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5747 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5749 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5751 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5752 case IDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5753 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5754 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5755 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5756 case SIDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5757 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5759 if (vim_isIDc(*scan) && (testval || !VIM_ISDIGIT(*scan)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5760 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5761 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5763 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5764 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5765 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5766 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5767 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5768 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5769 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5770 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5771 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5772 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5773 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5774 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5775 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5776 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5777 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5778 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5779 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5780
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5781 case KWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5782 case KWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5783 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5784 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5785 case SKWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5786 case SKWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5787 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5788 {
4069
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
5789 if (vim_iswordp_buf(scan, reg_buf)
43c15135926f updated for version 7.3.789
Bram Moolenaar <bram@vim.org>
parents: 4061
diff changeset
5790 && (testval || !VIM_ISDIGIT(*scan)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5791 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5792 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5793 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5794 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5795 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5796 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5797 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5798 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5799 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5800 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5801 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5802 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5803 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5804 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5805 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5806 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5807 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5808 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5809 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5810 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5811
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5812 case FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5813 case FNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5814 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5815 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5816 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5817 case SFNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5818 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5819 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5820 if (vim_isfilec(*scan) && (testval || !VIM_ISDIGIT(*scan)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5821 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5822 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5823 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5824 else if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5825 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5826 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5827 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5828 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5829 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5830 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5831 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5832 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5833 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5834 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5835 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5836 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5837 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5838 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5840 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5841
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5842 case PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5843 case PRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5844 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5845 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5846 case SPRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5847 case SPRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5848 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5849 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5850 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5851 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5852 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5853 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5854 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5855 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5856 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5857 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5858 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5859 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5860 else if (ptr2cells(scan) == 1 && (testval || !VIM_ISDIGIT(*scan)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5861 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
5862 mb_ptr_adv(scan);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5864 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5865 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5866 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5867 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5868 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5870 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5872 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5873 case WHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5874 testval = mask = RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5875 do_class:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5876 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5878 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5879 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5880 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5881 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5882 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5883 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
5884 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5885 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5886 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5887 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5888 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5889 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5891 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
5892 else if (has_mbyte && (l = (*mb_ptr2len)(scan)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5893 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5894 if (testval != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5895 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5896 scan += l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5898 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5899 else if ((class_tab[*scan] & mask) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5900 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5901 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5902 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5903 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5904 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5905 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5907 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5908
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5909 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5910 case NWHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5911 mask = RI_WHITE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5912 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5913 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5914 case DIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5915 testval = mask = RI_DIGIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5916 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5917 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5918 case NDIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5919 mask = RI_DIGIT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5920 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5921 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5922 case HEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5923 testval = mask = RI_HEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5924 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5925 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5926 case NHEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5927 mask = RI_HEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5928 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5929 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5930 case OCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5931 testval = mask = RI_OCTAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5932 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5933 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5934 case NOCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5935 mask = RI_OCTAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5936 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5937 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5938 case WORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5939 testval = mask = RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5940 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5941 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5942 case NWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5943 mask = RI_WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5944 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5945 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5946 case HEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5947 testval = mask = RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5948 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5949 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5950 case NHEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5951 mask = RI_HEAD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5952 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5953 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5954 case ALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5955 testval = mask = RI_ALPHA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5956 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5957 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5958 case NALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5959 mask = RI_ALPHA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5960 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5961 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5962 case LOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5963 testval = mask = RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5964 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5965 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5966 case NLOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5967 mask = RI_LOWER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5968 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5969 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5970 case UPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5971 testval = mask = RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5972 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5973 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5974 case NUPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5975 mask = RI_UPPER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5976 goto do_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5977
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5978 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5980 int cu, cl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5981
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5982 /* This doesn't do a multi-byte character, because a MULTIBYTECODE
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5983 * would have been used for it. It does handle single-byte
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5984 * characters, such as latin1. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5985 if (ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5986 {
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5987 cu = MB_TOUPPER(*opnd);
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
5988 cl = MB_TOLOWER(*opnd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5989 while (count < maxcount && (*scan == cu || *scan == cl))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5991 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5992 scan++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5993 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5994 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5995 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5996 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5997 cu = *opnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5998 while (count < maxcount && *scan == cu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5999 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6000 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6001 scan++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6003 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6004 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6005 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6006
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6007 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6008 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6009 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6010 int i, len, cf = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6011
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6012 /* Safety check (just in case 'encoding' was changed since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6013 * compiling the program). */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
6014 if ((len = (*mb_ptr2len)(opnd)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6015 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6016 if (ireg_ic && enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6017 cf = utf_fold(utf_ptr2char(opnd));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6018 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6019 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6020 for (i = 0; i < len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6021 if (opnd[i] != scan[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6022 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6023 if (i < len && (!ireg_ic || !enc_utf8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6024 || utf_fold(utf_ptr2char(scan)) != cf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6025 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6026 scan += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6027 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6029 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6030 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6031 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6032 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6033
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6034 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6035 case ANYOF + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6036 testval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6037 /*FALLTHROUGH*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6038
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6039 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6040 case ANYBUT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6041 while (count < maxcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6042 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6043 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6044 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6045 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6046 if (*scan == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6047 {
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6048 if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > reg_maxline
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6049 || reg_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6050 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6051 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6052 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6053 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6054 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6055 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6056 else if (reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6057 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6058 #ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
6059 else if (has_mbyte && (len = (*mb_ptr2len)(scan)) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6060 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6061 if ((cstrchr(opnd, (*mb_ptr2char)(scan)) == NULL) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6062 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6063 scan += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6065 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6066 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6067 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6068 if ((cstrchr(opnd, *scan) == NULL) == testval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6069 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6070 ++scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6071 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6072 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6073 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6074 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6076 case NEWL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6077 while (count < maxcount
1018
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6078 && ((*scan == NUL && reglnum <= reg_maxline && !reg_line_lbr
d3cff90680f3 updated for version 7.0-144
vimboss
parents: 944
diff changeset
6079 && REG_MULTI) || (*scan == '\n' && reg_line_lbr)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6080 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6081 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6082 if (reg_line_lbr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6083 ADVANCE_REGINPUT();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6084 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6085 reg_nextline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6086 scan = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6087 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6088 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6090 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6091
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6092 default: /* Oh dear. Called inappropriately. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6093 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6094 #ifdef DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6095 printf("Called regrepeat with op code %d\n", OP(p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6096 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6097 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6098 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6100 reginput = scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6101
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6102 return (int)count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6103 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6104
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6105 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6106 * regnext - dig the "next" pointer out of a node
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
6107 * 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
6108 * there is an error.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6109 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6110 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6111 regnext(p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6112 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6113 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6114 int offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6115
2010
bec979a53f47 updated for version 7.2-307
vimboss
parents: 1877
diff changeset
6116 if (p == JUST_CALC_SIZE || reg_toolong)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6117 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6118
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6119 offset = NEXT(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6120 if (offset == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6121 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6122
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6123 if (OP(p) == BACK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6124 return p - offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6125 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6126 return p + offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6129 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6130 * Check the regexp program for its magic number.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6131 * Return TRUE if it's wrong.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6132 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6133 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6134 prog_magic_wrong()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6135 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6136 regprog_T *prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6137
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6138 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
6139 if (prog->engine == &nfa_regengine)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6140 /* 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
6141 return FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6142
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6143 if (UCHARAT(((bt_regprog_T *)prog)->program) != REGMAGIC)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6144 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6145 EMSG(_(e_re_corr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6146 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6147 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6148 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6149 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6150
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152 * Cleanup the subexpressions, if this wasn't done yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6153 * This construction is used to clear the subexpressions only when they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154 * used (to increase speed).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 cleanup_subexpr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 if (need_clear_subexpr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 /* Use 0xff to set lnum to -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164 vim_memset(reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6165 vim_memset(reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6167 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169 vim_memset(reg_startp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170 vim_memset(reg_endp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6172 need_clear_subexpr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6173 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 cleanup_zsubexpr()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180 if (need_clear_zsubexpr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6181 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6183 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184 /* Use 0xff to set lnum to -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6188 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6191 vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6192 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6193 need_clear_zsubexpr = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6194 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6195 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6196 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6197
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 /*
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6199 * Save the current subexpr to "bp", so that they can be restored
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6200 * later by restore_subexpr().
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6201 */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6202 static void
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6203 save_subexpr(bp)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6204 regbehind_T *bp;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6205 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6206 int i;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6207
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6208 /* 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
6209 * remember that this flag needs to be set again when restoring. */
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6210 bp->save_need_clear_subexpr = need_clear_subexpr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6211 if (!need_clear_subexpr)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6212 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6213 for (i = 0; i < NSUBEXP; ++i)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6214 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6215 if (REG_MULTI)
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6216 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6217 bp->save_start[i].se_u.pos = reg_startpos[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6218 bp->save_end[i].se_u.pos = reg_endpos[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6219 }
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6220 else
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6221 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6222 bp->save_start[i].se_u.ptr = reg_startp[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6223 bp->save_end[i].se_u.ptr = reg_endp[i];
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6224 }
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6225 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6226 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6227 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6228
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6229 /*
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6230 * Restore the subexpr from "bp".
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6231 */
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6232 static void
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6233 restore_subexpr(bp)
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6234 regbehind_T *bp;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6235 {
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6236 int i;
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6237
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6238 /* 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
6239 need_clear_subexpr = bp->save_need_clear_subexpr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6240 if (!need_clear_subexpr)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6241 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6242 for (i = 0; i < NSUBEXP; ++i)
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6243 {
1602
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6244 if (REG_MULTI)
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6245 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6246 reg_startpos[i] = bp->save_start[i].se_u.pos;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6247 reg_endpos[i] = bp->save_end[i].se_u.pos;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6248 }
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6249 else
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6250 {
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6251 reg_startp[i] = bp->save_start[i].se_u.ptr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6252 reg_endp[i] = bp->save_end[i].se_u.ptr;
0358abf2b5d4 updated for version 7.1-315
vimboss
parents: 1579
diff changeset
6253 }
1579
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6254 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6255 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6256 }
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6257
25bc02d83cf4 updated for version 7.1-292
vimboss
parents: 1521
diff changeset
6258 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6259 * Advance reglnum, regline and reginput to the next line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6260 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6261 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6262 reg_nextline()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6264 regline = reg_getline(++reglnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6265 reginput = regline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6266 fast_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6268
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6269 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6270 * Save the input line and position in a regsave_T.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6271 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6272 static void
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6273 reg_save(save, gap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6274 regsave_T *save;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6275 garray_T *gap;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6277 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6279 save->rs_u.pos.col = (colnr_T)(reginput - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6280 save->rs_u.pos.lnum = reglnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6281 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6282 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6283 save->rs_u.ptr = reginput;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6284 save->rs_len = gap->ga_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6285 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6286
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6287 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6288 * Restore the input line and position from a regsave_T.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6289 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6290 static void
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6291 reg_restore(save, gap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6292 regsave_T *save;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6293 garray_T *gap;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6294 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6295 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6297 if (reglnum != save->rs_u.pos.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6299 /* only call reg_getline() when the line number changed to save
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6300 * a bit of time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6301 reglnum = save->rs_u.pos.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6302 regline = reg_getline(reglnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6304 reginput = regline + save->rs_u.pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6306 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6307 reginput = save->rs_u.ptr;
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 212
diff changeset
6308 gap->ga_len = save->rs_len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6311 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6312 * Return TRUE if current position is equal to saved position.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6313 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6314 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6315 reg_save_equal(save)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6316 regsave_T *save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6317 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6318 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6319 return reglnum == save->rs_u.pos.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6320 && reginput == regline + save->rs_u.pos.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6321 return reginput == save->rs_u.ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6325 * Tentatively set the sub-expression start to the current position (after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6326 * calling regmatch() they will have changed). Need to save the existing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6327 * values for when there is no match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6328 * Use se_save() to use pointer (save_se_multi()) or position (save_se_one()),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6329 * depending on REG_MULTI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6330 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6331 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 save_se_multi(savep, posp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6333 save_se_T *savep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334 lpos_T *posp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336 savep->se_u.pos = *posp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 posp->lnum = reglnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6338 posp->col = (colnr_T)(reginput - regline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 save_se_one(savep, pp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 save_se_T *savep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 char_u **pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346 savep->se_u.ptr = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 *pp = reginput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351 * Compare a number with the operand of RE_LNUM, RE_COL or RE_VCOL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 re_num_cmp(val, scan)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355 long_u val;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6356 char_u *scan;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6358 long_u n = OPERAND_MIN(scan);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6360 if (OPERAND_CMP(scan) == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 return val > n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362 if (OPERAND_CMP(scan) == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6363 return val < n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6364 return val == n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6365 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6366
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6367
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6368 #ifdef BT_REGEXP_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 * regdump - dump a regexp onto stdout in vaguely comprehensible form
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6373 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 regdump(pattern, r)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375 char_u *pattern;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6376 bt_regprog_T *r;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379 int op = EXACTLY; /* Arbitrary non-END op. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 char_u *next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6381 char_u *end = NULL;
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6382 FILE *f;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6383
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6384 #ifdef BT_REGEXP_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6385 f = fopen("bt_regexp_log.log", "a");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6386 #else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6387 f = stdout;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6388 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6389 if (f == NULL)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6390 return;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6391 fprintf(f, "-------------------------------------\n\r\nregcomp(%s):\r\n", pattern);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6393 s = r->program + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6394 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6395 * 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
6396 * can also appear in a NOMATCH operand).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6397 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6398 while (op != END || s <= end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6400 op = OP(s);
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6401 fprintf(f, "%2d%s", (int)(s - r->program), regprop(s)); /* Where, what. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6402 next = regnext(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6403 if (next == NULL) /* Next ptr. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6404 fprintf(f, "(0)");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6405 else
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6406 fprintf(f, "(%d)", (int)((s - r->program) + (next - s)));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6407 if (end < next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6408 end = next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6409 if (op == BRACE_LIMITS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6410 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6411 /* Two short ints */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6412 fprintf(f, " minval %ld, maxval %ld", OPERAND_MIN(s), OPERAND_MAX(s));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6413 s += 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6414 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6415 s += 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6416 if (op == ANYOF || op == ANYOF + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6417 || op == ANYBUT || op == ANYBUT + ADD_NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6418 || op == EXACTLY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 /* Literal string, where present. */
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6421 fprintf(f, "\nxxxxxxxxx\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422 while (*s != NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6423 fprintf(f, "%c", *s++);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6424 fprintf(f, "\nxxxxxxxxx\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 s++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6427 fprintf(f, "\r\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6430 /* Header fields of interest. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431 if (r->regstart != NUL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6432 fprintf(f, "start `%s' 0x%x; ", r->regstart < 256
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6433 ? (char *)transchar(r->regstart)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6434 : "multibyte", r->regstart);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6435 if (r->reganch)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6436 fprintf(f, "anchored; ");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6437 if (r->regmust != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6438 fprintf(f, "must have \"%s\"", r->regmust);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6439 fprintf(f, "\r\n");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6440
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6441 #ifdef BT_REGEXP_LOG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6442 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6443 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6444 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6445 #endif /* BT_REGEXP_DUMP */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6446
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6447 #ifdef DEBUG
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6448 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6449 * regprop - printable representation of opcode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6450 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6451 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6452 regprop(op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6453 char_u *op;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6454 {
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6455 char *p;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6456 static char buf[50];
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6457
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6458 STRCPY(buf, ":");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6459
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6460 switch ((int) OP(op))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6461 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6462 case BOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6463 p = "BOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6464 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6465 case EOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6466 p = "EOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6467 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6468 case RE_BOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6469 p = "BOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6470 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6471 case RE_EOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6472 p = "EOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6473 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6474 case CURSOR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6475 p = "CURSOR";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6476 break;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6477 case RE_VISUAL:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6478 p = "RE_VISUAL";
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6479 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6480 case RE_LNUM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6481 p = "RE_LNUM";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6482 break;
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6483 case RE_MARK:
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6484 p = "RE_MARK";
c79d4df4686e updated for version 7.0185
vimboss
parents: 507
diff changeset
6485 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6486 case RE_COL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6487 p = "RE_COL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6488 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6489 case RE_VCOL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6490 p = "RE_VCOL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6491 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6492 case BOW:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6493 p = "BOW";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6494 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6495 case EOW:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6496 p = "EOW";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6497 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6498 case ANY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6499 p = "ANY";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6500 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6501 case ANY + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6502 p = "ANY+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6503 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504 case ANYOF:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6505 p = "ANYOF";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507 case ANYOF + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508 p = "ANYOF+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6509 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6510 case ANYBUT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6511 p = "ANYBUT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6512 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6513 case ANYBUT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6514 p = "ANYBUT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6515 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6516 case IDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6517 p = "IDENT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6518 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6519 case IDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6520 p = "IDENT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6521 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6522 case SIDENT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6523 p = "SIDENT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6524 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6525 case SIDENT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6526 p = "SIDENT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6527 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6528 case KWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6529 p = "KWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6530 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6531 case KWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6532 p = "KWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6533 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6534 case SKWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6535 p = "SKWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6536 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6537 case SKWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6538 p = "SKWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6539 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6540 case FNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6541 p = "FNAME";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6542 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6543 case FNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6544 p = "FNAME+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6545 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6546 case SFNAME:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6547 p = "SFNAME";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6548 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6549 case SFNAME + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6550 p = "SFNAME+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6551 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6552 case PRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6553 p = "PRINT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6554 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6555 case PRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6556 p = "PRINT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6557 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6558 case SPRINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6559 p = "SPRINT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6560 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6561 case SPRINT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6562 p = "SPRINT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6563 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6564 case WHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6565 p = "WHITE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6566 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6567 case WHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6568 p = "WHITE+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6569 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6570 case NWHITE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6571 p = "NWHITE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6572 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6573 case NWHITE + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6574 p = "NWHITE+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6575 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6576 case DIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6577 p = "DIGIT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6578 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6579 case DIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6580 p = "DIGIT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6581 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6582 case NDIGIT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6583 p = "NDIGIT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6584 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6585 case NDIGIT + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6586 p = "NDIGIT+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6587 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6588 case HEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6589 p = "HEX";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6590 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6591 case HEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6592 p = "HEX+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6593 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6594 case NHEX:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6595 p = "NHEX";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6596 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6597 case NHEX + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6598 p = "NHEX+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6599 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6600 case OCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6601 p = "OCTAL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6602 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6603 case OCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6604 p = "OCTAL+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6605 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6606 case NOCTAL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6607 p = "NOCTAL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6608 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6609 case NOCTAL + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6610 p = "NOCTAL+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6611 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 case WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 p = "WORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6615 case WORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6616 p = "WORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6617 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 case NWORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 p = "NWORD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 case NWORD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6622 p = "NWORD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6624 case HEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625 p = "HEAD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6626 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6627 case HEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6628 p = "HEAD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6629 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6630 case NHEAD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6631 p = "NHEAD";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6632 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6633 case NHEAD + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6634 p = "NHEAD+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6635 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6636 case ALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6637 p = "ALPHA";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6638 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639 case ALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 p = "ALPHA+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 case NALPHA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 p = "NALPHA";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645 case NALPHA + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646 p = "NALPHA+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6647 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6648 case LOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6649 p = "LOWER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6650 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6651 case LOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6652 p = "LOWER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6653 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6654 case NLOWER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6655 p = "NLOWER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6656 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6657 case NLOWER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6658 p = "NLOWER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6659 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6660 case UPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6661 p = "UPPER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6662 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6663 case UPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6664 p = "UPPER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6665 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6666 case NUPPER:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6667 p = "NUPPER";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6668 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6669 case NUPPER + ADD_NL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6670 p = "NUPPER+NL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6671 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6672 case BRANCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6673 p = "BRANCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6674 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6675 case EXACTLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6676 p = "EXACTLY";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6677 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6678 case NOTHING:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6679 p = "NOTHING";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6680 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6681 case BACK:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6682 p = "BACK";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6683 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6684 case END:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6685 p = "END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6686 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6687 case MOPEN + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6688 p = "MATCH START";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6689 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6690 case MOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6691 case MOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6692 case MOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6693 case MOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6694 case MOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6695 case MOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6696 case MOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6697 case MOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6698 case MOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6699 sprintf(buf + STRLEN(buf), "MOPEN%d", OP(op) - MOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6700 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6701 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6702 case MCLOSE + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6703 p = "MATCH END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6704 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6705 case MCLOSE + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6706 case MCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6707 case MCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6708 case MCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6709 case MCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6710 case MCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6711 case MCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6712 case MCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6713 case MCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6714 sprintf(buf + STRLEN(buf), "MCLOSE%d", OP(op) - MCLOSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6715 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6716 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6717 case BACKREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6718 case BACKREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6719 case BACKREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6720 case BACKREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6721 case BACKREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6722 case BACKREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6723 case BACKREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6724 case BACKREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6725 case BACKREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6726 sprintf(buf + STRLEN(buf), "BACKREF%d", OP(op) - BACKREF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6727 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6728 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6729 case NOPEN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6730 p = "NOPEN";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6731 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6732 case NCLOSE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6733 p = "NCLOSE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6734 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6735 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6736 case ZOPEN + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6737 case ZOPEN + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6738 case ZOPEN + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6739 case ZOPEN + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6740 case ZOPEN + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6741 case ZOPEN + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6742 case ZOPEN + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6743 case ZOPEN + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6744 case ZOPEN + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6745 sprintf(buf + STRLEN(buf), "ZOPEN%d", OP(op) - ZOPEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6746 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6747 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6748 case ZCLOSE + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6749 case ZCLOSE + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6750 case ZCLOSE + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6751 case ZCLOSE + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6752 case ZCLOSE + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6753 case ZCLOSE + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 case ZCLOSE + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6755 case ZCLOSE + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6756 case ZCLOSE + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6757 sprintf(buf + STRLEN(buf), "ZCLOSE%d", OP(op) - ZCLOSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6758 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6759 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6760 case ZREF + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6761 case ZREF + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6762 case ZREF + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6763 case ZREF + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6764 case ZREF + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6765 case ZREF + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6766 case ZREF + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6767 case ZREF + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6768 case ZREF + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6769 sprintf(buf + STRLEN(buf), "ZREF%d", OP(op) - ZREF);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6770 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6771 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 case STAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774 p = "STAR";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6775 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 case PLUS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 p = "PLUS";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779 case NOMATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 p = "NOMATCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6782 case MATCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6783 p = "MATCH";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6784 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6785 case BEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6786 p = "BEHIND";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6787 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 case NOBEHIND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6789 p = "NOBEHIND";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6790 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6791 case SUBPAT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 p = "SUBPAT";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6794 case BRACE_LIMITS:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795 p = "BRACE_LIMITS";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6797 case BRACE_SIMPLE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6798 p = "BRACE_SIMPLE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6799 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6800 case BRACE_COMPLEX + 0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6801 case BRACE_COMPLEX + 1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6802 case BRACE_COMPLEX + 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6803 case BRACE_COMPLEX + 3:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 case BRACE_COMPLEX + 4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 case BRACE_COMPLEX + 5:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806 case BRACE_COMPLEX + 6:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807 case BRACE_COMPLEX + 7:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6808 case BRACE_COMPLEX + 8:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 case BRACE_COMPLEX + 9:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810 sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 case MULTIBYTECODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6815 p = "MULTIBYTECODE";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6816 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6817 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6818 case NEWL:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819 p = "NEWL";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6820 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6821 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6822 sprintf(buf + STRLEN(buf), "corrupt %d", OP(op));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 if (p != NULL)
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6827 STRCAT(buf, p);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6828 return (char_u *)buf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 }
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
6830 #endif /* DEBUG */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6832 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6833 static void mb_decompose __ARGS((int c, int *c1, int *c2, int *c3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6835 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837 int a, b, c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 } decomp_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6841 /* 0xfb20 - 0xfb4f */
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 270
diff changeset
6842 static decomp_T decomp_table[0xfb4f-0xfb20+1] =
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6844 {0x5e2,0,0}, /* 0xfb20 alt ayin */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6845 {0x5d0,0,0}, /* 0xfb21 alt alef */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 {0x5d3,0,0}, /* 0xfb22 alt dalet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 {0x5d4,0,0}, /* 0xfb23 alt he */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 {0x5db,0,0}, /* 0xfb24 alt kaf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6849 {0x5dc,0,0}, /* 0xfb25 alt lamed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6850 {0x5dd,0,0}, /* 0xfb26 alt mem-sofit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6851 {0x5e8,0,0}, /* 0xfb27 alt resh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6852 {0x5ea,0,0}, /* 0xfb28 alt tav */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6853 {'+', 0, 0}, /* 0xfb29 alt plus */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6854 {0x5e9, 0x5c1, 0}, /* 0xfb2a shin+shin-dot */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6855 {0x5e9, 0x5c2, 0}, /* 0xfb2b shin+sin-dot */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 {0x5e9, 0x5c1, 0x5bc}, /* 0xfb2c shin+shin-dot+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6857 {0x5e9, 0x5c2, 0x5bc}, /* 0xfb2d shin+sin-dot+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 {0x5d0, 0x5b7, 0}, /* 0xfb2e alef+patah */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6859 {0x5d0, 0x5b8, 0}, /* 0xfb2f alef+qamats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 {0x5d0, 0x5b4, 0}, /* 0xfb30 alef+hiriq */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861 {0x5d1, 0x5bc, 0}, /* 0xfb31 bet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6862 {0x5d2, 0x5bc, 0}, /* 0xfb32 gimel+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6863 {0x5d3, 0x5bc, 0}, /* 0xfb33 dalet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6864 {0x5d4, 0x5bc, 0}, /* 0xfb34 he+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6865 {0x5d5, 0x5bc, 0}, /* 0xfb35 vav+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6866 {0x5d6, 0x5bc, 0}, /* 0xfb36 zayin+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6867 {0xfb37, 0, 0}, /* 0xfb37 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868 {0x5d8, 0x5bc, 0}, /* 0xfb38 tet+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 {0x5d9, 0x5bc, 0}, /* 0xfb39 yud+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 {0x5da, 0x5bc, 0}, /* 0xfb3a kaf sofit+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 {0x5db, 0x5bc, 0}, /* 0xfb3b kaf+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 {0x5dc, 0x5bc, 0}, /* 0xfb3c lamed+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6873 {0xfb3d, 0, 0}, /* 0xfb3d -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6874 {0x5de, 0x5bc, 0}, /* 0xfb3e mem+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6875 {0xfb3f, 0, 0}, /* 0xfb3f -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6876 {0x5e0, 0x5bc, 0}, /* 0xfb40 nun+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6877 {0x5e1, 0x5bc, 0}, /* 0xfb41 samech+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6878 {0xfb42, 0, 0}, /* 0xfb42 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6879 {0x5e3, 0x5bc, 0}, /* 0xfb43 pe sofit+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6880 {0x5e4, 0x5bc,0}, /* 0xfb44 pe+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6881 {0xfb45, 0, 0}, /* 0xfb45 -- UNUSED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6882 {0x5e6, 0x5bc, 0}, /* 0xfb46 tsadi+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6883 {0x5e7, 0x5bc, 0}, /* 0xfb47 qof+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6884 {0x5e8, 0x5bc, 0}, /* 0xfb48 resh+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6885 {0x5e9, 0x5bc, 0}, /* 0xfb49 shin+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6886 {0x5ea, 0x5bc, 0}, /* 0xfb4a tav+dagesh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6887 {0x5d5, 0x5b9, 0}, /* 0xfb4b vav+holam */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 {0x5d1, 0x5bf, 0}, /* 0xfb4c bet+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889 {0x5db, 0x5bf, 0}, /* 0xfb4d kaf+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6890 {0x5e4, 0x5bf, 0}, /* 0xfb4e pe+rafe */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6891 {0x5d0, 0x5dc, 0} /* 0xfb4f alef-lamed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6892 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6895 mb_decompose(c, c1, c2, c3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6896 int c, *c1, *c2, *c3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6897 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6898 decomp_T d;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6899
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6900 if (c >= 0x4b20 && c <= 0xfb4f)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6902 d = decomp_table[c - 0xfb20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6903 *c1 = d.a;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6904 *c2 = d.b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6905 *c3 = d.c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6908 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6909 *c1 = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6910 *c2 = *c3 = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6911 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6913 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6915 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6916 * Compare two strings, ignore case if ireg_ic set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6917 * Return 0 if strings match, non-zero otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6918 * Correct the length "*n" when composing characters are ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6919 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6920 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6921 cstrncmp(s1, s2, n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6922 char_u *s1, *s2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923 int *n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925 int result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927 if (!ireg_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 result = STRNCMP(s1, s2, *n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 result = MB_STRNICMP(s1, s2, *n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6932 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 /* if it failed and it's utf8 and we want to combineignore: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 if (result != 0 && enc_utf8 && ireg_icombine)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6935 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6936 char_u *str1, *str2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6937 int c1, c2, c11, c12;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6938 int junk;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6939
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6940 /* we have to handle the strcmp ourselves, since it is necessary to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6941 * deal with the composing characters by ignoring them: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6942 str1 = s1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6943 str2 = s2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6944 c1 = c2 = 0;
507
a1059cda45f2 updated for version 7.0142
vimboss
parents: 492
diff changeset
6945 while ((int)(str1 - s1) < *n)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6946 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 c1 = mb_ptr2char_adv(&str1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6948 c2 = mb_ptr2char_adv(&str2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6950 /* decompose the character if necessary, into 'base' characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6951 * because I don't care about Arabic, I will hard-code the Hebrew
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6952 * which I *do* care about! So sue me... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6953 if (c1 != c2 && (!ireg_ic || utf_fold(c1) != utf_fold(c2)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6955 /* decomposition necessary? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6956 mb_decompose(c1, &c11, &junk, &junk);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6957 mb_decompose(c2, &c12, &junk, &junk);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6958 c1 = c11;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 c2 = c12;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 if (c11 != c12 && (!ireg_ic || utf_fold(c11) != utf_fold(c12)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6961 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 result = c2 - c1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6965 if (result == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 *n = (int)(str2 - s2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6967 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6968 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6970 return result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6971 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6972
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6973 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6974 * cstrchr: This function is used a lot for simple searches, keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6975 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6976 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6977 cstrchr(s, c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6979 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6980 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6981 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6982 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6984 if (!ireg_ic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6985 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6986 || (!enc_utf8 && mb_char2len(c) > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6987 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989 return vim_strchr(s, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6991 /* tolower() and toupper() can be slow, comparing twice should be a lot
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 * faster (esp. when using MS Visual C++!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993 * For UTF-8 need to use folded case. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6994 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6995 if (enc_utf8 && c > 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6996 cc = utf_fold(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6997 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6998 #endif
1347
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
6999 if (MB_ISUPPER(c))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7000 cc = MB_TOLOWER(c);
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7001 else if (MB_ISLOWER(c))
302a6aa7aca2 updated for version 7.1-061
vimboss
parents: 1341
diff changeset
7002 cc = MB_TOUPPER(c);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7003 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7004 return vim_strchr(s, c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7005
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7007 if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7008 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
7009 for (p = s; *p != NUL; p += (*mb_ptr2len)(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7010 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7011 if (enc_utf8 && c > 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7012 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7013 if (utf_fold(utf_ptr2char(p)) == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016 else if (*p == c || *p == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7019 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022 /* Faster version for when there are no multi-byte characters. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 for (p = s; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 if (*p == c || *p == cc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7025 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7027 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030 /***************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 * regsub stuff *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 ***************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7034 /* This stuff below really confuses cc on an SGI -- webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 #ifdef __sgi
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 # undef __ARGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037 # define __ARGS(x) ()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7039
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7040 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7041 * We should define ftpr as a pointer to a function returning a pointer to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7042 * a function returning a pointer to a function ...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7043 * This is impossible, so we declare a pointer to a function returning a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7044 * pointer to a function returning void. This should work for all compilers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7045 */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7046 typedef void (*(*fptr_T) __ARGS((int *, int)))();
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7047
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7048 static fptr_T do_upper __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7049 static fptr_T do_Upper __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7050 static fptr_T do_lower __ARGS((int *, int));
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7051 static fptr_T do_Lower __ARGS((int *, int));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7052
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7053 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
7054
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7055 static fptr_T
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 do_upper(d, c)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7057 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7058 int c;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7060 *d = MB_TOUPPER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7061
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7062 return (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7063 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7064
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7065 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7066 do_Upper(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7067 int *d;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7068 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7069 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7070 *d = MB_TOUPPER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7071
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7072 return (fptr_T)do_Upper;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7073 }
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7074
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7075 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7076 do_lower(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7077 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7078 int c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7079 {
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7080 *d = MB_TOLOWER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7081
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7082 return (fptr_T)NULL;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7083 }
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7084
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7085 static fptr_T
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7086 do_Lower(d, c)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7087 int *d;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7088 int c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7089 {
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7090 *d = MB_TOLOWER(c);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7091
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7092 return (fptr_T)do_Lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7095 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7096 * regtilde(): Replace tildes in the pattern by the old pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7097 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7098 * Short explanation of the tilde: It stands for the previous replacement
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7099 * pattern. If that previous pattern also contains a ~ we should go back a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7100 * step further... But we insert the previous pattern into the current one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7101 * and remember that.
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7102 * This still does not handle the case where "magic" changes. So require the
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7103 * user to keep his hands off of "magic".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7104 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7105 * The tildes are parsed once before the first call to vim_regsub().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7106 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7107 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7108 regtilde(source, magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7109 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7110 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7111 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7112 char_u *newsub = source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7113 char_u *tmpsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7114 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7115 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7116 int prevlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7117
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7118 for (p = newsub; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7120 if ((*p == '~' && magic) || (*p == '\\' && *(p + 1) == '~' && !magic))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7121 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7122 if (reg_prev_sub != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7124 /* length = len(newsub) - 1 + len(prev_sub) + 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7125 prevlen = (int)STRLEN(reg_prev_sub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7126 tmpsub = alloc((unsigned)(STRLEN(newsub) + prevlen));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7127 if (tmpsub != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7129 /* copy prefix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7130 len = (int)(p - newsub); /* not including ~ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7131 mch_memmove(tmpsub, newsub, (size_t)len);
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7132 /* interpret tilde */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7133 mch_memmove(tmpsub + len, reg_prev_sub, (size_t)prevlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7134 /* copy postfix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7135 if (!magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7136 ++p; /* back off \ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7137 STRCPY(tmpsub + len + prevlen, p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7138
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7139 if (newsub != source) /* already allocated newsub */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7140 vim_free(newsub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7141 newsub = tmpsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7142 p = newsub + len + prevlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7144 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7145 else if (magic)
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
7146 STRMOVE(p, p + 1); /* remove '~' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7147 else
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1602
diff changeset
7148 STRMOVE(p, p + 2); /* remove '\~' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7149 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7150 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7151 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7152 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7153 if (*p == '\\' && p[1]) /* skip escaped characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7154 ++p;
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)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 418
diff changeset
7157 p += (*mb_ptr2len)(p) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7158 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7159 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7161
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7162 vim_free(reg_prev_sub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7163 if (newsub != source) /* newsub was allocated, just keep it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7164 reg_prev_sub = newsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7165 else /* no ~ found, need to save newsub */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7166 reg_prev_sub = vim_strsave(newsub);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7167 return newsub;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7169
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7170 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7171 static int can_f_submatch = FALSE; /* TRUE when submatch() can be used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7173 /* These pointers are used instead of reg_match and reg_mmatch for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7174 * reg_submatch(). Needed for when the substitution string is an expression
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7175 * that contains a call to substitute() and submatch(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7176 static regmatch_T *submatch_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7177 static regmmatch_T *submatch_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7178 static linenr_T submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7179 static linenr_T submatch_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7180 static int submatch_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7181 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7183 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7184 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7185 * vim_regsub() - perform substitutions after a vim_regexec() or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7186 * vim_regexec_multi() match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7187 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7188 * If "copy" is TRUE really copy into "dest".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7189 * 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
7190 * of the result.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7191 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7192 * If "backslash" is TRUE, a backslash will be removed later, need to double
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7193 * 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
7194 * replaced with a line break later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7195 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7196 * Note: The matched text must not change between the call of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7197 * vim_regexec()/vim_regexec_multi() and vim_regsub()! It would make the back
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7198 * references invalid!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7199 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7200 * Returns the size of the replacement, including terminating NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7201 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7202 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7203 vim_regsub(rmp, source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7204 regmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7205 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7206 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7207 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7208 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7209 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7210 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7211 reg_match = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7212 reg_mmatch = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7213 reg_maxline = 0;
4061
be4baed0c933 updated for version 7.3.785
Bram Moolenaar <bram@vim.org>
parents: 4043
diff changeset
7214 reg_buf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7215 return vim_regsub_both(source, dest, copy, magic, backslash);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7216 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7217 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7219 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7220 vim_regsub_multi(rmp, lnum, source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7221 regmmatch_T *rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7222 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7223 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7224 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7225 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7226 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7227 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7228 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7229 reg_match = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7230 reg_mmatch = rmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7231 reg_buf = curbuf; /* always works on the current buffer! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7232 reg_firstlnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7233 reg_maxline = curbuf->b_ml.ml_line_count - lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7234 return vim_regsub_both(source, dest, copy, magic, backslash);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7236
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7237 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7238 vim_regsub_both(source, dest, copy, magic, backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7239 char_u *source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7240 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7241 int copy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7242 int magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7243 int backslash;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7244 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7245 char_u *src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7246 char_u *dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7247 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7248 int c;
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7249 int cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7250 int no = -1;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7251 fptr_T func_all = (fptr_T)NULL;
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7252 fptr_T func_one = (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7253 linenr_T clnum = 0; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7254 int len = 0; /* init for GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7255 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7256 static char_u *eval_result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7257 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7258
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7259 /* Be paranoid... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7260 if (source == NULL || dest == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7262 EMSG(_(e_null));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7263 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7264 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7265 if (prog_magic_wrong())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7266 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7267 src = source;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7268 dst = dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7269
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7270 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7271 * When the substitute part starts with "\=" evaluate it as an expression.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7272 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7273 if (source[0] == '\\' && source[1] == '='
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7274 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7275 && !can_f_submatch /* can't do this recursively */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7276 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7277 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7279 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7280 /* To make sure that the length doesn't change between checking the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7281 * length and copying the string, and to speed up things, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7282 * resulting string is saved from the call with "copy" == FALSE to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7283 * call with "copy" == TRUE. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7284 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7286 if (eval_result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7287 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7288 STRCPY(dest, eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7289 dst += STRLEN(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7290 vim_free(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7291 eval_result = NULL;
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296 win_T *save_reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7297 int save_ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7299 vim_free(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7300
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7301 /* The expression may contain substitute(), which calls us
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7302 * recursively. Make sure submatch() gets the text from the first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 * level. Don't need to save "reg_buf", because
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 * vim_regexec_multi() can't be called recursively. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7305 submatch_match = reg_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7306 submatch_mmatch = reg_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7307 submatch_firstlnum = reg_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7308 submatch_maxline = reg_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7309 submatch_line_lbr = reg_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310 save_reg_win = reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 save_ireg_ic = ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 can_f_submatch = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7313
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 692
diff changeset
7314 eval_result = eval_to_string(source + 2, NULL, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7315 if (eval_result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7316 {
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7317 int had_backslash = FALSE;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7318
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 29
diff changeset
7319 for (s = eval_result; *s != NUL; mb_ptr_adv(s))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7320 {
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7321 /* 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
7322 * unless called from vim_regexec_nl().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7323 * Skip over a backslashed character. */
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7324 if (*s == NL && !submatch_line_lbr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7325 *s = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7326 else if (*s == '\\' && s[1] != NUL)
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7327 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7328 ++s;
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7329 /* 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
7330 * :s/abc\\\ndef/\="aaa\\\nbbb"/ on text:
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7331 * abc\
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7332 * def
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7333 * Not when called from vim_regexec_nl().
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7334 */
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7335 if (*s == NL && !submatch_line_lbr)
2173
ecb9c2b70b0f updated for version 7.2.437
Bram Moolenaar <bram@vim.org>
parents: 2125
diff changeset
7336 *s = CAR;
2125
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7337 had_backslash = TRUE;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7338 }
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7339 }
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7340 if (had_backslash && backslash)
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7341 {
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7342 /* Backslashes will be consumed, need to double them. */
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7343 s = vim_strsave_escaped(eval_result, (char_u *)"\\");
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7344 if (s != NULL)
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7345 {
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7346 vim_free(eval_result);
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7347 eval_result = s;
b8744d1982d1 updated for version 7.2.407
Bram Moolenaar <bram@zimbu.org>
parents: 2012
diff changeset
7348 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7349 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7350
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7351 dst += STRLEN(eval_result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7352 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7353
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7354 reg_match = submatch_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7355 reg_mmatch = submatch_mmatch;
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7356 reg_firstlnum = submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7357 reg_maxline = submatch_maxline;
2904
c249d9aa60f7 updated for version 7.3.225
Bram Moolenaar <bram@vim.org>
parents: 2578
diff changeset
7358 reg_line_lbr = submatch_line_lbr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7359 reg_win = save_reg_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7360 ireg_ic = save_ireg_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7361 can_f_submatch = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7362 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7363 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7364 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7365 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7366 while ((c = *src++) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7368 if (c == '&' && magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7369 no = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7370 else if (c == '\\' && *src != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 if (*src == '&' && !magic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7374 ++src;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375 no = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7377 else if ('0' <= *src && *src <= '9')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7379 no = *src++ - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7381 else if (vim_strchr((char_u *)"uUlLeE", *src))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7382 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7383 switch (*src++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7384 {
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7385 case 'u': func_one = (fptr_T)do_upper;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7386 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7387 case 'U': func_all = (fptr_T)do_Upper;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7388 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7389 case 'l': func_one = (fptr_T)do_lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7390 continue;
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7391 case 'L': func_all = (fptr_T)do_Lower;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7392 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7393 case 'e':
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7394 case 'E': func_one = func_all = (fptr_T)NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7395 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7397 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7398 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7399 if (no < 0) /* Ordinary character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7400 {
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7401 if (c == K_SPECIAL && src[0] != NUL && src[1] != NUL)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7402 {
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7403 /* Copy a special key as-is. */
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7404 if (copy)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7405 {
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7406 *dst++ = c;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7407 *dst++ = *src++;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7408 *dst++ = *src++;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7409 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7410 else
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7411 {
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7412 dst += 3;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7413 src += 2;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7414 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7415 continue;
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7416 }
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7417
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7418 if (c == '\\' && *src != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7420 /* Check for abbreviations -- webb */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 switch (*src)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 case 'r': c = CAR; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424 case 'n': c = NL; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 case 't': c = TAB; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 /* Oh no! \e already has meaning in subst pat :-( */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427 /* case 'e': c = ESC; ++src; break; */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 case 'b': c = Ctrl_H; ++src; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 /* If "backslash" is TRUE the backslash will be removed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431 * later. Used to insert a literal CR. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7432 default: if (backslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 *dst = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 ++dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 c = *src++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 }
798
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7441 #ifdef FEAT_MBYTE
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7442 else if (has_mbyte)
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7443 c = mb_ptr2char(src - 1);
95dac6af3b3a updated for version 7.0232
vimboss
parents: 772
diff changeset
7444 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7445
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446 /* Write to buffer, if copy is set. */
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7447 if (func_one != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7448 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7449 func_one = (fptr_T)(func_one(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7450 else if (func_all != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7451 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7452 func_all = (fptr_T)(func_all(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7453 else /* just copy */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7454 cc = c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7455
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7456 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7457 if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7458 {
2307
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7459 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
7460
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7461 if (copy)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7462 mb_char2bytes(cc, dst);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7463 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
7464 if (enc_utf8)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7465 {
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7466 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
7467
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7468 /* 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
7469 * 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
7470 if (clen < totlen)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7471 {
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7472 if (copy)
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7473 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
7474 (size_t)(totlen - clen));
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7475 dst += totlen - clen;
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7476 }
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7477 }
81527f127fb1 Fix: Composing characters in :s substitute text were dropped.
Bram Moolenaar <bram@vim.org>
parents: 2247
diff changeset
7478 src += totlen - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7480 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7481 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7482 if (copy)
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7483 *dst = cc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7484 dst++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7486 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7487 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7488 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7490 clnum = reg_mmatch->startpos[no].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7491 if (clnum < 0 || reg_mmatch->endpos[no].lnum < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7492 s = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7493 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7495 s = reg_getline(clnum) + reg_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7496 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7497 len = reg_mmatch->endpos[no].col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7498 - reg_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7499 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7503 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505 s = reg_match->startp[no];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506 if (reg_match->endp[no] == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7507 s = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7508 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7509 len = (int)(reg_match->endp[no] - s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7511 if (s != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7512 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7514 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7517 if (REG_MULTI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7518 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7519 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7522 *dst = CAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 ++dst;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524 s = reg_getline(++clnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7525 if (reg_mmatch->endpos[no].lnum == clnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 len = reg_mmatch->endpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533 else if (*s == NUL) /* we hit NUL. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7536 EMSG(_(e_re_damg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 goto exit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541 if (backslash && (*s == CAR || *s == '\\'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7542 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 * Insert a backslash in front of a CR, otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7545 * it will be replaced by a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 * Number of backslashes will be halved later,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 * double them here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 dst[0] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7552 dst[1] = *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7553 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7554 dst += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7555 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7556 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7557 {
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7558 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7559 if (has_mbyte)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7560 c = mb_ptr2char(s);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7561 else
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7562 #endif
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7563 c = *s;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7564
4244
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7565 if (func_one != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7566 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7567 func_one = (fptr_T)(func_one(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7568 else if (func_all != (fptr_T)NULL)
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7569 /* Turbo C complains without the typecast */
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7570 func_all = (fptr_T)(func_all(&cc, c));
7faeece39228 updated for version 7.3.873
Bram Moolenaar <bram@vim.org>
parents: 4176
diff changeset
7571 else /* just copy */
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7572 cc = c;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7573
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7574 #ifdef FEAT_MBYTE
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7575 if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 {
1332
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7577 int l;
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7578
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7579 /* Copy composing characters separately, one
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7580 * at a time. */
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7581 if (enc_utf8)
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7582 l = utf_ptr2len(s) - 1;
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7583 else
6d421b3c485b updated for version 7.1-046
vimboss
parents: 1209
diff changeset
7584 l = mb_ptr2len(s) - 1;
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7585
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7586 s += l;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7587 len -= l;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7588 if (copy)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7589 mb_char2bytes(cc, dst);
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7590 dst += mb_char2len(cc) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 }
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7592 else
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7593 #endif
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7594 if (copy)
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7595 *dst = cc;
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7596 dst++;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597 }
772
aaaca5077255 updated for version 7.0226
vimboss
parents: 741
diff changeset
7598
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7599 ++s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7600 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7601 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7602 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7603 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7604 no = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7606 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7607 if (copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7608 *dst = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7610 exit:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7611 return (int)((dst - dest) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7614 #ifdef FEAT_EVAL
2012
b99303b1483f updated for version 7.2-309
vimboss
parents: 2011
diff changeset
7615 static char_u *reg_getline_submatch __ARGS((linenr_T lnum));
b99303b1483f updated for version 7.2-309
vimboss
parents: 2011
diff changeset
7616
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7617 /*
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7618 * Call reg_getline() with the line numbers from the submatch. If a
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7619 * substitute() was used the reg_maxline and other values have been
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7620 * overwritten.
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7621 */
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7622 static char_u *
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7623 reg_getline_submatch(lnum)
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7624 linenr_T lnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7625 {
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7626 char_u *s;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7627 linenr_T save_first = reg_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7628 linenr_T save_max = reg_maxline;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7629
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7630 reg_firstlnum = submatch_firstlnum;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7631 reg_maxline = submatch_maxline;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7632
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7633 s = reg_getline(lnum);
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7634
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7635 reg_firstlnum = save_first;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7636 reg_maxline = save_max;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7637 return s;
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7638 }
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7639
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7640 /*
1209
070f2ac50cf8 updated for version 7.1b
vimboss
parents: 1148
diff changeset
7641 * 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
7642 * allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7643 * Returns NULL when not in a ":s" command and for a non-existing submatch.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7644 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7645 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7646 reg_submatch(no)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7647 int no;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7649 char_u *retval = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7650 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7651 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7652 int round;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7653 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7654
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7655 if (!can_f_submatch || no < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7656 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7658 if (submatch_match == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7659 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7660 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7661 * First round: compute the length and allocate memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7662 * Second round: copy the text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7663 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7664 for (round = 1; round <= 2; ++round)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7665 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7666 lnum = submatch_mmatch->startpos[no].lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7667 if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7668 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7669
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7670 s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7671 if (s == NULL) /* anti-crash check, cannot happen? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7672 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7673 if (submatch_mmatch->endpos[no].lnum == lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7674 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7675 /* Within one line: take form start to end col. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7676 len = submatch_mmatch->endpos[no].col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7677 - submatch_mmatch->startpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7678 if (round == 2)
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 410
diff changeset
7679 vim_strncpy(retval, s, len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7680 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7681 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7682 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7683 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7684 /* Multiple lines: take start line from start col, middle
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7685 * lines completely and end line up to end col. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7686 len = (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7687 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7689 STRCPY(retval, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7690 retval[len] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7692 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7693 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7694 while (lnum < submatch_mmatch->endpos[no].lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7695 {
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7696 s = reg_getline_submatch(lnum++);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7697 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7698 STRCPY(retval + len, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7699 len += (int)STRLEN(s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7700 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7701 retval[len] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7702 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7704 if (round == 2)
2011
a3a4be6bdcdd updated for version 7.2-308
vimboss
parents: 2010
diff changeset
7705 STRNCPY(retval + len, reg_getline_submatch(lnum),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7706 submatch_mmatch->endpos[no].col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7707 len += submatch_mmatch->endpos[no].col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7708 if (round == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7709 retval[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7710 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7711 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7712
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7713 if (retval == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7714 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7715 retval = lalloc((long_u)len, TRUE);
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 798
diff changeset
7716 if (retval == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7717 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7718 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7719 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7720 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7721 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7722 {
1815
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
7723 s = submatch_match->startp[no];
97a73b6f2892 updated for version 7.2-113
vimboss
parents: 1701
diff changeset
7724 if (s == NULL || submatch_match->endp[no] == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7725 retval = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7726 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7727 retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7728 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7729
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7730 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7731 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7732 #endif
4444
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7733
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7734 static regengine_T bt_regengine =
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7735 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7736 bt_regcomp,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7737 bt_regexec,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7738 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7739 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7740 bt_regexec_nl,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7741 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7742 bt_regexec_multi
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7743 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7744 ,(char_u *)""
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7745 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7746 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7747
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7748
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7749 #include "regexp_nfa.c"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7750
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7751 static regengine_T nfa_regengine =
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7752 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7753 nfa_regcomp,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7754 nfa_regexec,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7755 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7756 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7757 nfa_regexec_nl,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7758 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7759 nfa_regexec_multi
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7760 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7761 ,(char_u *)""
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7762 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7763 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7764
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7765 /* 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
7766 * Must match with 'regexpengine'. */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7767 static int regexp_engine = 0;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7768 #define AUTOMATIC_ENGINE 0
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7769 #define BACKTRACKING_ENGINE 1
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7770 #define NFA_ENGINE 2
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7771 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7772 static char_u regname[][30] = {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7773 "AUTOMATIC Regexp Engine",
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7774 "BACKTACKING Regexp Engine",
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7775 "NFA Regexp Engine"
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7776 };
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7777 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7778
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7779 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7780 * Compile a regular expression into internal code.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7781 * Returns the program in allocated memory. Returns NULL for an error.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7782 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7783 regprog_T *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7784 vim_regcomp(expr_arg, re_flags)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7785 char_u *expr_arg;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7786 int re_flags;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7787 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7788 regprog_T *prog = NULL;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7789 char_u *expr = expr_arg;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7790
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7791 syntax_error = FALSE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7792 regexp_engine = p_re;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7793
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7794 /* Check for prefix "\%#=", that sets the regexp engine */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7795 if (STRNCMP(expr, "\\%#=", 4) == 0)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7796 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7797 int newengine = expr[4] - '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7798
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7799 if (newengine == AUTOMATIC_ENGINE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7800 || newengine == BACKTRACKING_ENGINE
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7801 || newengine == NFA_ENGINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7802 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7803 regexp_engine = expr[4] - '0';
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7804 expr += 5;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7805 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7806 EMSG3("New regexp mode selected (%d): %s", regexp_engine,
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7807 regname[newengine]);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7808 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7809 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7810 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7811 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7812 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
7813 regexp_engine = AUTOMATIC_ENGINE;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7814 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7815 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7816 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7817 bt_regengine.expr = expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7818 nfa_regengine.expr = expr;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7819 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7820
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7821 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7822 * 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
7823 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7824 if (regexp_engine != BACKTRACKING_ENGINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7825 prog = nfa_regengine.regcomp(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7826 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7827 prog = bt_regengine.regcomp(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7828
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7829 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
7830 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7831 #ifdef DEBUG
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7832 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
7833 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7834 FILE *f;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7835 f = fopen("debug.log", "a");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7836 if (f)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7837 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7838 if (!syntax_error)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7839 fprintf(f, "NFA engine could not handle \"%s\"\n", expr);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7840 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7841 fprintf(f, "Syntax error in \"%s\"\n", expr);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7842 fclose(f);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7843 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7844 else
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7845 EMSG("(NFA) Could not open \"debug.log\" to write !!!");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7846 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7847 if (syntax_error)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7848 EMSG("NFA Regexp: Syntax Error !");
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7849 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7850 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7851 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7852 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7853 * If NFA engine failed, then revert to the backtracking engine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7854 * Except when there was a syntax error, which was properly handled by
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7855 * NFA engine.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7856 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7857 if (regexp_engine == AUTOMATIC_ENGINE)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7858 if (!syntax_error)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7859 prog = bt_regengine.regcomp(expr, re_flags);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7860
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7861 } /* endif prog==NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7862
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7863
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7864 return prog;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7865 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7866
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7867 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7868 * Match a regexp against a string.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7869 * "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
7870 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7871 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7872 * 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
7873 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7874 int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7875 vim_regexec(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7876 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7877 char_u *line; /* string to match against */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7878 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
7879 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7880 return rmp->regprog->engine->regexec(rmp, line, col);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7881 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7882
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7883 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7884 || defined(FIND_REPLACE_DIALOG) || defined(PROTO)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7885 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7886 * 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
7887 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7888 int
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7889 vim_regexec_nl(rmp, line, col)
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7890 regmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7891 char_u *line;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7892 colnr_T col;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7893 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7894 return rmp->regprog->engine->regexec_nl(rmp, line, col);
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7895 }
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7896 #endif
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7897
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7898 /*
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7899 * Match a regexp against multiple lines.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7900 * "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
7901 * Uses curbuf for line count and 'iskeyword'.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7902 *
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7903 * 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
7904 * match otherwise.
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7905 */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7906 long
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7907 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
7908 regmmatch_T *rmp;
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7909 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
7910 buf_T *buf; /* buffer in which to search */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7911 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
7912 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
7913 proftime_T *tm; /* timeout limit or NULL */
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7914 {
ccecb03e5e8b updated for version 7.3.970
Bram Moolenaar <bram@vim.org>
parents: 4244
diff changeset
7915 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
7916 }