annotate src/regexp_bt.c @ 18019:68fd5296bf73 v8.1.2005

patch 8.1.2005: the regexp.c file is too big Commit: https://github.com/vim/vim/commit/6d7d7cf750bca5d641e464f6a3af5ee5b99a5ac8 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 7 23:16:33 2019 +0200 patch 8.1.2005: the regexp.c file is too big Problem: The regexp.c file is too big. Solution: Move the backtracking engine to a separate file. (Yegappan Lakshmanan, closes #4905)
author Bram Moolenaar <Bram@vim.org>
date Sat, 07 Sep 2019 23:30:04 +0200
parents
children 72524e906658
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18019
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * Backtracking regular expression implementation.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * This file is included in "regexp.c".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * NOTICE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9 * This is NOT the original regular expression code as written by Henry
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 * Spencer. This code has been modified specifically for use with the VIM
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * editor, and should not be used separately from Vim. If you want a good
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 * regular expression library, get the original code. The copyright notice
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13 * that follows is from the original.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15 * END NOTICE
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 * Copyright (c) 1986 by University of Toronto.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 * Written by Henry Spencer. Not derived from licensed software.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 * Permission is granted to anyone to use this software for any
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 * purpose on any computer system, and to redistribute it freely,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 * subject to the following restrictions:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 * 1. The author is not responsible for the consequences of use of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 * this software, no matter how awful, even if they arise
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 * from defects in it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 * 2. The origin of this software must not be misrepresented, either
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 * by explicit claim or by omission.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 * 3. Altered versions must be plainly marked as such, and must not
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 * be misrepresented as being the original software.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 * Beware that some of this code is subtly aware of the way operator
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 * precedence is structured in regular expressions. Serious changes in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 * regular-expression syntax might require a total rethink.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 * Changes have been made by Tony Andrews, Olaf 'Rhialto' Seibert, Robert
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 * Webb, Ciaran McCreesh and Bram Moolenaar.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 * Named character class support added by Walter Briscoe (1998 Jul 01)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 * The "internal use only" fields in regexp.h are present to pass info from
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 * compile to execute that permits the execute phase to run lots faster on
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 * simple cases. They are:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 * regstart char that must begin a match; NUL if none obvious; Can be a
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 * multi-byte character.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 * reganch is the match anchored (at beginning-of-line only)?
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 * regmust string (pointer into program) that match must include, or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 * regmlen length of regmust string
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 * regflags RF_ values or'ed together
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 * Regstart and reganch permit very fast decisions on suitable starting points
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 * for a match, cutting down the work a lot. Regmust permits fast rejection
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 * of lines that cannot possibly match. The regmust tests are costly enough
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 * that vim_regcomp() supplies a regmust only if the r.e. contains something
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 * potentially expensive (at present, the only such thing detected is * or +
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60 * at the start of the r.e., which can involve a lot of backup). Regmlen is
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 * supplied because the test in vim_regexec() needs it and vim_regcomp() is
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 * computing it anyway.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 * Structure for regexp "program". This is essentially a linear encoding
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 * of a nondeterministic finite-state machine (aka syntax charts or
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 * "railroad normal form" in parsing technology). Each node is an opcode
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 * plus a "next" pointer, possibly plus an operand. "Next" pointers of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next"
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 * pointer with a BRANCH on both ends of it is connecting two alternatives.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 * (Here we have one of the subtle syntax dependencies: an individual BRANCH
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 * (as opposed to a collection of them) is never concatenated with anything
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74 * because of operator precedence). The "next" pointer of a BRACES_COMPLEX
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 * node points to the node after the stuff to be repeated.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 * The operand of some types of node is a literal string; for others, it is a
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77 * node leading into a sub-FSM. In particular, the operand of a BRANCH node
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 * is the first node of the branch.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 * (NB this is *not* a tree structure: the tail of the branch connects to the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 * thing following the set of BRANCHes.)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 * pattern is coded like:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 * +-----------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85 * | V
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86 * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87 * | ^ | ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 * +------+ +----------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 * +------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 * V |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93 * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 * | | ^ ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 * | +---------------+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 * +---------------------------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 * +----------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 * V |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 * | | ^ ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 * | +-----------+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104 * +--------------------------------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 * +-------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 * V |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 * | | ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 * | +----------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 * +-----------------------------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 * | | ^ ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
117 * | +----------------+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 * +--------------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 * +---------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 * | V
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123 * | | | | ^ ^
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 * | | | +-----+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125 * | | +----------------+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 * | +---------------------------+ |
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 * +------------------------------------------------------+
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 * They all start with a BRANCH for "\|" alternatives, even when there is only
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
130 * one alternative.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134 * The opcodes are:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137 /* definition number opnd? meaning */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138 #define END 0 /* End of program or NOMATCH operand. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139 #define BOL 1 /* Match "" at beginning of line. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 #define EOL 2 /* Match "" at end of line. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141 #define BRANCH 3 /* node Match this alternative, or the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142 * next... */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143 #define BACK 4 /* Match "", "next" ptr points backward. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 #define EXACTLY 5 /* str Match this string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 #define NOTHING 6 /* Match empty string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146 #define STAR 7 /* node Match this (simple) thing 0 or more
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 * times. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 #define PLUS 8 /* node Match this (simple) thing 1 or more
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 * times. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 #define MATCH 9 /* node match the operand zero-width */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 #define NOMATCH 10 /* node check for no match with operand */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152 #define BEHIND 11 /* node look behind for a match with operand */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 #define NOBEHIND 12 /* node look behind for no match with operand */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
154 #define SUBPAT 13 /* node match the operand here */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 #define BRACE_SIMPLE 14 /* node Match this (simple) thing between m and
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 * n times (\{m,n\}). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 #define BOW 15 /* Match "" after [^a-zA-Z0-9_] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 #define EOW 16 /* Match "" at [^a-zA-Z0-9_] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 #define BRACE_LIMITS 17 /* nr nr define the min & max for BRACE_SIMPLE
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 * and BRACE_COMPLEX. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161 #define NEWL 18 /* Match line-break */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 #define BHPOS 19 /* End position for BEHIND or NOBEHIND */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 /* character classes: 20-48 normal, 50-78 include a line-break */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 #define ADD_NL 30
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167 #define FIRST_NL ANY + ADD_NL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 #define ANY 20 /* Match any one character. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
169 #define ANYOF 21 /* str Match any character in this string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170 #define ANYBUT 22 /* str Match any character not in this
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 * string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 #define IDENT 23 /* Match identifier char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173 #define SIDENT 24 /* Match identifier char but no digit */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 #define KWORD 25 /* Match keyword char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 #define SKWORD 26 /* Match word char but no digit */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 #define FNAME 27 /* Match file name char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 #define SFNAME 28 /* Match file name char but no digit */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 #define PRINT 29 /* Match printable char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179 #define SPRINT 30 /* Match printable char but no digit */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 #define WHITE 31 /* Match whitespace char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 #define NWHITE 32 /* Match non-whitespace char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 #define DIGIT 33 /* Match digit char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 #define NDIGIT 34 /* Match non-digit char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 #define HEX 35 /* Match hex char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 #define NHEX 36 /* Match non-hex char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 #define OCTAL 37 /* Match octal char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 #define NOCTAL 38 /* Match non-octal char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 #define WORD 39 /* Match word char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 #define NWORD 40 /* Match non-word char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 #define HEAD 41 /* Match head char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 #define NHEAD 42 /* Match non-head char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 #define ALPHA 43 /* Match alpha char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 #define NALPHA 44 /* Match non-alpha char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 #define LOWER 45 /* Match lowercase char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 #define NLOWER 46 /* Match non-lowercase char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 #define UPPER 47 /* Match uppercase char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 #define NUPPER 48 /* Match non-uppercase char */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 #define LAST_NL NUPPER + ADD_NL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 #define WITH_NL(op) ((op) >= FIRST_NL && (op) <= LAST_NL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 #define MOPEN 80 /* -89 Mark this point in input as start of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 * \( subexpr. MOPEN + 0 marks start of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 * match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 #define MCLOSE 90 /* -99 Analogous to MOPEN. MCLOSE + 0 marks
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 * end of match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 #define BACKREF 100 /* -109 node Match same string again \1-\9 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 # define ZOPEN 110 /* -119 Mark this point in input as start of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 * \z( subexpr. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 # define ZCLOSE 120 /* -129 Analogous to ZOPEN. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 # define ZREF 130 /* -139 node Match external submatch \z1-\z9 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 #define BRACE_COMPLEX 140 /* -149 node Match nodes between m & n times */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 #define NOPEN 150 /* Mark this point in input as start of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 \%( subexpr. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219 #define NCLOSE 151 /* Analogous to NOPEN. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 #define MULTIBYTECODE 200 /* mbc Match one multi-byte character */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 #define RE_BOF 201 /* Match "" at beginning of file. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 #define RE_EOF 202 /* Match "" at end of file. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 #define CURSOR 203 /* Match location of cursor. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 #define RE_LNUM 204 /* nr cmp Match line number */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 #define RE_COL 205 /* nr cmp Match column number */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228 #define RE_VCOL 206 /* nr cmp Match virtual column number */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 #define RE_MARK 207 /* mark cmp Match mark position */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 #define RE_VISUAL 208 /* Match Visual area */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 #define RE_COMPOSING 209 /* any composing characters */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
233
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
235 * Flags to be passed up and down.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 #define HASWIDTH 0x1 /* Known never to match null string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 #define SIMPLE 0x2 /* Simple enough to be STAR/PLUS operand. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 #define SPSTART 0x4 /* Starts with * or +. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 #define HASNL 0x8 /* Contains some \n. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 #define HASLOOKBH 0x10 /* Contains "\@<=" or "\@<!". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 #define WORST 0 /* Worst case. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 static int num_complex_braces; /* Complex \{...} count */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 static char_u *regcode; /* Code-emit pointer, or JUST_CALC_SIZE */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 static long regsize; /* Code size. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 static int reg_toolong; /* TRUE when offset out of range */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 static char_u had_endbrace[NSUBEXP]; /* flags, TRUE if end of () found */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 static long brace_min[10]; /* Minimums for complex brace repeats */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 static long brace_max[10]; /* Maximums for complex brace repeats */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 static int brace_count[10]; /* Current counts for complex brace repeats */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 static int one_exactly = FALSE; /* only do one char for EXACTLY */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 /* When making changes to classchars also change nfa_classcodes. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 static int classcodes[] = {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 ANY, IDENT, SIDENT, KWORD, SKWORD,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 FNAME, SFNAME, PRINT, SPRINT,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 WHITE, NWHITE, DIGIT, NDIGIT,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 HEX, NHEX, OCTAL, NOCTAL,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261 WORD, NWORD, HEAD, NHEAD,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 ALPHA, NALPHA, LOWER, NLOWER,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
263 UPPER, NUPPER
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
264 };
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 * When regcode is set to this value, code is not emitted and size is computed
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268 * instead.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 #define JUST_CALC_SIZE ((char_u *) -1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 /* Values for rs_state in regitem_T. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 typedef enum regstate_E
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 RS_NOPEN = 0 /* NOPEN and NCLOSE */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 , RS_MOPEN /* MOPEN + [0-9] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
277 , RS_MCLOSE /* MCLOSE + [0-9] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 , RS_ZOPEN /* ZOPEN + [0-9] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 , RS_ZCLOSE /* ZCLOSE + [0-9] */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282 , RS_BRANCH /* BRANCH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283 , RS_BRCPLX_MORE /* BRACE_COMPLEX and trying one more match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 , RS_BRCPLX_LONG /* BRACE_COMPLEX and trying longest match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285 , RS_BRCPLX_SHORT /* BRACE_COMPLEX and trying shortest match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 , RS_NOMATCH /* NOMATCH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 , RS_BEHIND1 /* BEHIND / NOBEHIND matching rest */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 , RS_BEHIND2 /* BEHIND / NOBEHIND matching behind part */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289 , RS_STAR_LONG /* STAR/PLUS/BRACE_SIMPLE longest match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290 , RS_STAR_SHORT /* STAR/PLUS/BRACE_SIMPLE shortest match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 } regstate_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
293 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294 * Structure used to save the current input state, when it needs to be
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 * restored after trying a match. Used by reg_save() and reg_restore().
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296 * Also stores the length of "backpos".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
297 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
298 typedef struct
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 union
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 char_u *ptr; /* rex.input pointer, for single-line regexp */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 lpos_T pos; /* rex.input pos, for multi-line regexp */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
304 } rs_u;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 int rs_len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 } regsave_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
307
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
308 /* struct to save start/end pointer/position in for \(\) */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 typedef struct
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
311 union
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313 char_u *ptr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314 lpos_T pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 } se_u;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 } save_se_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
318 /* used for BEHIND and NOBEHIND matching */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319 typedef struct regbehind_S
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 regsave_T save_after;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 regsave_T save_behind;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
323 int save_need_clear_subexpr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 save_se_T save_start[NSUBEXP];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 save_se_T save_end[NSUBEXP];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326 } regbehind_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329 * When there are alternatives a regstate_T is put on the regstack to remember
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 * what we are doing.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
331 * Before it may be another type of item, depending on rs_state, to remember
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 * more things.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 typedef struct regitem_S
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
336 regstate_T rs_state; // what we are doing, one of RS_ above
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337 short rs_no; // submatch nr or BEHIND/NOBEHIND
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
338 char_u *rs_scan; // current node in program
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 union
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
340 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
341 save_se_T sesave;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 regsave_T regsave;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
343 } rs_un; // room for saving rex.input
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
344 } regitem_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 /* used for STAR, PLUS and BRACE_SIMPLE matching */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
348 typedef struct regstar_S
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 int nextb; /* next byte */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 int nextb_ic; /* next byte reverse case */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352 long count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 long minval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 long maxval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 } regstar_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 /* used to store input position when a BACK was encountered, so that we now if
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 * we made any progress since the last time. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
359 typedef struct backpos_S
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 char_u *bp_scan; /* "scan" where BACK was encountered */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 regsave_T bp_pos; /* last input position */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 } backpos_T;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 * "regstack" and "backpos" are used by regmatch(). They are kept over calls
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 * to avoid invoking malloc() and free() often.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368 * "regstack" is a stack with regitem_T items, sometimes preceded by regstar_T
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 * or regbehind_T.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370 * "backpos_T" is a table with backpos_T for BACK
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 static garray_T regstack = {0, 0, 0, 0, NULL};
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 static garray_T backpos = {0, 0, 0, 0, NULL};
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
374
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 static regsave_T behind_pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 * Both for regstack and backpos tables we use the following strategy of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 * allocation (to reduce malloc/free calls):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380 * - Initial size is fairly small.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
381 * - When needed, the tables are grown bigger (8 times at first, double after
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 * that).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383 * - After executing the match we free the memory only if the array has grown.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
384 * Thus the memory is kept allocated when it's at the initial size.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 * This makes it fast while not keeping a lot of memory allocated.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 * A three times speed increase was observed when using many simple patterns.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 #define REGSTACK_INITIAL 2048
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 #define BACKPOS_INITIAL 64
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 * Opcode notes:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 * BRANCH The set of branches constituting a single choice are hooked
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 * together with their "next" pointers, since precedence prevents
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 * anything being concatenated to any individual branch. The
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 * "next" pointer of the last BRANCH in a choice points to the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 * thing following the whole choice. This is also where the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 * final "next" pointer of each individual branch points; each
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 * branch starts with the operand node of a BRANCH node.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 * BACK Normal "next" pointers all implicitly point forward; BACK
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 * exists to make loop structures possible.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 * STAR,PLUS '=', and complex '*' and '+', are implemented as circular
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 * BRANCH structures using BACK. Simple cases (one character
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 * per match) are implemented with STAR and PLUS for speed
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 * and to minimize recursive plunges.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 * node, and defines the min and max limits to be used for that
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 * node.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414 * MOPEN,MCLOSE ...are numbered at compile time.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 * ZOPEN,ZCLOSE ...ditto
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 * A node is one char of opcode followed by two chars of "next" pointer.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 * "Next" pointers are stored as two 8-bit bytes, high order first. The
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 * value is a positive offset from the opcode of the node containing it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 * An operand, if any, simply follows the node. (Note that much of the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 * code generation knows about this implicit relationship.)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 * Using two bytes for the "next" pointer is vast overkill for most things,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 * but allows patterns to get big without disasters.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 #define OP(p) ((int)*(p))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 #define NEXT(p) (((*((p) + 1) & 0377) << 8) + (*((p) + 2) & 0377))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 #define OPERAND(p) ((p) + 3)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 /* Obtain an operand that was stored as four bytes, MSB first. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432 #define OPERAND_MIN(p) (((long)(p)[3] << 24) + ((long)(p)[4] << 16) \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 + ((long)(p)[5] << 8) + (long)(p)[6])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 /* Obtain a second operand stored as four bytes. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 #define OPERAND_MAX(p) OPERAND_MIN((p) + 4)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 /* Obtain a second single-byte operand stored after a four bytes operand. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 #define OPERAND_CMP(p) (p)[7]
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439 static char_u *reg(int paren, int *flagp);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 #ifdef BT_REGEXP_DUMP
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 static void regdump(char_u *, bt_regprog_T *);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 static int re_num_cmp(long_u val, char_u *scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 static char_u *regprop(char_u *);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 static int regnarrate = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 * Setup to parse the regexp. Used once to get the length and once to do it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 regcomp_start(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 char_u *expr,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 int re_flags) /* see vim_regcomp() */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 initchr(expr);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463 if (re_flags & RE_MAGIC)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464 reg_magic = MAGIC_ON;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 reg_magic = MAGIC_OFF;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 reg_string = (re_flags & RE_STRING);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 reg_strict = (re_flags & RE_STRICT);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 get_cpo_flags();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 num_complex_braces = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 regnpar = 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 vim_memset(had_endbrace, 0, sizeof(had_endbrace));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 regnzpar = 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 re_has_z = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 regsize = 0L;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 reg_toolong = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 regflags = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
481 #if defined(FEAT_SYN_HL) || defined(PROTO)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 had_eol = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 * Return TRUE if MULTIBYTECODE should be used instead of EXACTLY for
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 * character "c".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 use_multibytecode(int c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 return has_mbyte && (*mb_char2len)(c) > 1
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 && (re_multi_type(peekchr()) != NOT_MULTI
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 || (enc_utf8 && utf_iscomposing(c)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499 * Emit (if appropriate) a byte of code
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502 regc(int b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 if (regcode == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 regsize++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 *regcode++ = b;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 * Emit (if appropriate) a multi-byte character of code
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 regmbc(int c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 if (!has_mbyte && c > 0xff)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518 if (regcode == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 regsize += (*mb_char2len)(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 regcode += (*mb_char2bytes)(c, regcode);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 #define REGMBC(x) regmbc(x);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 #define CASEMBC(x) case x:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 * Produce the bytes for equivalence class "c".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 * Currently only handles latin1, latin9 and utf-8.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 * NOTE: When changing this function, also change nfa_emit_equi_class()
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 reg_equi_class(int c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 || STRCMP(p_enc, "iso-8859-15") == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 #ifdef EBCDIC
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 /* This might be slower than switch/case below. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 for (i = 0; i < 16; i++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 if (vim_strchr(EQUIVAL_CLASS_C[i], c) != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546 char *p = EQUIVAL_CLASS_C[i];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 while (*p != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 regmbc(*p++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 #else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 switch (c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556 /* Do not use '\300' style, it results in a negative number. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 case 'A': case 0xc0: case 0xc1: case 0xc2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 case 0xc3: case 0xc4: case 0xc5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
559 CASEMBC(0x100) CASEMBC(0x102) CASEMBC(0x104) CASEMBC(0x1cd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 CASEMBC(0x1de) CASEMBC(0x1e0) CASEMBC(0x1ea2)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 regmbc('A'); regmbc(0xc0); regmbc(0xc1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 regmbc(0xc2); regmbc(0xc3); regmbc(0xc4);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 regmbc(0xc5);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 REGMBC(0x100) REGMBC(0x102) REGMBC(0x104)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 REGMBC(0x1cd) REGMBC(0x1de) REGMBC(0x1e0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 REGMBC(0x1ea2)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 case 'B': CASEMBC(0x1e02) CASEMBC(0x1e06)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 regmbc('B'); REGMBC(0x1e02) REGMBC(0x1e06)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 case 'C': case 0xc7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 CASEMBC(0x106) CASEMBC(0x108) CASEMBC(0x10a) CASEMBC(0x10c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 regmbc('C'); regmbc(0xc7);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 REGMBC(0x106) REGMBC(0x108) REGMBC(0x10a)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 REGMBC(0x10c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 case 'D': CASEMBC(0x10e) CASEMBC(0x110) CASEMBC(0x1e0a)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 CASEMBC(0x1e0e) CASEMBC(0x1e10)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 regmbc('D'); REGMBC(0x10e) REGMBC(0x110)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 REGMBC(0x1e0a) REGMBC(0x1e0e) REGMBC(0x1e10)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 case 'E': case 0xc8: case 0xc9: case 0xca: case 0xcb:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 CASEMBC(0x112) CASEMBC(0x114) CASEMBC(0x116) CASEMBC(0x118)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 CASEMBC(0x11a) CASEMBC(0x1eba) CASEMBC(0x1ebc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 regmbc('E'); regmbc(0xc8); regmbc(0xc9);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 regmbc(0xca); regmbc(0xcb);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 REGMBC(0x112) REGMBC(0x114) REGMBC(0x116)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 REGMBC(0x118) REGMBC(0x11a) REGMBC(0x1eba)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 REGMBC(0x1ebc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 case 'F': CASEMBC(0x1e1e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 regmbc('F'); REGMBC(0x1e1e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594 case 'G': CASEMBC(0x11c) CASEMBC(0x11e) CASEMBC(0x120)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 CASEMBC(0x122) CASEMBC(0x1e4) CASEMBC(0x1e6) CASEMBC(0x1f4)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 CASEMBC(0x1e20)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 regmbc('G'); REGMBC(0x11c) REGMBC(0x11e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598 REGMBC(0x120) REGMBC(0x122) REGMBC(0x1e4)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 REGMBC(0x1e6) REGMBC(0x1f4) REGMBC(0x1e20)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601 case 'H': CASEMBC(0x124) CASEMBC(0x126) CASEMBC(0x1e22)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 CASEMBC(0x1e26) CASEMBC(0x1e28)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 regmbc('H'); REGMBC(0x124) REGMBC(0x126)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 REGMBC(0x1e22) REGMBC(0x1e26) REGMBC(0x1e28)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 case 'I': case 0xcc: case 0xcd: case 0xce: case 0xcf:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 CASEMBC(0x128) CASEMBC(0x12a) CASEMBC(0x12c) CASEMBC(0x12e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 CASEMBC(0x130) CASEMBC(0x1cf) CASEMBC(0x1ec8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 regmbc('I'); regmbc(0xcc); regmbc(0xcd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 regmbc(0xce); regmbc(0xcf);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 REGMBC(0x128) REGMBC(0x12a) REGMBC(0x12c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 REGMBC(0x12e) REGMBC(0x130) REGMBC(0x1cf)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 REGMBC(0x1ec8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 case 'J': CASEMBC(0x134)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 regmbc('J'); REGMBC(0x134)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 case 'K': CASEMBC(0x136) CASEMBC(0x1e8) CASEMBC(0x1e30)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 CASEMBC(0x1e34)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 regmbc('K'); REGMBC(0x136) REGMBC(0x1e8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 REGMBC(0x1e30) REGMBC(0x1e34)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 case 'L': CASEMBC(0x139) CASEMBC(0x13b) CASEMBC(0x13d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 CASEMBC(0x13f) CASEMBC(0x141) CASEMBC(0x1e3a)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625 regmbc('L'); REGMBC(0x139) REGMBC(0x13b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 REGMBC(0x13d) REGMBC(0x13f) REGMBC(0x141)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 REGMBC(0x1e3a)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 case 'M': CASEMBC(0x1e3e) CASEMBC(0x1e40)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 regmbc('M'); REGMBC(0x1e3e) REGMBC(0x1e40)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 case 'N': case 0xd1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 CASEMBC(0x143) CASEMBC(0x145) CASEMBC(0x147) CASEMBC(0x1e44)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 CASEMBC(0x1e48)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 regmbc('N'); regmbc(0xd1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 REGMBC(0x143) REGMBC(0x145) REGMBC(0x147)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 REGMBC(0x1e44) REGMBC(0x1e48)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 case 'O': case 0xd2: case 0xd3: case 0xd4: case 0xd5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 case 0xd6: case 0xd8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 CASEMBC(0x14c) CASEMBC(0x14e) CASEMBC(0x150) CASEMBC(0x1a0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 CASEMBC(0x1d1) CASEMBC(0x1ea) CASEMBC(0x1ec) CASEMBC(0x1ece)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 regmbc('O'); regmbc(0xd2); regmbc(0xd3);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 regmbc(0xd4); regmbc(0xd5); regmbc(0xd6);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 regmbc(0xd8);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 REGMBC(0x14c) REGMBC(0x14e) REGMBC(0x150)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 REGMBC(0x1a0) REGMBC(0x1d1) REGMBC(0x1ea)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 REGMBC(0x1ec) REGMBC(0x1ece)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 case 'P': case 0x1e54: case 0x1e56:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 regmbc('P'); REGMBC(0x1e54) REGMBC(0x1e56)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 case 'R': CASEMBC(0x154) CASEMBC(0x156) CASEMBC(0x158)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 CASEMBC(0x1e58) CASEMBC(0x1e5e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 regmbc('R'); REGMBC(0x154) REGMBC(0x156) REGMBC(0x158)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 REGMBC(0x1e58) REGMBC(0x1e5e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 case 'S': CASEMBC(0x15a) CASEMBC(0x15c) CASEMBC(0x15e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 CASEMBC(0x160) CASEMBC(0x1e60)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 regmbc('S'); REGMBC(0x15a) REGMBC(0x15c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 REGMBC(0x15e) REGMBC(0x160) REGMBC(0x1e60)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 case 'T': CASEMBC(0x162) CASEMBC(0x164) CASEMBC(0x166)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 CASEMBC(0x1e6a) CASEMBC(0x1e6e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 regmbc('T'); REGMBC(0x162) REGMBC(0x164)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 REGMBC(0x166) REGMBC(0x1e6a) REGMBC(0x1e6e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 case 'U': case 0xd9: case 0xda: case 0xdb: case 0xdc:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 CASEMBC(0x168) CASEMBC(0x16a) CASEMBC(0x16c) CASEMBC(0x16e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 CASEMBC(0x170) CASEMBC(0x172) CASEMBC(0x1af) CASEMBC(0x1d3)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 CASEMBC(0x1ee6)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 regmbc('U'); regmbc(0xd9); regmbc(0xda);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 regmbc(0xdb); regmbc(0xdc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 REGMBC(0x168) REGMBC(0x16a) REGMBC(0x16c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 REGMBC(0x16e) REGMBC(0x170) REGMBC(0x172)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 REGMBC(0x1af) REGMBC(0x1d3) REGMBC(0x1ee6)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 case 'V': CASEMBC(0x1e7c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 regmbc('V'); REGMBC(0x1e7c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 case 'W': CASEMBC(0x174) CASEMBC(0x1e80) CASEMBC(0x1e82)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 CASEMBC(0x1e84) CASEMBC(0x1e86)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 regmbc('W'); REGMBC(0x174) REGMBC(0x1e80)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 REGMBC(0x1e82) REGMBC(0x1e84) REGMBC(0x1e86)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 case 'X': CASEMBC(0x1e8a) CASEMBC(0x1e8c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 regmbc('X'); REGMBC(0x1e8a) REGMBC(0x1e8c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 case 'Y': case 0xdd:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 CASEMBC(0x176) CASEMBC(0x178) CASEMBC(0x1e8e) CASEMBC(0x1ef2)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 CASEMBC(0x1ef6) CASEMBC(0x1ef8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 regmbc('Y'); regmbc(0xdd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 REGMBC(0x176) REGMBC(0x178) REGMBC(0x1e8e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 REGMBC(0x1ef2) REGMBC(0x1ef6) REGMBC(0x1ef8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 case 'Z': CASEMBC(0x179) CASEMBC(0x17b) CASEMBC(0x17d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 CASEMBC(0x1b5) CASEMBC(0x1e90) CASEMBC(0x1e94)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 regmbc('Z'); REGMBC(0x179) REGMBC(0x17b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 REGMBC(0x17d) REGMBC(0x1b5) REGMBC(0x1e90)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 REGMBC(0x1e94)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 case 'a': case 0xe0: case 0xe1: case 0xe2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 case 0xe3: case 0xe4: case 0xe5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 CASEMBC(0x101) CASEMBC(0x103) CASEMBC(0x105) CASEMBC(0x1ce)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 CASEMBC(0x1df) CASEMBC(0x1e1) CASEMBC(0x1ea3)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 regmbc('a'); regmbc(0xe0); regmbc(0xe1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 regmbc(0xe2); regmbc(0xe3); regmbc(0xe4);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 regmbc(0xe5);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 REGMBC(0x101) REGMBC(0x103) REGMBC(0x105)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 REGMBC(0x1ce) REGMBC(0x1df) REGMBC(0x1e1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 REGMBC(0x1ea3)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 case 'b': CASEMBC(0x1e03) CASEMBC(0x1e07)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 regmbc('b'); REGMBC(0x1e03) REGMBC(0x1e07)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 case 'c': case 0xe7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 CASEMBC(0x107) CASEMBC(0x109) CASEMBC(0x10b) CASEMBC(0x10d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 regmbc('c'); regmbc(0xe7);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 REGMBC(0x107) REGMBC(0x109) REGMBC(0x10b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 REGMBC(0x10d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 case 'd': CASEMBC(0x10f) CASEMBC(0x111) CASEMBC(0x1e0b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 CASEMBC(0x1e0f) CASEMBC(0x1e11)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 regmbc('d'); REGMBC(0x10f) REGMBC(0x111)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 REGMBC(0x1e0b) REGMBC(0x1e0f) REGMBC(0x1e11)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 case 'e': case 0xe8: case 0xe9: case 0xea: case 0xeb:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 CASEMBC(0x113) CASEMBC(0x115) CASEMBC(0x117) CASEMBC(0x119)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 CASEMBC(0x11b) CASEMBC(0x1ebb) CASEMBC(0x1ebd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 regmbc('e'); regmbc(0xe8); regmbc(0xe9);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 regmbc(0xea); regmbc(0xeb);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 REGMBC(0x113) REGMBC(0x115) REGMBC(0x117)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 REGMBC(0x119) REGMBC(0x11b) REGMBC(0x1ebb)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 REGMBC(0x1ebd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 case 'f': CASEMBC(0x1e1f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 regmbc('f'); REGMBC(0x1e1f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 case 'g': CASEMBC(0x11d) CASEMBC(0x11f) CASEMBC(0x121)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 CASEMBC(0x123) CASEMBC(0x1e5) CASEMBC(0x1e7) CASEMBC(0x1f5)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 CASEMBC(0x1e21)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 regmbc('g'); REGMBC(0x11d) REGMBC(0x11f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 REGMBC(0x121) REGMBC(0x123) REGMBC(0x1e5)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 REGMBC(0x1e7) REGMBC(0x1f5) REGMBC(0x1e21)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 case 'h': CASEMBC(0x125) CASEMBC(0x127) CASEMBC(0x1e23)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 CASEMBC(0x1e27) CASEMBC(0x1e29) CASEMBC(0x1e96)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 regmbc('h'); REGMBC(0x125) REGMBC(0x127)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 REGMBC(0x1e23) REGMBC(0x1e27) REGMBC(0x1e29)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 REGMBC(0x1e96)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 case 'i': case 0xec: case 0xed: case 0xee: case 0xef:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 CASEMBC(0x129) CASEMBC(0x12b) CASEMBC(0x12d) CASEMBC(0x12f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 CASEMBC(0x1d0) CASEMBC(0x1ec9)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 regmbc('i'); regmbc(0xec); regmbc(0xed);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756 regmbc(0xee); regmbc(0xef);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 REGMBC(0x129) REGMBC(0x12b) REGMBC(0x12d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758 REGMBC(0x12f) REGMBC(0x1d0) REGMBC(0x1ec9)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 case 'j': CASEMBC(0x135) CASEMBC(0x1f0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 regmbc('j'); REGMBC(0x135) REGMBC(0x1f0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 case 'k': CASEMBC(0x137) CASEMBC(0x1e9) CASEMBC(0x1e31)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 CASEMBC(0x1e35)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 regmbc('k'); REGMBC(0x137) REGMBC(0x1e9)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 REGMBC(0x1e31) REGMBC(0x1e35)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 case 'l': CASEMBC(0x13a) CASEMBC(0x13c) CASEMBC(0x13e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 CASEMBC(0x140) CASEMBC(0x142) CASEMBC(0x1e3b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 regmbc('l'); REGMBC(0x13a) REGMBC(0x13c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
771 REGMBC(0x13e) REGMBC(0x140) REGMBC(0x142)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772 REGMBC(0x1e3b)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 case 'm': CASEMBC(0x1e3f) CASEMBC(0x1e41)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 regmbc('m'); REGMBC(0x1e3f) REGMBC(0x1e41)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777 case 'n': case 0xf1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 CASEMBC(0x144) CASEMBC(0x146) CASEMBC(0x148) CASEMBC(0x149)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 CASEMBC(0x1e45) CASEMBC(0x1e49)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 regmbc('n'); regmbc(0xf1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 REGMBC(0x144) REGMBC(0x146) REGMBC(0x148)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 REGMBC(0x149) REGMBC(0x1e45) REGMBC(0x1e49)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 case 'o': case 0xf2: case 0xf3: case 0xf4: case 0xf5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 case 0xf6: case 0xf8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 CASEMBC(0x14d) CASEMBC(0x14f) CASEMBC(0x151) CASEMBC(0x1a1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 CASEMBC(0x1d2) CASEMBC(0x1eb) CASEMBC(0x1ed) CASEMBC(0x1ecf)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 regmbc('o'); regmbc(0xf2); regmbc(0xf3);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 regmbc(0xf4); regmbc(0xf5); regmbc(0xf6);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 regmbc(0xf8);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791 REGMBC(0x14d) REGMBC(0x14f) REGMBC(0x151)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 REGMBC(0x1a1) REGMBC(0x1d2) REGMBC(0x1eb)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 REGMBC(0x1ed) REGMBC(0x1ecf)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 case 'p': CASEMBC(0x1e55) CASEMBC(0x1e57)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 regmbc('p'); REGMBC(0x1e55) REGMBC(0x1e57)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 case 'r': CASEMBC(0x155) CASEMBC(0x157) CASEMBC(0x159)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 CASEMBC(0x1e59) CASEMBC(0x1e5f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 regmbc('r'); REGMBC(0x155) REGMBC(0x157) REGMBC(0x159)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 REGMBC(0x1e59) REGMBC(0x1e5f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 case 's': CASEMBC(0x15b) CASEMBC(0x15d) CASEMBC(0x15f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 CASEMBC(0x161) CASEMBC(0x1e61)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 regmbc('s'); REGMBC(0x15b) REGMBC(0x15d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 REGMBC(0x15f) REGMBC(0x161) REGMBC(0x1e61)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 case 't': CASEMBC(0x163) CASEMBC(0x165) CASEMBC(0x167)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 CASEMBC(0x1e6b) CASEMBC(0x1e6f) CASEMBC(0x1e97)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810 regmbc('t'); REGMBC(0x163) REGMBC(0x165) REGMBC(0x167)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 REGMBC(0x1e6b) REGMBC(0x1e6f) REGMBC(0x1e97)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 case 'u': case 0xf9: case 0xfa: case 0xfb: case 0xfc:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 CASEMBC(0x169) CASEMBC(0x16b) CASEMBC(0x16d) CASEMBC(0x16f)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 CASEMBC(0x171) CASEMBC(0x173) CASEMBC(0x1b0) CASEMBC(0x1d4)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 CASEMBC(0x1ee7)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 regmbc('u'); regmbc(0xf9); regmbc(0xfa);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 regmbc(0xfb); regmbc(0xfc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 REGMBC(0x169) REGMBC(0x16b) REGMBC(0x16d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 REGMBC(0x16f) REGMBC(0x171) REGMBC(0x173)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 REGMBC(0x1b0) REGMBC(0x1d4) REGMBC(0x1ee7)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 case 'v': CASEMBC(0x1e7d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 regmbc('v'); REGMBC(0x1e7d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 case 'w': CASEMBC(0x175) CASEMBC(0x1e81) CASEMBC(0x1e83)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 CASEMBC(0x1e85) CASEMBC(0x1e87) CASEMBC(0x1e98)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 regmbc('w'); REGMBC(0x175) REGMBC(0x1e81)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 REGMBC(0x1e83) REGMBC(0x1e85) REGMBC(0x1e87)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830 REGMBC(0x1e98)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 case 'x': CASEMBC(0x1e8b) CASEMBC(0x1e8d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 regmbc('x'); REGMBC(0x1e8b) REGMBC(0x1e8d)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 case 'y': case 0xfd: case 0xff:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 CASEMBC(0x177) CASEMBC(0x1e8f) CASEMBC(0x1e99)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 CASEMBC(0x1ef3) CASEMBC(0x1ef7) CASEMBC(0x1ef9)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 regmbc('y'); regmbc(0xfd); regmbc(0xff);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 REGMBC(0x177) REGMBC(0x1e8f) REGMBC(0x1e99)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 REGMBC(0x1ef3) REGMBC(0x1ef7) REGMBC(0x1ef9)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 case 'z': CASEMBC(0x17a) CASEMBC(0x17c) CASEMBC(0x17e)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 CASEMBC(0x1b6) CASEMBC(0x1e91) CASEMBC(0x1e95)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 regmbc('z'); REGMBC(0x17a) REGMBC(0x17c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 REGMBC(0x17e) REGMBC(0x1b6) REGMBC(0x1e91)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 REGMBC(0x1e95)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 regmbc(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 * Emit a node.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 * Return pointer to generated code.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 regnode(int op)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 char_u *ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 ret = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
864 if (ret == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 regsize += 3;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 *regcode++ = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 *regcode++ = NUL; /* Null "next" pointer. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 *regcode++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 * Write a long as four bytes at "p" and return pointer to the next char.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 re_put_long(char_u *p, long_u val)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 *p++ = (char_u) ((val >> 24) & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 *p++ = (char_u) ((val >> 16) & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 *p++ = (char_u) ((val >> 8) & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 *p++ = (char_u) (val & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 return p;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 * regnext - dig the "next" pointer out of a node
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 * Returns NULL when calculating size, when there is no next item and when
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 * there is an error.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 regnext(char_u *p)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896 int offset;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 if (p == JUST_CALC_SIZE || reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 offset = NEXT(p);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 if (offset == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 if (OP(p) == BACK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
906 return p - offset;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 return p + offset;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 * Set the next-pointer at the end of a node chain.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 regtail(char_u *p, char_u *val)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917 char_u *scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 char_u *temp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 int offset;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 if (p == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 /* Find last node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 scan = p;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 temp = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 if (temp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 scan = temp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 if (OP(scan) == BACK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 offset = (int)(scan - val);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 offset = (int)(val - scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 /* When the offset uses more than 16 bits it can no longer fit in the two
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 * bytes available. Use a global flag to avoid having to check return
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 * values in too many places. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 if (offset > 0xffff)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 reg_toolong = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946 *(scan + 2) = (char_u) (offset & 0377);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 * Like regtail, on item after a BRANCH; nop if none.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 regoptail(char_u *p, char_u *val)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 /* When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 if (p == NULL || p == JUST_CALC_SIZE
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 || (OP(p) != BRANCH
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 regtail(OPERAND(p), val);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 * Insert an operator in front of already-emitted operand
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 * Means relocating the operand.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 reginsert(int op, char_u *opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 char_u *src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 char_u *dst;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 char_u *place;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 if (regcode == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 regsize += 3;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 src = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 regcode += 3;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 dst = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 while (src > opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 *--dst = *--src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 place = opnd; /* Op node, where operand used to be. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 *place++ = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 *place++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 *place = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 * Insert an operator in front of already-emitted operand.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 * Add a number to the operator.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 reginsert_nr(int op, long val, char_u *opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 char_u *src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001 char_u *dst;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 char_u *place;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 if (regcode == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 regsize += 7;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 src = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 regcode += 7;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 dst = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 while (src > opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 *--dst = *--src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 place = opnd; /* Op node, where operand used to be. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 *place++ = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 *place++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 *place++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 re_put_long(place, (long_u)val);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 * Insert an operator in front of already-emitted operand.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 * The operator has the given limit values as operands. Also set next pointer.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 * Means relocating the operand.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 reginsert_limits(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 int op,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 long minval,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 long maxval,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 char_u *opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 char_u *src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 char_u *dst;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 char_u *place;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 if (regcode == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 regsize += 11;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 src = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 regcode += 11;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 dst = regcode;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 while (src > opnd)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 *--dst = *--src;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 place = opnd; /* Op node, where operand used to be. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 *place++ = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 *place++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 *place++ = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 place = re_put_long(place, (long_u)minval);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 place = re_put_long(place, (long_u)maxval);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 regtail(opnd, place);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 * Return TRUE if the back reference is legal. We must have seen the close
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061 * brace.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 * TODO: Should also check that we don't refer to something that is repeated
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 * (+*=): what instance of the repetition should we match?
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 seen_endbrace(int refnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068 if (!had_endbrace[refnum])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 char_u *p;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 /* Trick: check if "@<=" or "@<!" follows, in which case
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 * the \1 can appear before the referenced match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074 for (p = regparse; *p != NUL; ++p)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075 if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '='))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077 if (*p == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 emsg(_("E65: Illegal back reference"));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 rc_did_emsg = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081 return FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 return TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 * Parse the lowest level.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 * Optimization: gobbles an entire sequence of ordinary characters so that
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 * it can turn them into a single node, which is smaller to store and
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092 * faster to run. Don't do this when one_exactly is set.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095 regatom(int *flagp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 char_u *ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 int c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 char_u *p;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 int extra = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 int save_prev_at_start = prev_at_start;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 *flagp = WORST; /* Tentatively. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107 switch (c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 case Magic('^'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110 ret = regnode(BOL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113 case Magic('$'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 ret = regnode(EOL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1115 #if defined(FEAT_SYN_HL) || defined(PROTO)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116 had_eol = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120 case Magic('<'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 ret = regnode(BOW);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 case Magic('>'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 ret = regnode(EOW);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 case Magic('_'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 c = no_Magic(getchr());
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 if (c == '^') /* "\_^" is start-of-line */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 ret = regnode(BOL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 if (c == '$') /* "\_$" is end-of-line */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 ret = regnode(EOL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 #if defined(FEAT_SYN_HL) || defined(PROTO)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 had_eol = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 extra = ADD_NL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 *flagp |= HASNL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 /* "\_[" is character range plus newline */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 if (c == '[')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 goto collection;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 /* "\_x" is character class plus newline */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 * Character classes.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 case Magic('.'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 case Magic('i'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 case Magic('I'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 case Magic('k'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 case Magic('K'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 case Magic('f'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 case Magic('F'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 case Magic('p'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 case Magic('P'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 case Magic('s'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 case Magic('S'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168 case Magic('d'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 case Magic('D'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 case Magic('x'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 case Magic('X'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 case Magic('o'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 case Magic('O'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 case Magic('w'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 case Magic('W'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 case Magic('h'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 case Magic('H'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178 case Magic('a'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 case Magic('A'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 case Magic('l'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 case Magic('L'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 case Magic('u'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 case Magic('U'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 p = vim_strchr(classchars, no_Magic(c));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 if (p == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 EMSG_RET_NULL(_("E63: invalid use of \\_"));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 /* When '.' is followed by a composing char ignore the dot, so that
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 * the composing char is matched here. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr()))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 goto do_multibyte;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 ret = regnode(classcodes[p - classchars] + extra);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 *flagp |= HASWIDTH | SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 case Magic('n'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 if (reg_string)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 /* In a string "\n" matches a newline character. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 ret = regnode(EXACTLY);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 regc(NL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 regc(NUL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 *flagp |= HASWIDTH | SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 /* In buffer text "\n" matches the end of a line. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 ret = regnode(NEWL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 *flagp |= HASWIDTH | HASNL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 case Magic('('):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 if (one_exactly)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 EMSG_ONE_RET_NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 ret = reg(REG_PAREN, &flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 case NUL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 case Magic('|'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 case Magic('&'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 case Magic(')'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229 if (one_exactly)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 EMSG_ONE_RET_NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 IEMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 /* NOTREACHED */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 case Magic('='):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 case Magic('?'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 case Magic('+'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 case Magic('@'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 case Magic('{'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 case Magic('*'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 c = no_Magic(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 EMSG3_RET_NULL(_("E64: %s%c follows nothing"),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 (c == '*' ? reg_magic >= MAGIC_ON : reg_magic == MAGIC_ALL), c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 /* NOTREACHED */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 case Magic('~'): /* previous substitute pattern */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 if (reg_prev_sub != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 char_u *lp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 ret = regnode(EXACTLY);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 lp = reg_prev_sub;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 while (*lp != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 regc(*lp++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 regc(NUL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 if (*reg_prev_sub != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 *flagp |= HASWIDTH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 if ((lp - reg_prev_sub) == 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 *flagp |= SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263 EMSG_RET_NULL(_(e_nopresub));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 case Magic('1'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267 case Magic('2'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 case Magic('3'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 case Magic('4'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 case Magic('5'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 case Magic('6'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 case Magic('7'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 case Magic('8'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 case Magic('9'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 int refnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278 refnum = c - Magic('0');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 if (!seen_endbrace(refnum))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 ret = regnode(BACKREF + refnum);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 case Magic('z'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 c = no_Magic(getchr());
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 switch (c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 case '(': if ((reg_do_extmatch & REX_SET) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 EMSG_RET_NULL(_(e_z_not_allowed));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 if (one_exactly)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294 EMSG_ONE_RET_NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 ret = reg(REG_ZPAREN, &flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1297 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 *flagp |= flags & (HASWIDTH|SPSTART|HASNL|HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 re_has_z = REX_SET;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 case '1':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 case '2':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304 case '3':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 case '4':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 case '5':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 case '6':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 case '7':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 case '8':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 case '9': if ((reg_do_extmatch & REX_USE) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 EMSG_RET_NULL(_(e_z1_not_allowed));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 ret = regnode(ZREF + c - '0');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 re_has_z = REX_USE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1315 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 case 's': ret = regnode(MOPEN + 0);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 if (re_mult_next("\\zs") == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1320 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322 case 'e': ret = regnode(MCLOSE + 0);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1323 if (re_mult_next("\\ze") == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 default: EMSG_RET_NULL(_("E68: Invalid character after \\z"));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 case Magic('%'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 c = no_Magic(getchr());
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 switch (c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 /* () without a back reference */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 case '(':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 if (one_exactly)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 EMSG_ONE_RET_NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341 ret = reg(REG_NPAREN, &flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344 *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347 /* Catch \%^ and \%$ regardless of where they appear in the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1348 * pattern -- regardless of whether or not it makes sense. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1349 case '^':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1350 ret = regnode(RE_BOF);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 case '$':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1354 ret = regnode(RE_EOF);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357 case '#':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 ret = regnode(CURSOR);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1359 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1360
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1361 case 'V':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362 ret = regnode(RE_VISUAL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1363 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1364
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365 case 'C':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1366 ret = regnode(RE_COMPOSING);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1367 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1368
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1369 /* \%[abc]: Emit as a list of branches, all ending at the last
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370 * branch which matches nothing. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1371 case '[':
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372 if (one_exactly) /* doesn't nest */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1373 EMSG_ONE_RET_NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1374 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375 char_u *lastbranch;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 char_u *lastnode = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1377 char_u *br;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1378
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379 ret = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1380 while ((c = getchr()) != ']')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1382 if (c == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 EMSG2_RET_NULL(_(e_missing_sb),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1385 br = regnode(BRANCH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1387 ret = br;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1388 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1389 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1390 regtail(lastnode, br);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1391 if (reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1395 ungetchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1396 one_exactly = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1397 lastnode = regatom(flagp);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1398 one_exactly = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1399 if (lastnode == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1400 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1401 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1402 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1403 EMSG2_RET_NULL(_(e_empty_sb),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1404 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405 lastbranch = regnode(BRANCH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1406 br = regnode(NOTHING);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1407 if (ret != JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1408 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1409 regtail(lastnode, br);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 regtail(lastbranch, br);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1411 /* connect all branches to the NOTHING
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1412 * branch at the end */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1413 for (br = ret; br != lastnode; )
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1414 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1415 if (OP(br) == BRANCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1416 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1417 regtail(br, lastbranch);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 if (reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1420 br = OPERAND(br);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1423 br = regnext(br);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1424 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1425 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1426 *flagp &= ~(HASWIDTH | SIMPLE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1428 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1429
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1430 case 'd': /* %d123 decimal */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1431 case 'o': /* %o123 octal */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1432 case 'x': /* %xab hex 2 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1433 case 'u': /* %uabcd hex 4 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 case 'U': /* %U1234abcd hex 8 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1435 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1436 long i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1437
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1438 switch (c)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1440 case 'd': i = getdecchrs(); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441 case 'o': i = getoctchrs(); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1442 case 'x': i = gethexchrs(2); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1443 case 'u': i = gethexchrs(4); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444 case 'U': i = gethexchrs(8); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1445 default: i = -1; break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1446 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1447
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1448 if (i < 0 || i > INT_MAX)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1449 EMSG2_RET_NULL(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1450 _("E678: Invalid character after %s%%[dxouU]"),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1451 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1452 if (use_multibytecode(i))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1453 ret = regnode(MULTIBYTECODE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1454 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1455 ret = regnode(EXACTLY);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1456 if (i == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1457 regc(0x0a);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1458 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1459 regmbc(i);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1460 regc(NUL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1461 *flagp |= HASWIDTH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1462 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1463 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1464
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1465 default:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1466 if (VIM_ISDIGIT(c) || c == '<' || c == '>'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1467 || c == '\'')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1468 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1469 long_u n = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1470 int cmp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1471
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1472 cmp = c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1473 if (cmp == '<' || cmp == '>')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1474 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1475 while (VIM_ISDIGIT(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1476 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1477 n = n * 10 + (c - '0');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1478 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1479 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1480 if (c == '\'' && n == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1481 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1482 /* "\%'m", "\%<'m" and "\%>'m": Mark */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1483 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1484 ret = regnode(RE_MARK);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1485 if (ret == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1486 regsize += 2;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1487 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1489 *regcode++ = c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1490 *regcode++ = cmp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1491 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1492 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1493 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1494 else if (c == 'l' || c == 'c' || c == 'v')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1495 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1496 if (c == 'l')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1497 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1498 ret = regnode(RE_LNUM);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1499 if (save_prev_at_start)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1500 at_start = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502 else if (c == 'c')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 ret = regnode(RE_COL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1504 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1505 ret = regnode(RE_VCOL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1506 if (ret == JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 regsize += 5;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1508 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1509 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 /* put the number and the optional
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1511 * comparator after the opcode */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1512 regcode = re_put_long(regcode, n);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1513 *regcode++ = cmp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1514 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1515 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1517 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1518
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1519 EMSG2_RET_NULL(_("E71: Invalid character after %s%%"),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1520 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1521 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1522 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1523 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1524
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1525 case Magic('['):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1526 collection:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1527 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1528 char_u *lp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1529
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1530 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1531 * If there is no matching ']', we assume the '[' is a normal
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1532 * character. This makes 'incsearch' and ":help [" work.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1533 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1534 lp = skip_anyof(regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1535 if (*lp == ']') /* there is a matching ']' */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1536 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1537 int startc = -1; /* > 0 when next '-' is a range */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538 int endc;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1540 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1541 * In a character class, different parsing rules apply.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542 * Not even \ is special anymore, nothing is.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1543 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1544 if (*regparse == '^') /* Complement of range. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1545 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1546 ret = regnode(ANYBUT + extra);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1547 regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1548 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1549 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1550 ret = regnode(ANYOF + extra);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1551
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1552 /* At the start ']' and '-' mean the literal character. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1553 if (*regparse == ']' || *regparse == '-')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1554 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 startc = *regparse;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1556 regc(*regparse++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1557 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1558
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 while (*regparse != NUL && *regparse != ']')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1560 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1561 if (*regparse == '-')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1562 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 ++regparse;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 /* The '-' is not used for a range at the end and
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1565 * after or before a '\n'. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566 if (*regparse == ']' || *regparse == NUL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1567 || startc == -1
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1568 || (regparse[0] == '\\' && regparse[1] == 'n'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1569 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1570 regc('-');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571 startc = '-'; /* [--x] is a range */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1572 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1573 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1574 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1575 /* Also accept "a-[.z.]" */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1576 endc = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1577 if (*regparse == '[')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1578 endc = get_coll_element(&regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1579 if (endc == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1580 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1581 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1582 endc = mb_ptr2char_adv(&regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1583 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1584 endc = *regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1585 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1586
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1587 /* Handle \o40, \x20 and \u20AC style sequences */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1588 if (endc == '\\' && !reg_cpo_lit && !reg_cpo_bsl)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1589 endc = coll_get_char();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1590
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1591 if (startc > endc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1592 EMSG_RET_NULL(_(e_reverse_range));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1593 if (has_mbyte && ((*mb_char2len)(startc) > 1
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1594 || (*mb_char2len)(endc) > 1))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1595 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1596 /* Limit to a range of 256 chars. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1597 if (endc > startc + 256)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1598 EMSG_RET_NULL(_(e_large_class));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1599 while (++startc <= endc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 regmbc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1601 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1603 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 #ifdef EBCDIC
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605 int alpha_only = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1607 /* for alphabetical range skip the gaps
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1608 * 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1609 if (isalpha(startc) && isalpha(endc))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1610 alpha_only = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1611 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 while (++startc <= endc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1613 #ifdef EBCDIC
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614 if (!alpha_only || isalpha(startc))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616 regc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1618 startc = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1620 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1621 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622 * Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 * accepts "\t", "\e", etc., but only when the 'l' flag in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1624 * 'cpoptions' is not included.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1625 * Posix doesn't recognize backslash at all.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1626 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627 else if (*regparse == '\\'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1628 && !reg_cpo_bsl
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1630 || (!reg_cpo_lit
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 && vim_strchr(REGEXP_ABBR,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632 regparse[1]) != NULL)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1634 regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 if (*regparse == 'n')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637 /* '\n' in range: also match NL */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1638 if (ret != JUST_CALC_SIZE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1639 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1640 /* Using \n inside [^] does not change what
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 * matches. "[^\n]" is the same as ".". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1642 if (*ret == ANYOF)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1643 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644 *ret = ANYOF + ADD_NL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 *flagp |= HASNL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1646 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1647 /* else: must have had a \n already */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1648 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1649 regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1650 startc = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1651 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1652 else if (*regparse == 'd'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653 || *regparse == 'o'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654 || *regparse == 'x'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1655 || *regparse == 'u'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1656 || *regparse == 'U')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1657 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1658 startc = coll_get_char();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1659 if (startc == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 regc(0x0a);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1661 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1662 regmbc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1663 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666 startc = backslash_trans(*regparse++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 regc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1668 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 else if (*regparse == '[')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1672 int c_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673 int cu;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1674
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1675 c_class = get_char_class(&regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 startc = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1677 /* Characters assumed to be 8 bits! */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 switch (c_class)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1679 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 case CLASS_NONE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1681 c_class = get_equi_class(&regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 if (c_class != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1683 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1684 /* produce equivalence class */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1685 reg_equi_class(c_class);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 else if ((c_class =
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 get_coll_element(&regparse)) != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1689 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690 /* produce a collating element */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 regmbc(c_class);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1692 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695 /* literal '[', allow [[-x] as a range */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 startc = *regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1697 regc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 case CLASS_ALNUM:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701 for (cu = 1; cu < 128; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 if (isalnum(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1703 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1704 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1705 case CLASS_ALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1706 for (cu = 1; cu < 128; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1707 if (isalpha(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1708 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 case CLASS_BLANK:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1711 regc(' ');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1712 regc('\t');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1713 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1714 case CLASS_CNTRL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715 for (cu = 1; cu <= 127; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716 if (iscntrl(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1717 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1719 case CLASS_DIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1720 for (cu = 1; cu <= 127; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1721 if (VIM_ISDIGIT(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1722 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1723 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 case CLASS_GRAPH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1725 for (cu = 1; cu <= 127; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1726 if (isgraph(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1727 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1728 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1729 case CLASS_LOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1730 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1731 if (MB_ISLOWER(cu) && cu != 170
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1732 && cu != 186)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1733 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1734 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1735 case CLASS_PRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1736 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737 if (vim_isprintc(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1739 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1740 case CLASS_PUNCT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1741 for (cu = 1; cu < 128; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1742 if (ispunct(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1743 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1744 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1745 case CLASS_SPACE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1746 for (cu = 9; cu <= 13; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1747 regc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1748 regc(' ');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1750 case CLASS_UPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1751 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1752 if (MB_ISUPPER(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1753 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1754 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1755 case CLASS_XDIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1757 if (vim_isxdigit(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1758 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1759 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1760 case CLASS_TAB:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761 regc('\t');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1762 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 case CLASS_RETURN:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1764 regc('\r');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1766 case CLASS_BACKSPACE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1767 regc('\b');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1769 case CLASS_ESCAPE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 regc('\033');
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772 case CLASS_IDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1774 if (vim_isIDc(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1775 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1776 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 case CLASS_KEYWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779 if (reg_iswordc(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 case CLASS_FNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783 for (cu = 1; cu <= 255; cu++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1784 if (vim_isfilec(cu))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 regmbc(cu);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1788 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1789 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1790 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1791 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1792 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1793 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1794
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795 /* produce a multibyte character, including any
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 * following composing characters */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1797 startc = mb_ptr2char(regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 len = (*mb_ptr2len)(regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1799 if (enc_utf8 && utf_char2len(startc) != len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 startc = -1; /* composing chars */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1801 while (--len >= 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 regc(*regparse++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1803 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1804 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 startc = *regparse++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 regc(startc);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1811 regc(NUL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 prevchr_len = 1; /* last char was the ']' */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 if (*regparse != ']')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 EMSG_RET_NULL(_(e_toomsbra)); /* Cannot happen? */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815 skipchr(); /* let's be friends with the lexer again */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816 *flagp |= HASWIDTH | SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1817 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1818 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1819 else if (reg_strict)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1820 EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1821 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1822 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1823
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1824 default:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1825 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1826 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1827
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1828 /* A multi-byte character is handled as a separate atom if it's
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1829 * before a multi and when it's a composing char. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1830 if (use_multibytecode(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1831 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1832 do_multibyte:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1833 ret = regnode(MULTIBYTECODE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1834 regmbc(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1835 *flagp |= HASWIDTH | SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1836 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1837 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1838
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1839 ret = regnode(EXACTLY);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1840
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1841 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1842 * Append characters as long as:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1843 * - there is no following multi, we then need the character in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1844 * front of it as a single character operand
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1845 * - not running into a Magic character
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1846 * - "one_exactly" is not set
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1847 * But always emit at least one character. Might be a Multi,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1848 * e.g., a "[" without matching "]".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1849 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1850 for (len = 0; c != NUL && (len == 0
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1851 || (re_multi_type(peekchr()) == NOT_MULTI
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1852 && !one_exactly
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1853 && !is_Magic(c))); ++len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1854 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1855 c = no_Magic(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1856 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1857 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1858 regmbc(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1859 if (enc_utf8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1860 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1861 int l;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1862
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1863 /* Need to get composing character too. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1864 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1865 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1866 l = utf_ptr2len(regparse);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1867 if (!UTF_COMPOSINGLIKE(regparse, regparse + l))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1868 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1869 regmbc(utf_ptr2char(regparse));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1870 skipchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1871 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1872 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1873 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1874 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1875 regc(c);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1876 c = getchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1877 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1878 ungetchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1879
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1880 regc(NUL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1881 *flagp |= HASWIDTH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1882 if (len == 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1883 *flagp |= SIMPLE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1884 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1885 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1886 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1887
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1888 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1889 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1890
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1891 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1892 * Parse something followed by possible [*+=].
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1893 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1894 * Note that the branching code sequences used for = and the general cases
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1895 * of * and + are somewhat optimized: they use the same NOTHING node as
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1896 * both the endmarker for their branch list and the body of the last branch.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1897 * It might seem that this node could be dispensed with entirely, but the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1898 * endmarker role is not redundant.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1899 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1900 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1901 regpiece(int *flagp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1902 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1903 char_u *ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1904 int op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1905 char_u *next;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1906 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1907 long minval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1908 long maxval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1909
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1910 ret = regatom(&flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1911 if (ret == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1912 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1913
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1914 op = peekchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1915 if (re_multi_type(op) == NOT_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1916 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1917 *flagp = flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1918 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1919 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1920 /* default flags */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1921 *flagp = (WORST | SPSTART | (flags & (HASNL | HASLOOKBH)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1922
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1923 skipchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1924 switch (op)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1925 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1926 case Magic('*'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1927 if (flags & SIMPLE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1928 reginsert(STAR, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1929 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1930 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1931 /* Emit x* as (x&|), where & means "self". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1932 reginsert(BRANCH, ret); /* Either x */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1933 regoptail(ret, regnode(BACK)); /* and loop */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1934 regoptail(ret, ret); /* back */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1935 regtail(ret, regnode(BRANCH)); /* or */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1936 regtail(ret, regnode(NOTHING)); /* null. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1937 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1938 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1939
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1940 case Magic('+'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1941 if (flags & SIMPLE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1942 reginsert(PLUS, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1943 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1944 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1945 /* Emit x+ as x(&|), where & means "self". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1946 next = regnode(BRANCH); /* Either */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1947 regtail(ret, next);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1948 regtail(regnode(BACK), ret); /* loop back */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1949 regtail(next, regnode(BRANCH)); /* or */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1950 regtail(ret, regnode(NOTHING)); /* null. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1951 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1952 *flagp = (WORST | HASWIDTH | (flags & (HASNL | HASLOOKBH)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1953 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1954
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1955 case Magic('@'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1956 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1957 int lop = END;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1958 long nr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1959
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1960 nr = getdecchrs();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1961 switch (no_Magic(getchr()))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1962 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1963 case '=': lop = MATCH; break; /* \@= */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1964 case '!': lop = NOMATCH; break; /* \@! */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1965 case '>': lop = SUBPAT; break; /* \@> */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1966 case '<': switch (no_Magic(getchr()))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1967 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1968 case '=': lop = BEHIND; break; /* \@<= */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1969 case '!': lop = NOBEHIND; break; /* \@<! */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1970 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1971 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1972 if (lop == END)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1973 EMSG2_RET_NULL(_("E59: invalid character after %s@"),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1974 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1975 /* Look behind must match with behind_pos. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1976 if (lop == BEHIND || lop == NOBEHIND)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1977 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1978 regtail(ret, regnode(BHPOS));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1979 *flagp |= HASLOOKBH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1980 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1981 regtail(ret, regnode(END)); /* operand ends */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1982 if (lop == BEHIND || lop == NOBEHIND)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1983 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1984 if (nr < 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1985 nr = 0; /* no limit is same as zero limit */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1986 reginsert_nr(lop, nr, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1987 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1988 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1989 reginsert(lop, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1990 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1991 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1992
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1993 case Magic('?'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1994 case Magic('='):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1995 /* Emit x= as (x|) */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1996 reginsert(BRANCH, ret); /* Either x */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1997 regtail(ret, regnode(BRANCH)); /* or */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1998 next = regnode(NOTHING); /* null. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1999 regtail(ret, next);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2000 regoptail(ret, next);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2001 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2002
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2003 case Magic('{'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2004 if (!read_limits(&minval, &maxval))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2005 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2006 if (flags & SIMPLE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2007 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2008 reginsert(BRACE_SIMPLE, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2009 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2010 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2011 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2012 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2013 if (num_complex_braces >= 10)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2014 EMSG2_RET_NULL(_("E60: Too many complex %s{...}s"),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2015 reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2016 reginsert(BRACE_COMPLEX + num_complex_braces, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2017 regoptail(ret, regnode(BACK));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2018 regoptail(ret, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2019 reginsert_limits(BRACE_LIMITS, minval, maxval, ret);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2020 ++num_complex_braces;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2021 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2022 if (minval > 0 && maxval > 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2023 *flagp = (HASWIDTH | (flags & (HASNL | HASLOOKBH)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2024 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2025 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2026 if (re_multi_type(peekchr()) != NOT_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2027 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2028 // Can't have a multi follow a multi.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2029 if (peekchr() == Magic('*'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2030 EMSG2_RET_NULL(_("E61: Nested %s*"), reg_magic >= MAGIC_ON);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2031 EMSG3_RET_NULL(_("E62: Nested %s%c"), reg_magic == MAGIC_ALL,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2032 no_Magic(peekchr()));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2033 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2034
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2035 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2036 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2037
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2038 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2039 * Parse one alternative of an | or & operator.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2040 * Implements the concatenation operator.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2041 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2042 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2043 regconcat(int *flagp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2044 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2045 char_u *first = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2046 char_u *chain = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2047 char_u *latest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2048 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2049 int cont = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2050
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2051 *flagp = WORST; /* Tentatively. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2052
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2053 while (cont)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2054 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2055 switch (peekchr())
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2056 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2057 case NUL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2058 case Magic('|'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2059 case Magic('&'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2060 case Magic(')'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2061 cont = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2062 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2063 case Magic('Z'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2064 regflags |= RF_ICOMBINE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2065 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2066 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2067 case Magic('c'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2068 regflags |= RF_ICASE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2069 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2070 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2071 case Magic('C'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2072 regflags |= RF_NOICASE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2073 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2074 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2075 case Magic('v'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2076 reg_magic = MAGIC_ALL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2077 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2078 curchr = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2079 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2080 case Magic('m'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2081 reg_magic = MAGIC_ON;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2082 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2083 curchr = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2084 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2085 case Magic('M'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2086 reg_magic = MAGIC_OFF;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2087 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2088 curchr = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2089 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2090 case Magic('V'):
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2091 reg_magic = MAGIC_NONE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2092 skipchr_keepstart();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2093 curchr = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2094 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2095 default:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2096 latest = regpiece(&flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2097 if (latest == NULL || reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2098 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2099 *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2100 if (chain == NULL) /* First piece. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2101 *flagp |= flags & SPSTART;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2102 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2103 regtail(chain, latest);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2104 chain = latest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2105 if (first == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2106 first = latest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2107 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2108 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2109 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2110 if (first == NULL) /* Loop ran zero times. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2111 first = regnode(NOTHING);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2112 return first;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2113 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2114
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2115 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2116 * Parse one alternative of an | operator.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2117 * Implements the & operator.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2118 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2119 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2120 regbranch(int *flagp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2121 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2122 char_u *ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2123 char_u *chain = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2124 char_u *latest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2125 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2126
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2127 *flagp = WORST | HASNL; /* Tentatively. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2128
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2129 ret = regnode(BRANCH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2130 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2131 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2132 latest = regconcat(&flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2133 if (latest == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2134 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2135 /* If one of the branches has width, the whole thing has. If one of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2136 * the branches anchors at start-of-line, the whole thing does.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2137 * If one of the branches uses look-behind, the whole thing does. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2138 *flagp |= flags & (HASWIDTH | SPSTART | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2139 /* If one of the branches doesn't match a line-break, the whole thing
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2140 * doesn't. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2141 *flagp &= ~HASNL | (flags & HASNL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2142 if (chain != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2143 regtail(chain, latest);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2144 if (peekchr() != Magic('&'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2145 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2146 skipchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2147 regtail(latest, regnode(END)); /* operand ends */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2148 if (reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2149 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2150 reginsert(MATCH, latest);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2151 chain = latest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2152 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2153
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2154 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2155 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2156
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2157 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2158 * Parse regular expression, i.e. main body or parenthesized thing.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2159 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2160 * Caller must absorb opening parenthesis.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2161 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2162 * Combining parenthesis handling with the base level of regular expression
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2163 * is a trifle forced, but the need to tie the tails of the branches to what
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2164 * follows makes it hard to avoid.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2165 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2166 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2167 reg(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2168 int paren, /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2169 int *flagp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2170 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2171 char_u *ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2172 char_u *br;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2173 char_u *ender;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2174 int parno = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2175 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2176
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2177 *flagp = HASWIDTH; /* Tentatively. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2178
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2179 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2180 if (paren == REG_ZPAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2181 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2182 /* Make a ZOPEN node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2183 if (regnzpar >= NSUBEXP)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2184 EMSG_RET_NULL(_("E50: Too many \\z("));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2185 parno = regnzpar;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2186 regnzpar++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2187 ret = regnode(ZOPEN + parno);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2188 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2189 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2190 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2191 if (paren == REG_PAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2192 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2193 /* Make a MOPEN node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2194 if (regnpar >= NSUBEXP)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2195 EMSG2_RET_NULL(_("E51: Too many %s("), reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2196 parno = regnpar;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2197 ++regnpar;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2198 ret = regnode(MOPEN + parno);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2199 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2200 else if (paren == REG_NPAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2201 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2202 /* Make a NOPEN node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2203 ret = regnode(NOPEN);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2204 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2205 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2206 ret = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2207
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2208 /* Pick up the branches, linking them together. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2209 br = regbranch(&flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2210 if (br == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2211 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2212 if (ret != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2213 regtail(ret, br); /* [MZ]OPEN -> first. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2214 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2215 ret = br;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2216 /* If one of the branches can be zero-width, the whole thing can.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2217 * If one of the branches has * at start or matches a line-break, the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2218 * whole thing can. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2219 if (!(flags & HASWIDTH))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2220 *flagp &= ~HASWIDTH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2221 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2222 while (peekchr() == Magic('|'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2223 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2224 skipchr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2225 br = regbranch(&flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2226 if (br == NULL || reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2227 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2228 regtail(ret, br); /* BRANCH -> BRANCH. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2229 if (!(flags & HASWIDTH))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2230 *flagp &= ~HASWIDTH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2231 *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2232 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2233
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2234 /* Make a closing node, and hook it on the end. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2235 ender = regnode(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2236 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2237 paren == REG_ZPAREN ? ZCLOSE + parno :
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2238 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2239 paren == REG_PAREN ? MCLOSE + parno :
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2240 paren == REG_NPAREN ? NCLOSE : END);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2241 regtail(ret, ender);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2242
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2243 /* Hook the tails of the branches to the closing node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2244 for (br = ret; br != NULL; br = regnext(br))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2245 regoptail(br, ender);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2246
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2247 /* Check for proper termination. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2248 if (paren != REG_NOPAREN && getchr() != Magic(')'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2249 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2250 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2251 if (paren == REG_ZPAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2252 EMSG_RET_NULL(_("E52: Unmatched \\z("));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2253 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2254 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2255 if (paren == REG_NPAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2256 EMSG2_RET_NULL(_(e_unmatchedpp), reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2257 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2258 EMSG2_RET_NULL(_(e_unmatchedp), reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2259 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2260 else if (paren == REG_NOPAREN && peekchr() != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2261 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2262 if (curchr == Magic(')'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2263 EMSG2_RET_NULL(_(e_unmatchedpar), reg_magic == MAGIC_ALL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2264 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2265 EMSG_RET_NULL(_(e_trailing)); /* "Can't happen". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2266 /* NOTREACHED */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2267 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2268 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2269 * Here we set the flag allowing back references to this set of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2270 * parentheses.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2271 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2272 if (paren == REG_PAREN)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2273 had_endbrace[parno] = TRUE; /* have seen the close paren */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2274 return ret;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2275 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2276
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2277 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2278 * bt_regcomp() - compile a regular expression into internal code for the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2279 * traditional back track matcher.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2280 * Returns the program in allocated space. Returns NULL for an error.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2281 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2282 * We can't allocate space until we know how big the compiled form will be,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2283 * but we can't compile it (and thus know how big it is) until we've got a
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2284 * place to put the code. So we cheat: we compile it twice, once with code
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2285 * generation turned off and size counting turned on, and once "for real".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2286 * This also means that we don't allocate space until we are sure that the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2287 * thing really will compile successfully, and we never have to move the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2288 * code and thus invalidate pointers into it. (Note that it has to be in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2289 * one piece because vim_free() must be able to free it all.)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2290 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2291 * Whether upper/lower case is to be ignored is decided when executing the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2292 * program, it does not matter here.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2293 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2294 * Beware that the optimization-preparation code in here knows about some
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2295 * of the structure of the compiled regexp.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2296 * "re_flags": RE_MAGIC and/or RE_STRING.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2297 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2298 static regprog_T *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2299 bt_regcomp(char_u *expr, int re_flags)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2300 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2301 bt_regprog_T *r;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2302 char_u *scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2303 char_u *longest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2304 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2305 int flags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2306
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2307 if (expr == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2308 EMSG_RET_NULL(_(e_null));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2309
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2310 init_class_tab();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2311
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2312 // First pass: determine size, legality.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2313 regcomp_start(expr, re_flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2314 regcode = JUST_CALC_SIZE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2315 regc(REGMAGIC);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2316 if (reg(REG_NOPAREN, &flags) == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2317 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2318
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2319 // Allocate space.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2320 r = alloc(offsetof(bt_regprog_T, program) + regsize);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2321 if (r == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2322 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2323 r->re_in_use = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2324
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2325 // Second pass: emit code.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2326 regcomp_start(expr, re_flags);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2327 regcode = r->program;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2328 regc(REGMAGIC);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2329 if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2330 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2331 vim_free(r);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2332 if (reg_toolong)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2333 EMSG_RET_NULL(_("E339: Pattern too long"));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2334 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2335 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2336
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2337 // Dig out information for optimizations.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2338 r->regstart = NUL; // Worst-case defaults.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2339 r->reganch = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2340 r->regmust = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2341 r->regmlen = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2342 r->regflags = regflags;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2343 if (flags & HASNL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2344 r->regflags |= RF_HASNL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2345 if (flags & HASLOOKBH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2346 r->regflags |= RF_LOOKBH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2347 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2348 // Remember whether this pattern has any \z specials in it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2349 r->reghasz = re_has_z;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2350 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2351 scan = r->program + 1; // First BRANCH.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2352 if (OP(regnext(scan)) == END) // Only one top-level choice.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2353 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2354 scan = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2355
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2356 // Starting-point info.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2357 if (OP(scan) == BOL || OP(scan) == RE_BOF)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2358 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2359 r->reganch++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2360 scan = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2361 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2362
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2363 if (OP(scan) == EXACTLY)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2364 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2365 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2366 r->regstart = (*mb_ptr2char)(OPERAND(scan));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2367 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2368 r->regstart = *OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2369 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2370 else if ((OP(scan) == BOW
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2371 || OP(scan) == EOW
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2372 || OP(scan) == NOTHING
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2373 || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2374 || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2375 && OP(regnext(scan)) == EXACTLY)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2376 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2377 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2378 r->regstart = (*mb_ptr2char)(OPERAND(regnext(scan)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2379 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2380 r->regstart = *OPERAND(regnext(scan));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2381 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2382
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2383 // If there's something expensive in the r.e., find the longest
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2384 // literal string that must appear and make it the regmust. Resolve
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2385 // ties in favor of later strings, since the regstart check works
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2386 // with the beginning of the r.e. and avoiding duplication
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2387 // strengthens checking. Not a strong reason, but sufficient in the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2388 // absence of others.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2389
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2390 // When the r.e. starts with BOW, it is faster to look for a regmust
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2391 // first. Used a lot for "#" and "*" commands. (Added by mool).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2392 if ((flags & SPSTART || OP(scan) == BOW || OP(scan) == EOW)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2393 && !(flags & HASNL))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2394 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2395 longest = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2396 len = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2397 for (; scan != NULL; scan = regnext(scan))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2398 if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2399 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2400 longest = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2401 len = (int)STRLEN(OPERAND(scan));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2402 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2403 r->regmust = longest;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2404 r->regmlen = len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2405 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2406 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2407 #ifdef BT_REGEXP_DUMP
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2408 regdump(expr, r);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2409 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2410 r->engine = &bt_regengine;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2411 return (regprog_T *)r;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2412 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2413
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2414 #if defined(FEAT_SYN_HL) || defined(PROTO)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2415 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2416 * Check if during the previous call to vim_regcomp the EOL item "$" has been
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2417 * found. This is messy, but it works fine.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2418 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2419 int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2420 vim_regcomp_had_eol(void)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2421 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2422 return had_eol;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2423 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2424 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2425
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2426 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2427 * Get a number after a backslash that is inside [].
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2428 * When nothing is recognized return a backslash.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2429 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2430 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2431 coll_get_char(void)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2432 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2433 long nr = -1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2434
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2435 switch (*regparse++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2436 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2437 case 'd': nr = getdecchrs(); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2438 case 'o': nr = getoctchrs(); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2439 case 'x': nr = gethexchrs(2); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2440 case 'u': nr = gethexchrs(4); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2441 case 'U': nr = gethexchrs(8); break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2442 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2443 if (nr < 0 || nr > INT_MAX)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2444 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2445 /* If getting the number fails be backwards compatible: the character
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2446 * is a backslash. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2447 --regparse;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2448 nr = '\\';
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2449 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2450 return nr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2451 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2452
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2453 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2454 * Free a compiled regexp program, returned by bt_regcomp().
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2455 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2456 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2457 bt_regfree(regprog_T *prog)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2458 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2459 vim_free(prog);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2460 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2461
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2462 #define ADVANCE_REGINPUT() MB_PTR_ADV(rex.input)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2463
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2464 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2465 * The arguments from BRACE_LIMITS are stored here. They are actually local
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2466 * to regmatch(), but they are here to reduce the amount of stack space used
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2467 * (it can be called recursively many times).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2468 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2469 static long bl_minval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2470 static long bl_maxval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2471
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2472 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2473 * Save the input line and position in a regsave_T.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2474 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2475 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2476 reg_save(regsave_T *save, garray_T *gap)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2477 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2478 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2479 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2480 save->rs_u.pos.col = (colnr_T)(rex.input - rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2481 save->rs_u.pos.lnum = rex.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2482 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2483 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2484 save->rs_u.ptr = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2485 save->rs_len = gap->ga_len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2486 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2487
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2488 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2489 * Restore the input line and position from a regsave_T.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2490 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2491 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2492 reg_restore(regsave_T *save, garray_T *gap)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2493 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2494 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2495 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2496 if (rex.lnum != save->rs_u.pos.lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2497 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2498 /* only call reg_getline() when the line number changed to save
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2499 * a bit of time */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2500 rex.lnum = save->rs_u.pos.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2501 rex.line = reg_getline(rex.lnum);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2502 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2503 rex.input = rex.line + save->rs_u.pos.col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2504 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2505 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2506 rex.input = save->rs_u.ptr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2507 gap->ga_len = save->rs_len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2508 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2509
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2510 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2511 * Return TRUE if current position is equal to saved position.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2512 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2513 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2514 reg_save_equal(regsave_T *save)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2515 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2516 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2517 return rex.lnum == save->rs_u.pos.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2518 && rex.input == rex.line + save->rs_u.pos.col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2519 return rex.input == save->rs_u.ptr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2520 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2521
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2522 /* Save the sub-expressions before attempting a match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2523 #define save_se(savep, posp, pp) \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2524 REG_MULTI ? save_se_multi((savep), (posp)) : save_se_one((savep), (pp))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2525
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2526 /* After a failed match restore the sub-expressions. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2527 #define restore_se(savep, posp, pp) { \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2528 if (REG_MULTI) \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2529 *(posp) = (savep)->se_u.pos; \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2530 else \
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2531 *(pp) = (savep)->se_u.ptr; }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2532
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2533 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2534 * Tentatively set the sub-expression start to the current position (after
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2535 * calling regmatch() they will have changed). Need to save the existing
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2536 * values for when there is no match.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2537 * Use se_save() to use pointer (save_se_multi()) or position (save_se_one()),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2538 * depending on REG_MULTI.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2539 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2540 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2541 save_se_multi(save_se_T *savep, lpos_T *posp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2542 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2543 savep->se_u.pos = *posp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2544 posp->lnum = rex.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2545 posp->col = (colnr_T)(rex.input - rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2546 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2547
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2548 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2549 save_se_one(save_se_T *savep, char_u **pp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2550 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2551 savep->se_u.ptr = *pp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2552 *pp = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2553 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2554
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2555 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2556 * regrepeat - repeatedly match something simple, return how many.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2557 * Advances rex.input (and rex.lnum) to just after the matched chars.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2558 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2559 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2560 regrepeat(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2561 char_u *p,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2562 long maxcount) /* maximum number of matches allowed */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2563 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2564 long count = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2565 char_u *scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2566 char_u *opnd;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2567 int mask;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2568 int testval = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2569
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2570 scan = rex.input; /* Make local copy of rex.input for speed. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2571 opnd = OPERAND(p);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2572 switch (OP(p))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2573 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2574 case ANY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2575 case ANY + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2576 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2577 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2578 /* Matching anything means we continue until end-of-line (or
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2579 * end-of-file for ANY + ADD_NL), only limited by maxcount. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2580 while (*scan != NUL && count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2581 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2582 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2583 MB_PTR_ADV(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2584 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2585 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2586 || rex.reg_line_lbr || count == maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2587 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2588 ++count; /* count the line-break */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2589 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2590 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2591 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2592 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2593 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2594 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2595
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2596 case IDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2597 case IDENT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2598 testval = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2599 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2600 case SIDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2601 case SIDENT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2602 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2603 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2604 if (vim_isIDc(PTR2CHAR(scan)) && (testval || !VIM_ISDIGIT(*scan)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2605 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2606 MB_PTR_ADV(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2607 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2608 else if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2609 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2610 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2611 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2612 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2613 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2614 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2615 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2616 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2617 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2618 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2619 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2620 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2621 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2622 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2623 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2624 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2625
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2626 case KWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2627 case KWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2628 testval = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2629 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2630 case SKWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2631 case SKWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2632 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2633 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2634 if (vim_iswordp_buf(scan, rex.reg_buf)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2635 && (testval || !VIM_ISDIGIT(*scan)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2636 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2637 MB_PTR_ADV(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2638 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2639 else if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2640 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2641 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2642 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2643 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2644 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2645 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2646 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2647 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2648 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2649 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2650 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2651 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2652 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2653 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2654 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2655 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2656
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2657 case FNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2658 case FNAME + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2659 testval = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2660 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2661 case SFNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2662 case SFNAME + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2663 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2664 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2665 if (vim_isfilec(PTR2CHAR(scan)) && (testval || !VIM_ISDIGIT(*scan)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2666 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2667 MB_PTR_ADV(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2668 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2669 else if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2670 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2671 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2672 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2673 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2674 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2675 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2676 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2677 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2678 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2679 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2680 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2681 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2682 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2683 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2684 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2685 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2686
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2687 case PRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2688 case PRINT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2689 testval = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2690 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2691 case SPRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2692 case SPRINT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2693 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2694 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2695 if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2696 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2697 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2698 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2699 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2700 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2701 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2702 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2703 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2704 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2705 else if (vim_isprintc(PTR2CHAR(scan)) == 1
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2706 && (testval || !VIM_ISDIGIT(*scan)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2707 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2708 MB_PTR_ADV(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2709 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2710 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2711 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2712 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2713 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2714 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2715 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2716 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2717
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2718 case WHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2719 case WHITE + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2720 testval = mask = RI_WHITE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2721 do_class:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2722 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2723 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2724 int l;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2725
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2726 if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2727 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2728 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2729 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2730 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2731 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2732 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2733 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2734 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2735 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2736 else if (has_mbyte && (l = (*mb_ptr2len)(scan)) > 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2737 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2738 if (testval != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2739 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2740 scan += l;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2741 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2742 else if ((class_tab[*scan] & mask) == testval)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2743 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2744 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2745 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2746 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2747 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2748 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2749 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2750 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2751
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2752 case NWHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2753 case NWHITE + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2754 mask = RI_WHITE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2755 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2756 case DIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2757 case DIGIT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2758 testval = mask = RI_DIGIT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2759 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2760 case NDIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2761 case NDIGIT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2762 mask = RI_DIGIT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2763 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2764 case HEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2765 case HEX + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2766 testval = mask = RI_HEX;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2767 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2768 case NHEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2769 case NHEX + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2770 mask = RI_HEX;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2771 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2772 case OCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2773 case OCTAL + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2774 testval = mask = RI_OCTAL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2775 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2776 case NOCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2777 case NOCTAL + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2778 mask = RI_OCTAL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2779 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2780 case WORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2781 case WORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2782 testval = mask = RI_WORD;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2783 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2784 case NWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2785 case NWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2786 mask = RI_WORD;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2787 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2788 case HEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2789 case HEAD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2790 testval = mask = RI_HEAD;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2791 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2792 case NHEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2793 case NHEAD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2794 mask = RI_HEAD;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2795 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2796 case ALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2797 case ALPHA + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2798 testval = mask = RI_ALPHA;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2799 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2800 case NALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2801 case NALPHA + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2802 mask = RI_ALPHA;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2803 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2804 case LOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2805 case LOWER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2806 testval = mask = RI_LOWER;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2807 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2808 case NLOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2809 case NLOWER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2810 mask = RI_LOWER;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2811 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2812 case UPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2813 case UPPER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2814 testval = mask = RI_UPPER;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2815 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2816 case NUPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2817 case NUPPER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2818 mask = RI_UPPER;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2819 goto do_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2820
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2821 case EXACTLY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2822 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2823 int cu, cl;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2824
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2825 /* This doesn't do a multi-byte character, because a MULTIBYTECODE
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2826 * would have been used for it. It does handle single-byte
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2827 * characters, such as latin1. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2828 if (rex.reg_ic)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2829 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2830 cu = MB_TOUPPER(*opnd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2831 cl = MB_TOLOWER(*opnd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2832 while (count < maxcount && (*scan == cu || *scan == cl))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2833 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2834 count++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2835 scan++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2836 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2837 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2838 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2839 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2840 cu = *opnd;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2841 while (count < maxcount && *scan == cu)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2842 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2843 count++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2844 scan++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2845 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2846 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2847 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2848 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2849
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2850 case MULTIBYTECODE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2851 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2852 int i, len, cf = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2853
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2854 /* Safety check (just in case 'encoding' was changed since
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2855 * compiling the program). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2856 if ((len = (*mb_ptr2len)(opnd)) > 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2857 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2858 if (rex.reg_ic && enc_utf8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2859 cf = utf_fold(utf_ptr2char(opnd));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2860 while (count < maxcount && (*mb_ptr2len)(scan) >= len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2861 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2862 for (i = 0; i < len; ++i)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2863 if (opnd[i] != scan[i])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2864 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2865 if (i < len && (!rex.reg_ic || !enc_utf8
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2866 || utf_fold(utf_ptr2char(scan)) != cf))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2867 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2868 scan += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2869 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2870 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2871 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2872 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2873 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2874
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2875 case ANYOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2876 case ANYOF + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2877 testval = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2878 /* FALLTHROUGH */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2879
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2880 case ANYBUT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2881 case ANYBUT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2882 while (count < maxcount)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2883 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2884 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2885
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2886 if (*scan == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2887 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2888 if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2889 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2890 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2891 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2892 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2893 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2894 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2895 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2896 else if (rex.reg_line_lbr && *scan == '\n' && WITH_NL(OP(p)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2897 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2898 else if (has_mbyte && (len = (*mb_ptr2len)(scan)) > 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2899 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2900 if ((cstrchr(opnd, (*mb_ptr2char)(scan)) == NULL) == testval)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2901 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2902 scan += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2903 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2904 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2905 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2906 if ((cstrchr(opnd, *scan) == NULL) == testval)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2907 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2908 ++scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2909 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2910 ++count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2911 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2912 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2913
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2914 case NEWL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2915 while (count < maxcount
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2916 && ((*scan == NUL && rex.lnum <= rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2917 && !rex.reg_line_lbr && REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2918 || (*scan == '\n' && rex.reg_line_lbr)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2919 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2920 count++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2921 if (rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2922 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2923 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2924 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2925 scan = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2926 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2927 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2928 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2929 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2930
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2931 default: /* Oh dear. Called inappropriately. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2932 emsg(_(e_re_corr));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2933 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2934 printf("Called regrepeat with op code %d\n", OP(p));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2935 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2936 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2937 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2938
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2939 rex.input = scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2940
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2941 return (int)count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2942 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2943
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2944 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2945 * Push an item onto the regstack.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2946 * Returns pointer to new item. Returns NULL when out of memory.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2947 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2948 static regitem_T *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2949 regstack_push(regstate_T state, char_u *scan)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2950 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2951 regitem_T *rp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2952
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2953 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2954 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2955 emsg(_(e_maxmempat));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2956 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2957 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2958 if (ga_grow(&regstack, sizeof(regitem_T)) == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2959 return NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2960
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2961 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2962 rp->rs_state = state;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2963 rp->rs_scan = scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2964
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2965 regstack.ga_len += sizeof(regitem_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2966 return rp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2967 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2968
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2969 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2970 * Pop an item from the regstack.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2971 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2972 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2973 regstack_pop(char_u **scan)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2974 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2975 regitem_T *rp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2976
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2977 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2978 *scan = rp->rs_scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2979
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2980 regstack.ga_len -= sizeof(regitem_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2981 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2982
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2983 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2984 * Save the current subexpr to "bp", so that they can be restored
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2985 * later by restore_subexpr().
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2986 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2987 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2988 save_subexpr(regbehind_T *bp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2989 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2990 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2991
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2992 /* When "rex.need_clear_subexpr" is set we don't need to save the values, only
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2993 * remember that this flag needs to be set again when restoring. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2994 bp->save_need_clear_subexpr = rex.need_clear_subexpr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2995 if (!rex.need_clear_subexpr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2996 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2997 for (i = 0; i < NSUBEXP; ++i)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2998 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2999 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3000 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3001 bp->save_start[i].se_u.pos = rex.reg_startpos[i];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3002 bp->save_end[i].se_u.pos = rex.reg_endpos[i];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3003 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3004 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3005 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3006 bp->save_start[i].se_u.ptr = rex.reg_startp[i];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3007 bp->save_end[i].se_u.ptr = rex.reg_endp[i];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3008 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3009 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3010 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3011 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3012
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3013 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3014 * Restore the subexpr from "bp".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3015 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3016 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3017 restore_subexpr(regbehind_T *bp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3018 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3019 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3020
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3021 /* Only need to restore saved values when they are not to be cleared. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3022 rex.need_clear_subexpr = bp->save_need_clear_subexpr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3023 if (!rex.need_clear_subexpr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3024 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3025 for (i = 0; i < NSUBEXP; ++i)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3026 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3027 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3028 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3029 rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3030 rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3031 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3032 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3033 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3034 rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3035 rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3036 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3037 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3038 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3039 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3040
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3041 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3042 * regmatch - main matching routine
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3043 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3044 * Conceptually the strategy is simple: Check to see whether the current node
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3045 * matches, push an item onto the regstack and loop to see whether the rest
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3046 * matches, and then act accordingly. In practice we make some effort to
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3047 * avoid using the regstack, in particular by going through "ordinary" nodes
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3048 * (that don't need to know whether the rest of the match failed) by a nested
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3049 * loop.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3050 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3051 * Returns TRUE when there is a match. Leaves rex.input and rex.lnum just after
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3052 * the last matched character.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3053 * Returns FALSE when there is no match. Leaves rex.input and rex.lnum in an
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3054 * undefined state!
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3055 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3056 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3057 regmatch(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3058 char_u *scan, /* Current node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3059 proftime_T *tm UNUSED, /* timeout limit or NULL */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3060 int *timed_out UNUSED) /* flag set on timeout or NULL */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3061 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3062 char_u *next; /* Next node. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3063 int op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3064 int c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3065 regitem_T *rp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3066 int no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3067 int status; /* one of the RA_ values: */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3068 #ifdef FEAT_RELTIME
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3069 int tm_count = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3070 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3071
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3072 /* Make "regstack" and "backpos" empty. They are allocated and freed in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3073 * bt_regexec_both() to reduce malloc()/free() calls. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3074 regstack.ga_len = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3075 backpos.ga_len = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3076
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3077 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3078 * Repeat until "regstack" is empty.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3079 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3080 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3081 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3082 /* Some patterns may take a long time to match, e.g., "\([a-z]\+\)\+Q".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3083 * Allow interrupting them with CTRL-C. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3084 fast_breakcheck();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3085
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3086 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3087 if (scan != NULL && regnarrate)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3088 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3089 mch_errmsg((char *)regprop(scan));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3090 mch_errmsg("(\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3091 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3092 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3093
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3094 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3095 * Repeat for items that can be matched sequentially, without using the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3096 * regstack.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3097 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3098 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3099 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3100 if (got_int || scan == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3101 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3102 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3103 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3104 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3105 #ifdef FEAT_RELTIME
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3106 /* Check for timeout once in a 100 times to avoid overhead. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3107 if (tm != NULL && ++tm_count == 100)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3108 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3109 tm_count = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3110 if (profile_passed_limit(tm))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3111 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3112 if (timed_out != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3113 *timed_out = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3114 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3115 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3116 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3117 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3118 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3119 status = RA_CONT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3120
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3121 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3122 if (regnarrate)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3123 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3124 mch_errmsg((char *)regprop(scan));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3125 mch_errmsg("...\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3126 # ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3127 if (re_extmatch_in != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3128 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3129 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3130
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3131 mch_errmsg(_("External submatches:\n"));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3132 for (i = 0; i < NSUBEXP; i++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3133 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3134 mch_errmsg(" \"");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3135 if (re_extmatch_in->matches[i] != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3136 mch_errmsg((char *)re_extmatch_in->matches[i]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3137 mch_errmsg("\"\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3138 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3139 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3140 # endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3141 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3142 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3143 next = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3144
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3145 op = OP(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3146 /* Check for character class with NL added. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3147 if (!rex.reg_line_lbr && WITH_NL(op) && REG_MULTI
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3148 && *rex.input == NUL && rex.lnum <= rex.reg_maxline)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3149 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3150 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3151 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3152 else if (rex.reg_line_lbr && WITH_NL(op) && *rex.input == '\n')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3153 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3154 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3155 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3156 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3157 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3158 if (WITH_NL(op))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3159 op -= ADD_NL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3160 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3161 c = (*mb_ptr2char)(rex.input);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3162 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3163 c = *rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3164 switch (op)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3165 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3166 case BOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3167 if (rex.input != rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3168 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3169 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3170
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3171 case EOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3172 if (c != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3173 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3174 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3175
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3176 case RE_BOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3177 /* We're not at the beginning of the file when below the first
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3178 * line where we started, not at the start of the line or we
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3179 * didn't start at the first line of the buffer. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3180 if (rex.lnum != 0 || rex.input != rex.line
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3181 || (REG_MULTI && rex.reg_firstlnum > 1))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3182 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3183 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3184
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3185 case RE_EOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3186 if (rex.lnum != rex.reg_maxline || c != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3187 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3188 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3189
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3190 case CURSOR:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3191 /* Check if the buffer is in a window and compare the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3192 * rex.reg_win->w_cursor position to the match position. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3193 if (rex.reg_win == NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3194 || (rex.lnum + rex.reg_firstlnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3195 != rex.reg_win->w_cursor.lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3196 || ((colnr_T)(rex.input - rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3197 != rex.reg_win->w_cursor.col))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3198 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3199 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3200
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3201 case RE_MARK:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3202 /* Compare the mark position to the match position. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3203 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3204 int mark = OPERAND(scan)[0];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3205 int cmp = OPERAND(scan)[1];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3206 pos_T *pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3207
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3208 pos = getmark_buf(rex.reg_buf, mark, FALSE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3209 if (pos == NULL /* mark doesn't exist */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3210 || pos->lnum <= 0 /* mark isn't set in reg_buf */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3211 || (pos->lnum == rex.lnum + rex.reg_firstlnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3212 ? (pos->col == (colnr_T)(rex.input - rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3213 ? (cmp == '<' || cmp == '>')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3214 : (pos->col < (colnr_T)(rex.input - rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3215 ? cmp != '>'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3216 : cmp != '<'))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3217 : (pos->lnum < rex.lnum + rex.reg_firstlnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3218 ? cmp != '>'
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3219 : cmp != '<')))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3220 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3221 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3222 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3223
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3224 case RE_VISUAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3225 if (!reg_match_visual())
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3226 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3227 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3228
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3229 case RE_LNUM:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3230 if (!REG_MULTI || !re_num_cmp((long_u)(rex.lnum + rex.reg_firstlnum),
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3231 scan))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3232 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3233 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3234
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3235 case RE_COL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3236 if (!re_num_cmp((long_u)(rex.input - rex.line) + 1, scan))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3237 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3238 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3239
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3240 case RE_VCOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3241 if (!re_num_cmp((long_u)win_linetabsize(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3242 rex.reg_win == NULL ? curwin : rex.reg_win,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3243 rex.line, (colnr_T)(rex.input - rex.line)) + 1, scan))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3244 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3245 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3246
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3247 case BOW: /* \<word; rex.input points to w */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3248 if (c == NUL) /* Can't match at end of line */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3249 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3250 else if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3251 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3252 int this_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3253
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3254 /* Get class of current and previous char (if it exists). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3255 this_class = mb_get_class_buf(rex.input, rex.reg_buf);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3256 if (this_class <= 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3257 status = RA_NOMATCH; /* not on a word at all */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3258 else if (reg_prev_class() == this_class)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3259 status = RA_NOMATCH; /* previous char is in same word */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3260 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3261 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3262 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3263 if (!vim_iswordc_buf(c, rex.reg_buf) || (rex.input > rex.line
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3264 && vim_iswordc_buf(rex.input[-1], rex.reg_buf)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3265 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3266 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3267 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3268
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3269 case EOW: /* word\>; rex.input points after d */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3270 if (rex.input == rex.line) /* Can't match at start of line */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3271 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3272 else if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3273 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3274 int this_class, prev_class;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3275
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3276 /* Get class of current and previous char (if it exists). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3277 this_class = mb_get_class_buf(rex.input, rex.reg_buf);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3278 prev_class = reg_prev_class();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3279 if (this_class == prev_class
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3280 || prev_class == 0 || prev_class == 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3281 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3282 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3283 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3284 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3285 if (!vim_iswordc_buf(rex.input[-1], rex.reg_buf)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3286 || (rex.input[0] != NUL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3287 && vim_iswordc_buf(c, rex.reg_buf)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3288 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3289 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3290 break; /* Matched with EOW */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3291
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3292 case ANY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3293 /* ANY does not match new lines. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3294 if (c == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3295 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3296 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3297 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3298 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3299
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3300 case IDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3301 if (!vim_isIDc(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3302 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3303 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3304 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3305 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3306
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3307 case SIDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3308 if (VIM_ISDIGIT(*rex.input) || !vim_isIDc(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3309 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3310 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3311 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3312 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3313
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3314 case KWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3315 if (!vim_iswordp_buf(rex.input, rex.reg_buf))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3316 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3317 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3318 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3319 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3320
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3321 case SKWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3322 if (VIM_ISDIGIT(*rex.input)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3323 || !vim_iswordp_buf(rex.input, rex.reg_buf))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3324 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3325 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3326 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3327 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3328
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3329 case FNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3330 if (!vim_isfilec(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3331 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3332 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3333 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3334 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3335
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3336 case SFNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3337 if (VIM_ISDIGIT(*rex.input) || !vim_isfilec(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3338 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3339 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3340 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3341 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3342
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3343 case PRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3344 if (!vim_isprintc(PTR2CHAR(rex.input)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3345 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3346 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3347 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3348 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3349
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3350 case SPRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3351 if (VIM_ISDIGIT(*rex.input) || !vim_isprintc(PTR2CHAR(rex.input)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3352 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3353 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3354 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3355 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3356
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3357 case WHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3358 if (!VIM_ISWHITE(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3359 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3360 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3361 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3362 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3363
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3364 case NWHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3365 if (c == NUL || VIM_ISWHITE(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3366 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3367 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3368 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3369 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3370
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3371 case DIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3372 if (!ri_digit(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3373 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3374 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3375 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3376 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3377
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3378 case NDIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3379 if (c == NUL || ri_digit(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3380 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3381 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3382 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3383 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3384
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3385 case HEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3386 if (!ri_hex(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3387 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3388 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3389 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3390 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3391
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3392 case NHEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3393 if (c == NUL || ri_hex(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3394 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3395 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3396 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3397 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3398
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3399 case OCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3400 if (!ri_octal(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3401 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3402 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3403 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3404 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3405
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3406 case NOCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3407 if (c == NUL || ri_octal(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3408 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3409 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3410 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3411 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3412
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3413 case WORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3414 if (!ri_word(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3415 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3416 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3417 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3418 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3419
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3420 case NWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3421 if (c == NUL || ri_word(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3422 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3423 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3424 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3425 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3426
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3427 case HEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3428 if (!ri_head(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3429 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3430 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3431 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3432 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3433
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3434 case NHEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3435 if (c == NUL || ri_head(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3436 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3437 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3438 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3439 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3440
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3441 case ALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3442 if (!ri_alpha(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3443 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3444 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3445 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3446 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3447
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3448 case NALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3449 if (c == NUL || ri_alpha(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3450 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3451 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3452 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3453 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3454
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3455 case LOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3456 if (!ri_lower(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3457 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3458 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3459 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3460 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3461
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3462 case NLOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3463 if (c == NUL || ri_lower(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3464 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3465 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3466 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3467 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3468
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3469 case UPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3470 if (!ri_upper(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3471 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3472 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3473 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3474 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3475
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3476 case NUPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3477 if (c == NUL || ri_upper(c))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3478 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3479 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3480 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3481 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3482
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3483 case EXACTLY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3484 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3485 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3486 char_u *opnd;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3487
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3488 opnd = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3489 /* Inline the first byte, for speed. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3490 if (*opnd != *rex.input
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3491 && (!rex.reg_ic
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3492 || (!enc_utf8
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3493 && MB_TOLOWER(*opnd) != MB_TOLOWER(*rex.input))))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3494 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3495 else if (*opnd == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3496 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3497 /* match empty string always works; happens when "~" is
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3498 * empty. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3499 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3500 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3501 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3502 if (opnd[1] == NUL && !(enc_utf8 && rex.reg_ic))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3503 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3504 len = 1; /* matched a single byte above */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3505 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3506 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3507 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3508 /* Need to match first byte again for multi-byte. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3509 len = (int)STRLEN(opnd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3510 if (cstrncmp(opnd, rex.input, &len) != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3511 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3512 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3513 /* Check for following composing character, unless %C
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3514 * follows (skips over all composing chars). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3515 if (status != RA_NOMATCH
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3516 && enc_utf8
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3517 && UTF_COMPOSINGLIKE(rex.input, rex.input + len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3518 && !rex.reg_icombine
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3519 && OP(next) != RE_COMPOSING)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3520 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3521 /* raaron: This code makes a composing character get
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3522 * ignored, which is the correct behavior (sometimes)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3523 * for voweled Hebrew texts. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3524 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3525 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3526 if (status != RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3527 rex.input += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3528 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3529 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3530 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3531
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3532 case ANYOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3533 case ANYBUT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3534 if (c == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3535 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3536 else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3537 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3538 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3539 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3540 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3541
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3542 case MULTIBYTECODE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3543 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3544 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3545 int i, len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3546 char_u *opnd;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3547 int opndc = 0, inpc;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3548
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3549 opnd = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3550 /* Safety check (just in case 'encoding' was changed since
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3551 * compiling the program). */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3552 if ((len = (*mb_ptr2len)(opnd)) < 2)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3553 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3554 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3555 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3556 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3557 if (enc_utf8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3558 opndc = utf_ptr2char(opnd);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3559 if (enc_utf8 && utf_iscomposing(opndc))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3560 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3561 /* When only a composing char is given match at any
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3562 * position where that composing char appears. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3563 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3564 for (i = 0; rex.input[i] != NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3565 i += utf_ptr2len(rex.input + i))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3566 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3567 inpc = utf_ptr2char(rex.input + i);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3568 if (!utf_iscomposing(inpc))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3569 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3570 if (i > 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3571 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3572 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3573 else if (opndc == inpc)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3574 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3575 /* Include all following composing chars. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3576 len = i + utfc_ptr2len(rex.input + i);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3577 status = RA_MATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3578 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3579 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3580 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3581 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3582 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3583 for (i = 0; i < len; ++i)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3584 if (opnd[i] != rex.input[i])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3585 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3586 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3587 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3588 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3589 rex.input += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3590 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3591 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3592 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3593 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3594 case RE_COMPOSING:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3595 if (enc_utf8)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3596 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3597 /* Skip composing characters. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3598 while (utf_iscomposing(utf_ptr2char(rex.input)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3599 MB_CPTR_ADV(rex.input);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3600 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3601 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3602
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3603 case NOTHING:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3604 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3605
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3606 case BACK:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3607 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3608 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3609 backpos_T *bp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3610
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3611 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3612 * When we run into BACK we need to check if we don't keep
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3613 * looping without matching any input. The second and later
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3614 * times a BACK is encountered it fails if the input is still
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3615 * at the same position as the previous time.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3616 * The positions are stored in "backpos" and found by the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3617 * current value of "scan", the position in the RE program.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3618 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3619 bp = (backpos_T *)backpos.ga_data;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3620 for (i = 0; i < backpos.ga_len; ++i)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3621 if (bp[i].bp_scan == scan)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3622 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3623 if (i == backpos.ga_len)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3624 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3625 /* First time at this BACK, make room to store the pos. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3626 if (ga_grow(&backpos, 1) == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3627 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3628 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3629 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3630 /* get "ga_data" again, it may have changed */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3631 bp = (backpos_T *)backpos.ga_data;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3632 bp[i].bp_scan = scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3633 ++backpos.ga_len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3634 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3635 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3636 else if (reg_save_equal(&bp[i].bp_pos))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3637 /* Still at same position as last time, fail. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3638 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3639
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3640 if (status != RA_FAIL && status != RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3641 reg_save(&bp[i].bp_pos, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3642 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3643 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3644
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3645 case MOPEN + 0: /* Match start: \zs */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3646 case MOPEN + 1: /* \( */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3647 case MOPEN + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3648 case MOPEN + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3649 case MOPEN + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3650 case MOPEN + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3651 case MOPEN + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3652 case MOPEN + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3653 case MOPEN + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3654 case MOPEN + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3655 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3656 no = op - MOPEN;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3657 cleanup_subexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3658 rp = regstack_push(RS_MOPEN, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3659 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3660 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3661 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3662 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3663 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3664 save_se(&rp->rs_un.sesave, &rex.reg_startpos[no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3665 &rex.reg_startp[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3666 /* We simply continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3667 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3668 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3669 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3670
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3671 case NOPEN: /* \%( */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3672 case NCLOSE: /* \) after \%( */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3673 if (regstack_push(RS_NOPEN, scan) == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3674 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3675 /* We simply continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3676 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3677
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3678 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3679 case ZOPEN + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3680 case ZOPEN + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3681 case ZOPEN + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3682 case ZOPEN + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3683 case ZOPEN + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3684 case ZOPEN + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3685 case ZOPEN + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3686 case ZOPEN + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3687 case ZOPEN + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3688 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3689 no = op - ZOPEN;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3690 cleanup_zsubexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3691 rp = regstack_push(RS_ZOPEN, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3692 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3693 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3694 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3695 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3696 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3697 save_se(&rp->rs_un.sesave, &reg_startzpos[no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3698 &reg_startzp[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3699 /* We simply continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3700 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3701 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3702 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3703 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3704
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3705 case MCLOSE + 0: /* Match end: \ze */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3706 case MCLOSE + 1: /* \) */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3707 case MCLOSE + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3708 case MCLOSE + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3709 case MCLOSE + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3710 case MCLOSE + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3711 case MCLOSE + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3712 case MCLOSE + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3713 case MCLOSE + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3714 case MCLOSE + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3715 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3716 no = op - MCLOSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3717 cleanup_subexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3718 rp = regstack_push(RS_MCLOSE, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3719 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3720 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3721 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3722 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3723 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3724 save_se(&rp->rs_un.sesave, &rex.reg_endpos[no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3725 &rex.reg_endp[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3726 /* We simply continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3727 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3728 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3729 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3730
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3731 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3732 case ZCLOSE + 1: /* \) after \z( */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3733 case ZCLOSE + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3734 case ZCLOSE + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3735 case ZCLOSE + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3736 case ZCLOSE + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3737 case ZCLOSE + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3738 case ZCLOSE + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3739 case ZCLOSE + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3740 case ZCLOSE + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3741 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3742 no = op - ZCLOSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3743 cleanup_zsubexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3744 rp = regstack_push(RS_ZCLOSE, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3745 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3746 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3747 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3748 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3749 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3750 save_se(&rp->rs_un.sesave, &reg_endzpos[no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3751 &reg_endzp[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3752 /* We simply continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3753 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3754 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3755 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3756 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3757
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3758 case BACKREF + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3759 case BACKREF + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3760 case BACKREF + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3761 case BACKREF + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3762 case BACKREF + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3763 case BACKREF + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3764 case BACKREF + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3765 case BACKREF + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3766 case BACKREF + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3767 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3768 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3769
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3770 no = op - BACKREF;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3771 cleanup_subexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3772 if (!REG_MULTI) /* Single-line regexp */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3773 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3774 if (rex.reg_startp[no] == NULL || rex.reg_endp[no] == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3775 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3776 /* Backref was not set: Match an empty string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3777 len = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3778 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3779 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3780 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3781 /* Compare current input with back-ref in the same
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3782 * line. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3783 len = (int)(rex.reg_endp[no] - rex.reg_startp[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3784 if (cstrncmp(rex.reg_startp[no], rex.input, &len) != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3785 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3786 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3787 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3788 else /* Multi-line regexp */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3789 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3790 if (rex.reg_startpos[no].lnum < 0
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3791 || rex.reg_endpos[no].lnum < 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3792 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3793 /* Backref was not set: Match an empty string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3794 len = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3795 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3796 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3797 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3798 if (rex.reg_startpos[no].lnum == rex.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3799 && rex.reg_endpos[no].lnum == rex.lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3800 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3801 /* Compare back-ref within the current line. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3802 len = rex.reg_endpos[no].col
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3803 - rex.reg_startpos[no].col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3804 if (cstrncmp(rex.line + rex.reg_startpos[no].col,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3805 rex.input, &len) != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3806 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3807 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3808 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3809 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3810 /* Messy situation: Need to compare between two
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3811 * lines. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3812 int r = match_with_backref(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3813 rex.reg_startpos[no].lnum,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3814 rex.reg_startpos[no].col,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3815 rex.reg_endpos[no].lnum,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3816 rex.reg_endpos[no].col,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3817 &len);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3818
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3819 if (r != RA_MATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3820 status = r;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3821 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3822 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3823 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3824
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3825 /* Matched the backref, skip over it. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3826 rex.input += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3827 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3828 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3829
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3830 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3831 case ZREF + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3832 case ZREF + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3833 case ZREF + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3834 case ZREF + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3835 case ZREF + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3836 case ZREF + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3837 case ZREF + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3838 case ZREF + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3839 case ZREF + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3840 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3841 int len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3842
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3843 cleanup_zsubexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3844 no = op - ZREF;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3845 if (re_extmatch_in != NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3846 && re_extmatch_in->matches[no] != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3847 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3848 len = (int)STRLEN(re_extmatch_in->matches[no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3849 if (cstrncmp(re_extmatch_in->matches[no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3850 rex.input, &len) != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3851 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3852 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3853 rex.input += len;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3854 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3855 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3856 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3857 /* Backref was not set: Match an empty string. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3858 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3859 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3860 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3861 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3862
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3863 case BRANCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3864 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3865 if (OP(next) != BRANCH) /* No choice. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3866 next = OPERAND(scan); /* Avoid recursion. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3867 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3868 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3869 rp = regstack_push(RS_BRANCH, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3870 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3871 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3872 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3873 status = RA_BREAK; /* rest is below */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3874 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3875 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3876 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3877
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3878 case BRACE_LIMITS:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3879 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3880 if (OP(next) == BRACE_SIMPLE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3881 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3882 bl_minval = OPERAND_MIN(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3883 bl_maxval = OPERAND_MAX(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3884 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3885 else if (OP(next) >= BRACE_COMPLEX
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3886 && OP(next) < BRACE_COMPLEX + 10)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3887 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3888 no = OP(next) - BRACE_COMPLEX;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3889 brace_min[no] = OPERAND_MIN(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3890 brace_max[no] = OPERAND_MAX(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3891 brace_count[no] = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3892 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3893 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3894 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3895 internal_error("BRACE_LIMITS");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3896 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3897 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3898 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3899 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3900
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3901 case BRACE_COMPLEX + 0:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3902 case BRACE_COMPLEX + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3903 case BRACE_COMPLEX + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3904 case BRACE_COMPLEX + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3905 case BRACE_COMPLEX + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3906 case BRACE_COMPLEX + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3907 case BRACE_COMPLEX + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3908 case BRACE_COMPLEX + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3909 case BRACE_COMPLEX + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3910 case BRACE_COMPLEX + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3911 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3912 no = op - BRACE_COMPLEX;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3913 ++brace_count[no];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3914
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3915 /* If not matched enough times yet, try one more */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3916 if (brace_count[no] <= (brace_min[no] <= brace_max[no]
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3917 ? brace_min[no] : brace_max[no]))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3918 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3919 rp = regstack_push(RS_BRCPLX_MORE, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3920 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3921 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3922 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3923 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3924 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3925 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3926 next = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3927 /* We continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3928 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3929 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3930 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3931
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3932 /* If matched enough times, may try matching some more */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3933 if (brace_min[no] <= brace_max[no])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3934 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3935 /* Range is the normal way around, use longest match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3936 if (brace_count[no] <= brace_max[no])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3937 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3938 rp = regstack_push(RS_BRCPLX_LONG, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3939 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3940 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3941 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3942 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3943 rp->rs_no = no;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3944 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3945 next = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3946 /* We continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3947 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3948 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3949 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3950 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3951 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3952 /* Range is backwards, use shortest match first */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3953 if (brace_count[no] <= brace_min[no])
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3954 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3955 rp = regstack_push(RS_BRCPLX_SHORT, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3956 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3957 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3958 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3959 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3960 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3961 /* We continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3962 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3963 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3964 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3965 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3966 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3967
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3968 case BRACE_SIMPLE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3969 case STAR:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3970 case PLUS:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3971 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3972 regstar_T rst;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3973
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3974 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3975 * Lookahead to avoid useless match attempts when we know
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3976 * what character comes next.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3977 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3978 if (OP(next) == EXACTLY)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3979 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3980 rst.nextb = *OPERAND(next);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3981 if (rex.reg_ic)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3982 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3983 if (MB_ISUPPER(rst.nextb))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3984 rst.nextb_ic = MB_TOLOWER(rst.nextb);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3985 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3986 rst.nextb_ic = MB_TOUPPER(rst.nextb);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3987 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3988 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3989 rst.nextb_ic = rst.nextb;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3990 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3991 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3992 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3993 rst.nextb = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3994 rst.nextb_ic = NUL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3995 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3996 if (op != BRACE_SIMPLE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3997 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3998 rst.minval = (op == STAR) ? 0 : 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3999 rst.maxval = MAX_LIMIT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4000 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4001 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4002 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4003 rst.minval = bl_minval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4004 rst.maxval = bl_maxval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4005 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4006
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4007 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4008 * When maxval > minval, try matching as much as possible, up
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4009 * to maxval. When maxval < minval, try matching at least the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4010 * minimal number (since the range is backwards, that's also
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4011 * maxval!).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4012 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4013 rst.count = regrepeat(OPERAND(scan), rst.maxval);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4014 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4015 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4016 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4017 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4018 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4019 if (rst.minval <= rst.maxval
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4020 ? rst.count >= rst.minval : rst.count >= rst.maxval)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4021 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4022 /* It could match. Prepare for trying to match what
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4023 * follows. The code is below. Parameters are stored in
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4024 * a regstar_T on the regstack. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4025 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4026 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4027 emsg(_(e_maxmempat));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4028 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4029 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4030 else if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4031 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4032 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4033 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4034 regstack.ga_len += sizeof(regstar_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4035 rp = regstack_push(rst.minval <= rst.maxval
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4036 ? RS_STAR_LONG : RS_STAR_SHORT, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4037 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4038 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4039 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4040 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4041 *(((regstar_T *)rp) - 1) = rst;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4042 status = RA_BREAK; /* skip the restore bits */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4043 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4044 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4045 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4046 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4047 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4048
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4049 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4050 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4051
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4052 case NOMATCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4053 case MATCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4054 case SUBPAT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4055 rp = regstack_push(RS_NOMATCH, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4056 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4057 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4058 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4059 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4060 rp->rs_no = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4061 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4062 next = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4063 /* We continue and handle the result when done. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4064 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4065 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4066
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4067 case BEHIND:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4068 case NOBEHIND:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4069 /* Need a bit of room to store extra positions. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4070 if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4071 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4072 emsg(_(e_maxmempat));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4073 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4074 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4075 else if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4076 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4077 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4078 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4079 regstack.ga_len += sizeof(regbehind_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4080 rp = regstack_push(RS_BEHIND1, scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4081 if (rp == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4082 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4083 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4084 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4085 /* Need to save the subexpr to be able to restore them
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4086 * when there is a match but we don't use it. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4087 save_subexpr(((regbehind_T *)rp) - 1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4088
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4089 rp->rs_no = op;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4090 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4091 /* First try if what follows matches. If it does then we
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4092 * check the behind match by looping. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4093 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4094 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4095 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4096
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4097 case BHPOS:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4098 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4099 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4100 if (behind_pos.rs_u.pos.col != (colnr_T)(rex.input - rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4101 || behind_pos.rs_u.pos.lnum != rex.lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4102 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4103 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4104 else if (behind_pos.rs_u.ptr != rex.input)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4105 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4106 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4107
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4108 case NEWL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4109 if ((c != NUL || !REG_MULTI || rex.lnum > rex.reg_maxline
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4110 || rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4111 && (c != '\n' || !rex.reg_line_lbr))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4112 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4113 else if (rex.reg_line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4114 ADVANCE_REGINPUT();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4115 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4116 reg_nextline();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4117 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4118
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4119 case END:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4120 status = RA_MATCH; /* Success! */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4121 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4122
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4123 default:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4124 emsg(_(e_re_corr));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4125 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4126 printf("Illegal op code %d\n", op);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4127 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4128 status = RA_FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4129 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4130 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4131 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4132
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4133 /* If we can't continue sequentially, break the inner loop. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4134 if (status != RA_CONT)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4135 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4136
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4137 /* Continue in inner loop, advance to next item. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4138 scan = next;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4139
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4140 } /* end of inner loop */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4141
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4142 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4143 * If there is something on the regstack execute the code for the state.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4144 * If the state is popped then loop and use the older state.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4145 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4146 while (regstack.ga_len > 0 && status != RA_FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4147 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4148 rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4149 switch (rp->rs_state)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4150 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4151 case RS_NOPEN:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4152 /* Result is passed on as-is, simply pop the state. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4153 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4154 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4155
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4156 case RS_MOPEN:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4157 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4158 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4159 restore_se(&rp->rs_un.sesave, &rex.reg_startpos[rp->rs_no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4160 &rex.reg_startp[rp->rs_no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4161 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4162 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4163
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4164 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4165 case RS_ZOPEN:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4166 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4167 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4168 restore_se(&rp->rs_un.sesave, &reg_startzpos[rp->rs_no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4169 &reg_startzp[rp->rs_no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4170 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4171 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4172 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4173
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4174 case RS_MCLOSE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4175 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4176 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4177 restore_se(&rp->rs_un.sesave, &rex.reg_endpos[rp->rs_no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4178 &rex.reg_endp[rp->rs_no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4179 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4180 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4181
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4182 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4183 case RS_ZCLOSE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4184 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4185 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4186 restore_se(&rp->rs_un.sesave, &reg_endzpos[rp->rs_no],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4187 &reg_endzp[rp->rs_no]);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4188 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4189 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4190 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4191
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4192 case RS_BRANCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4193 if (status == RA_MATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4194 /* this branch matched, use it */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4195 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4196 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4197 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4198 if (status != RA_BREAK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4199 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4200 /* After a non-matching branch: try next one. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4201 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4202 scan = rp->rs_scan;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4203 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4204 if (scan == NULL || OP(scan) != BRANCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4205 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4206 /* no more branches, didn't find a match */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4207 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4208 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4209 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4210 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4211 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4212 /* Prepare to try a branch. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4213 rp->rs_scan = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4214 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4215 scan = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4216 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4217 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4218 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4219
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4220 case RS_BRCPLX_MORE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4221 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4222 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4223 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4224 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4225 --brace_count[rp->rs_no]; /* decrement match count */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4226 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4227 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4228 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4229
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4230 case RS_BRCPLX_LONG:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4231 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4232 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4233 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4234 /* There was no match, but we did find enough matches. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4235 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4236 --brace_count[rp->rs_no];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4237 /* continue with the items after "\{}" */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4238 status = RA_CONT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4239 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4240 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4241 if (status == RA_CONT)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4242 scan = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4243 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4244
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4245 case RS_BRCPLX_SHORT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4246 /* Pop the state. Restore pointers when there is no match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4247 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4248 /* There was no match, try to match one more item. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4249 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4250 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4251 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4252 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4253 scan = OPERAND(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4254 status = RA_CONT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4255 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4256 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4257
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4258 case RS_NOMATCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4259 /* Pop the state. If the operand matches for NOMATCH or
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4260 * doesn't match for MATCH/SUBPAT, we fail. Otherwise backup,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4261 * except for SUBPAT, and continue with the next item. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4262 if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4263 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4264 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4265 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4266 status = RA_CONT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4267 if (rp->rs_no != SUBPAT) /* zero-width */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4268 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4269 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4270 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4271 if (status == RA_CONT)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4272 scan = regnext(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4273 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4274
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4275 case RS_BEHIND1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4276 if (status == RA_NOMATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4277 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4278 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4279 regstack.ga_len -= sizeof(regbehind_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4280 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4281 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4282 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4283 /* The stuff after BEHIND/NOBEHIND matches. Now try if
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4284 * the behind part does (not) match before the current
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4285 * position in the input. This must be done at every
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4286 * position in the input and checking if the match ends at
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4287 * the current position. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4288
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4289 /* save the position after the found match for next */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4290 reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4291
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4292 /* Start looking for a match with operand at the current
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4293 * position. Go back one character until we find the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4294 * result, hitting the start of the line or the previous
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4295 * line (for multi-line matching).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4296 * Set behind_pos to where the match should end, BHPOS
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4297 * will match it. Save the current value. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4298 (((regbehind_T *)rp) - 1)->save_behind = behind_pos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4299 behind_pos = rp->rs_un.regsave;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4300
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4301 rp->rs_state = RS_BEHIND2;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4302
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4303 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4304 scan = OPERAND(rp->rs_scan) + 4;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4305 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4306 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4307
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4308 case RS_BEHIND2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4309 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4310 * Looping for BEHIND / NOBEHIND match.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4311 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4312 if (status == RA_MATCH && reg_save_equal(&behind_pos))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4313 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4314 /* found a match that ends where "next" started */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4315 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4316 if (rp->rs_no == BEHIND)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4317 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4318 &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4319 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4320 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4321 /* But we didn't want a match. Need to restore the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4322 * subexpr, because what follows matched, so they have
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4323 * been set. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4324 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4325 restore_subexpr(((regbehind_T *)rp) - 1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4326 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4327 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4328 regstack.ga_len -= sizeof(regbehind_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4329 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4330 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4331 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4332 long limit;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4333
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4334 /* No match or a match that doesn't end where we want it: Go
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4335 * back one character. May go to previous line once. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4336 no = OK;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4337 limit = OPERAND_MIN(rp->rs_scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4338 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4339 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4340 if (limit > 0
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4341 && ((rp->rs_un.regsave.rs_u.pos.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4342 < behind_pos.rs_u.pos.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4343 ? (colnr_T)STRLEN(rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4344 : behind_pos.rs_u.pos.col)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4345 - rp->rs_un.regsave.rs_u.pos.col >= limit))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4346 no = FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4347 else if (rp->rs_un.regsave.rs_u.pos.col == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4348 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4349 if (rp->rs_un.regsave.rs_u.pos.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4350 < behind_pos.rs_u.pos.lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4351 || reg_getline(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4352 --rp->rs_un.regsave.rs_u.pos.lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4353 == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4354 no = FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4355 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4356 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4357 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4358 rp->rs_un.regsave.rs_u.pos.col =
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4359 (colnr_T)STRLEN(rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4360 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4361 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4362 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4363 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4364 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4365 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4366 char_u *line =
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4367 reg_getline(rp->rs_un.regsave.rs_u.pos.lnum);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4368
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4369 rp->rs_un.regsave.rs_u.pos.col -=
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4370 (*mb_head_off)(line, line
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4371 + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4372 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4373 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4374 --rp->rs_un.regsave.rs_u.pos.col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4375 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4376 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4377 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4378 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4379 if (rp->rs_un.regsave.rs_u.ptr == rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4380 no = FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4381 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4382 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4383 MB_PTR_BACK(rex.line, rp->rs_un.regsave.rs_u.ptr);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4384 if (limit > 0 && (long)(behind_pos.rs_u.ptr
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4385 - rp->rs_un.regsave.rs_u.ptr) > limit)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4386 no = FAIL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4387 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4388 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4389 if (no == OK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4390 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4391 /* Advanced, prepare for finding match again. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4392 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4393 scan = OPERAND(rp->rs_scan) + 4;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4394 if (status == RA_MATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4395 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4396 /* We did match, so subexpr may have been changed,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4397 * need to restore them for the next try. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4398 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4399 restore_subexpr(((regbehind_T *)rp) - 1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4400 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4401 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4402 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4403 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4404 /* Can't advance. For NOBEHIND that's a match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4405 behind_pos = (((regbehind_T *)rp) - 1)->save_behind;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4406 if (rp->rs_no == NOBEHIND)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4407 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4408 reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4409 &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4410 status = RA_MATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4411 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4412 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4413 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4414 /* We do want a proper match. Need to restore the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4415 * subexpr if we had a match, because they may have
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4416 * been set. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4417 if (status == RA_MATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4418 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4419 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4420 restore_subexpr(((regbehind_T *)rp) - 1);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4421 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4422 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4423 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4424 regstack.ga_len -= sizeof(regbehind_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4425 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4426 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4427 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4428
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4429 case RS_STAR_LONG:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4430 case RS_STAR_SHORT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4431 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4432 regstar_T *rst = ((regstar_T *)rp) - 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4433
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4434 if (status == RA_MATCH)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4435 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4436 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4437 regstack.ga_len -= sizeof(regstar_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4438 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4439 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4440
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4441 /* Tried once already, restore input pointers. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4442 if (status != RA_BREAK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4443 reg_restore(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4444
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4445 /* Repeat until we found a position where it could match. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4446 for (;;)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4447 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4448 if (status != RA_BREAK)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4449 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4450 /* Tried first position already, advance. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4451 if (rp->rs_state == RS_STAR_LONG)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4452 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4453 /* Trying for longest match, but couldn't or
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4454 * didn't match -- back up one char. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4455 if (--rst->count < rst->minval)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4456 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4457 if (rex.input == rex.line)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4458 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4459 /* backup to last char of previous line */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4460 --rex.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4461 rex.line = reg_getline(rex.lnum);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4462 /* Just in case regrepeat() didn't count
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4463 * right. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4464 if (rex.line == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4465 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4466 rex.input = rex.line + STRLEN(rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4467 fast_breakcheck();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4468 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4469 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4470 MB_PTR_BACK(rex.line, rex.input);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4471 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4472 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4473 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4474 /* Range is backwards, use shortest match first.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4475 * Careful: maxval and minval are exchanged!
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4476 * Couldn't or didn't match: try advancing one
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4477 * char. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4478 if (rst->count == rst->minval
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4479 || regrepeat(OPERAND(rp->rs_scan), 1L) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4480 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4481 ++rst->count;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4482 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4483 if (got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4484 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4485 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4486 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4487 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4488
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4489 /* If it could match, try it. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4490 if (rst->nextb == NUL || *rex.input == rst->nextb
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4491 || *rex.input == rst->nextb_ic)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4492 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4493 reg_save(&rp->rs_un.regsave, &backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4494 scan = regnext(rp->rs_scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4495 status = RA_CONT;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4496 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4497 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4498 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4499 if (status != RA_CONT)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4500 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4501 /* Failed. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4502 regstack_pop(&scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4503 regstack.ga_len -= sizeof(regstar_T);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4504 status = RA_NOMATCH;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4505 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4506 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4507 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4508 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4509
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4510 /* If we want to continue the inner loop or didn't pop a state
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4511 * continue matching loop */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4512 if (status == RA_CONT || rp == (regitem_T *)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4513 ((char *)regstack.ga_data + regstack.ga_len) - 1)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4514 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4515 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4516
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4517 /* May need to continue with the inner loop, starting at "scan". */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4518 if (status == RA_CONT)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4519 continue;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4520
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4521 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4522 * If the regstack is empty or something failed we are done.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4523 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4524 if (regstack.ga_len == 0 || status == RA_FAIL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4525 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4526 if (scan == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4527 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4528 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4529 * We get here only if there's trouble -- normally "case END" is
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4530 * the terminating point.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4531 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4532 emsg(_(e_re_corr));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4533 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4534 printf("Premature EOL\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4535 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4536 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4537 return (status == RA_MATCH);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4538 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4539
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4540 } /* End of loop until the regstack is empty. */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4541
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4542 /* NOTREACHED */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4543 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4544
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4545 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4546 * regtry - try match of "prog" with at rex.line["col"].
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4547 * Returns 0 for failure, number of lines contained in the match otherwise.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4548 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4549 static long
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4550 regtry(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4551 bt_regprog_T *prog,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4552 colnr_T col,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4553 proftime_T *tm, // timeout limit or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4554 int *timed_out) // flag set on timeout or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4555 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4556 rex.input = rex.line + col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4557 rex.need_clear_subexpr = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4558 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4559 // Clear the external match subpointers if necessary.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4560 rex.need_clear_zsubexpr = (prog->reghasz == REX_SET);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4561 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4562
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4563 if (regmatch(prog->program + 1, tm, timed_out) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4564 return 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4565
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4566 cleanup_subexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4567 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4568 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4569 if (rex.reg_startpos[0].lnum < 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4570 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4571 rex.reg_startpos[0].lnum = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4572 rex.reg_startpos[0].col = col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4573 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4574 if (rex.reg_endpos[0].lnum < 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4575 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4576 rex.reg_endpos[0].lnum = rex.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4577 rex.reg_endpos[0].col = (int)(rex.input - rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4578 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4579 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4580 // Use line number of "\ze".
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4581 rex.lnum = rex.reg_endpos[0].lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4582 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4583 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4584 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4585 if (rex.reg_startp[0] == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4586 rex.reg_startp[0] = rex.line + col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4587 if (rex.reg_endp[0] == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4588 rex.reg_endp[0] = rex.input;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4589 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4590 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4591 // Package any found \z(...\) matches for export. Default is none.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4592 unref_extmatch(re_extmatch_out);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4593 re_extmatch_out = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4594
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4595 if (prog->reghasz == REX_SET)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4596 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4597 int i;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4598
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4599 cleanup_zsubexpr();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4600 re_extmatch_out = make_extmatch();
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4601 for (i = 0; i < NSUBEXP; i++)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4602 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4603 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4604 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4605 // Only accept single line matches.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4606 if (reg_startzpos[i].lnum >= 0
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4607 && reg_endzpos[i].lnum == reg_startzpos[i].lnum
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4608 && reg_endzpos[i].col >= reg_startzpos[i].col)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4609 re_extmatch_out->matches[i] =
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4610 vim_strnsave(reg_getline(reg_startzpos[i].lnum)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4611 + reg_startzpos[i].col,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4612 reg_endzpos[i].col - reg_startzpos[i].col);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4613 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4614 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4615 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4616 if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4617 re_extmatch_out->matches[i] =
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4618 vim_strnsave(reg_startzp[i],
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4619 (int)(reg_endzp[i] - reg_startzp[i]));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4620 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4621 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4622 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4623 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4624 return 1 + rex.lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4625 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4626
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4627 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4628 * Match a regexp against a string ("line" points to the string) or multiple
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4629 * lines ("line" is NULL, use reg_getline()).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4630 * Returns 0 for failure, number of lines contained in the match otherwise.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4631 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4632 static long
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4633 bt_regexec_both(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4634 char_u *line,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4635 colnr_T col, // column to start looking for match
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4636 proftime_T *tm, // timeout limit or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4637 int *timed_out) // flag set on timeout or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4638 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4639 bt_regprog_T *prog;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4640 char_u *s;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4641 long retval = 0L;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4642
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4643 // Create "regstack" and "backpos" if they are not allocated yet.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4644 // We allocate *_INITIAL amount of bytes first and then set the grow size
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4645 // to much bigger value to avoid many malloc calls in case of deep regular
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4646 // expressions.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4647 if (regstack.ga_data == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4648 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4649 // Use an item size of 1 byte, since we push different things
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4650 // onto the regstack.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4651 ga_init2(&regstack, 1, REGSTACK_INITIAL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4652 (void)ga_grow(&regstack, REGSTACK_INITIAL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4653 regstack.ga_growsize = REGSTACK_INITIAL * 8;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4654 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4655
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4656 if (backpos.ga_data == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4657 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4658 ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4659 (void)ga_grow(&backpos, BACKPOS_INITIAL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4660 backpos.ga_growsize = BACKPOS_INITIAL * 8;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4661 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4662
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4663 if (REG_MULTI)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4664 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4665 prog = (bt_regprog_T *)rex.reg_mmatch->regprog;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4666 line = reg_getline((linenr_T)0);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4667 rex.reg_startpos = rex.reg_mmatch->startpos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4668 rex.reg_endpos = rex.reg_mmatch->endpos;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4669 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4670 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4671 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4672 prog = (bt_regprog_T *)rex.reg_match->regprog;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4673 rex.reg_startp = rex.reg_match->startp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4674 rex.reg_endp = rex.reg_match->endp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4675 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4676
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4677 // Be paranoid...
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4678 if (prog == NULL || line == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4679 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4680 emsg(_(e_null));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4681 goto theend;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4682 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4683
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4684 // Check validity of program.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4685 if (prog_magic_wrong())
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4686 goto theend;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4687
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4688 // If the start column is past the maximum column: no need to try.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4689 if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4690 goto theend;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4691
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4692 // If pattern contains "\c" or "\C": overrule value of rex.reg_ic
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4693 if (prog->regflags & RF_ICASE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4694 rex.reg_ic = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4695 else if (prog->regflags & RF_NOICASE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4696 rex.reg_ic = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4697
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4698 // If pattern contains "\Z" overrule value of rex.reg_icombine
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4699 if (prog->regflags & RF_ICOMBINE)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4700 rex.reg_icombine = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4701
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4702 // If there is a "must appear" string, look for it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4703 if (prog->regmust != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4704 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4705 int c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4706
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4707 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4708 c = (*mb_ptr2char)(prog->regmust);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4709 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4710 c = *prog->regmust;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4711 s = line + col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4712
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4713 // This is used very often, esp. for ":global". Use three versions of
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4714 // the loop to avoid overhead of conditions.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4715 if (!rex.reg_ic && !has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4716 while ((s = vim_strbyte(s, c)) != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4717 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4718 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4719 break; // Found it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4720 ++s;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4721 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4722 else if (!rex.reg_ic || (!enc_utf8 && mb_char2len(c) > 1))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4723 while ((s = vim_strchr(s, c)) != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4724 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4725 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4726 break; // Found it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4727 MB_PTR_ADV(s);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4728 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4729 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4730 while ((s = cstrchr(s, c)) != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4731 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4732 if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4733 break; // Found it.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4734 MB_PTR_ADV(s);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4735 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4736 if (s == NULL) // Not present.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4737 goto theend;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4738 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4739
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4740 rex.line = line;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4741 rex.lnum = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4742 reg_toolong = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4743
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4744 // Simplest case: Anchored match need be tried only once.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4745 if (prog->reganch)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4746 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4747 int c;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4748
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4749 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4750 c = (*mb_ptr2char)(rex.line + col);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4751 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4752 c = rex.line[col];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4753 if (prog->regstart == NUL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4754 || prog->regstart == c
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4755 || (rex.reg_ic
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4756 && (((enc_utf8 && utf_fold(prog->regstart) == utf_fold(c)))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4757 || (c < 255 && prog->regstart < 255 &&
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4758 MB_TOLOWER(prog->regstart) == MB_TOLOWER(c)))))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4759 retval = regtry(prog, col, tm, timed_out);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4760 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4761 retval = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4762 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4763 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4764 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4765 #ifdef FEAT_RELTIME
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4766 int tm_count = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4767 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4768 // Messy cases: unanchored match.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4769 while (!got_int)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4770 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4771 if (prog->regstart != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4772 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4773 // Skip until the char we know it must start with.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4774 // Used often, do some work to avoid call overhead.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4775 if (!rex.reg_ic && !has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4776 s = vim_strbyte(rex.line + col, prog->regstart);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4777 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4778 s = cstrchr(rex.line + col, prog->regstart);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4779 if (s == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4780 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4781 retval = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4782 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4783 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4784 col = (int)(s - rex.line);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4785 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4786
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4787 // Check for maximum column to try.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4788 if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4789 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4790 retval = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4791 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4792 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4793
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4794 retval = regtry(prog, col, tm, timed_out);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4795 if (retval > 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4796 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4797
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4798 // if not currently on the first line, get it again
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4799 if (rex.lnum != 0)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4800 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4801 rex.lnum = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4802 rex.line = reg_getline((linenr_T)0);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4803 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4804 if (rex.line[col] == NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4805 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4806 if (has_mbyte)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4807 col += (*mb_ptr2len)(rex.line + col);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4808 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4809 ++col;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4810 #ifdef FEAT_RELTIME
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4811 // Check for timeout once in a twenty times to avoid overhead.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4812 if (tm != NULL && ++tm_count == 20)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4813 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4814 tm_count = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4815 if (profile_passed_limit(tm))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4816 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4817 if (timed_out != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4818 *timed_out = TRUE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4819 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4820 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4821 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4822 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4823 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4824 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4825
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4826 theend:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4827 // Free "reg_tofree" when it's a bit big.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4828 // Free regstack and backpos if they are bigger than their initial size.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4829 if (reg_tofreelen > 400)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4830 VIM_CLEAR(reg_tofree);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4831 if (regstack.ga_maxlen > REGSTACK_INITIAL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4832 ga_clear(&regstack);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4833 if (backpos.ga_maxlen > BACKPOS_INITIAL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4834 ga_clear(&backpos);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4835
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4836 return retval;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4837 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4838
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4839 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4840 * Match a regexp against a string.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4841 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4842 * Uses curbuf for line count and 'iskeyword'.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4843 * if "line_lbr" is TRUE consider a "\n" in "line" to be a line break.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4844 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4845 * Returns 0 for failure, number of lines contained in the match otherwise.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4846 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4847 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4848 bt_regexec_nl(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4849 regmatch_T *rmp,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4850 char_u *line, // string to match against
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4851 colnr_T col, // column to start looking for match
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4852 int line_lbr)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4853 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4854 rex.reg_match = rmp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4855 rex.reg_mmatch = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4856 rex.reg_maxline = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4857 rex.reg_line_lbr = line_lbr;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4858 rex.reg_buf = curbuf;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4859 rex.reg_win = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4860 rex.reg_ic = rmp->rm_ic;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4861 rex.reg_icombine = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4862 rex.reg_maxcol = 0;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4863
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4864 return bt_regexec_both(line, col, NULL, NULL);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4865 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4866
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4867 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4868 * Match a regexp against multiple lines.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4869 * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4870 * Uses curbuf for line count and 'iskeyword'.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4871 *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4872 * Return zero if there is no match. Return number of lines contained in the
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4873 * match otherwise.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4874 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4875 static long
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4876 bt_regexec_multi(
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4877 regmmatch_T *rmp,
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4878 win_T *win, // window in which to search or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4879 buf_T *buf, // buffer in which to search
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4880 linenr_T lnum, // nr of line to start looking for match
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4881 colnr_T col, // column to start looking for match
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4882 proftime_T *tm, // timeout limit or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4883 int *timed_out) // flag set on timeout or NULL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4884 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4885 rex.reg_match = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4886 rex.reg_mmatch = rmp;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4887 rex.reg_buf = buf;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4888 rex.reg_win = win;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4889 rex.reg_firstlnum = lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4890 rex.reg_maxline = rex.reg_buf->b_ml.ml_line_count - lnum;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4891 rex.reg_line_lbr = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4892 rex.reg_ic = rmp->rmm_ic;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4893 rex.reg_icombine = FALSE;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4894 rex.reg_maxcol = rmp->rmm_maxcol;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4895
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4896 return bt_regexec_both(NULL, col, tm, timed_out);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4897 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4898
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4899 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4900 * Compare a number with the operand of RE_LNUM, RE_COL or RE_VCOL.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4901 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4902 static int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4903 re_num_cmp(long_u val, char_u *scan)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4904 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4905 long_u n = OPERAND_MIN(scan);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4906
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4907 if (OPERAND_CMP(scan) == '>')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4908 return val > n;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4909 if (OPERAND_CMP(scan) == '<')
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4910 return val < n;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4911 return val == n;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4912 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4913
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4914 #ifdef BT_REGEXP_DUMP
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4915
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4916 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4917 * regdump - dump a regexp onto stdout in vaguely comprehensible form
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4918 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4919 static void
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4920 regdump(char_u *pattern, bt_regprog_T *r)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4921 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4922 char_u *s;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4923 int op = EXACTLY; // Arbitrary non-END op.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4924 char_u *next;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4925 char_u *end = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4926 FILE *f;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4927
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4928 #ifdef BT_REGEXP_LOG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4929 f = fopen("bt_regexp_log.log", "a");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4930 #else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4931 f = stdout;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4932 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4933 if (f == NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4934 return;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4935 fprintf(f, "-------------------------------------\n\r\nregcomp(%s):\r\n", pattern);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4936
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4937 s = r->program + 1;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4938 // Loop until we find the END that isn't before a referred next (an END
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4939 // can also appear in a NOMATCH operand).
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4940 while (op != END || s <= end)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4941 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4942 op = OP(s);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4943 fprintf(f, "%2d%s", (int)(s - r->program), regprop(s)); // Where, what.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4944 next = regnext(s);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4945 if (next == NULL) // Next ptr.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4946 fprintf(f, "(0)");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4947 else
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4948 fprintf(f, "(%d)", (int)((s - r->program) + (next - s)));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4949 if (end < next)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4950 end = next;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4951 if (op == BRACE_LIMITS)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4952 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4953 // Two ints
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4954 fprintf(f, " minval %ld, maxval %ld", OPERAND_MIN(s), OPERAND_MAX(s));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4955 s += 8;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4956 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4957 else if (op == BEHIND || op == NOBEHIND)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4958 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4959 // one int
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4960 fprintf(f, " count %ld", OPERAND_MIN(s));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4961 s += 4;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4962 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4963 else if (op == RE_LNUM || op == RE_COL || op == RE_VCOL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4964 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4965 // one int plus comparator
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4966 fprintf(f, " count %ld", OPERAND_MIN(s));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4967 s += 5;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4968 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4969 s += 3;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4970 if (op == ANYOF || op == ANYOF + ADD_NL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4971 || op == ANYBUT || op == ANYBUT + ADD_NL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4972 || op == EXACTLY)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4973 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4974 // Literal string, where present.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4975 fprintf(f, "\nxxxxxxxxx\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4976 while (*s != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4977 fprintf(f, "%c", *s++);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4978 fprintf(f, "\nxxxxxxxxx\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4979 s++;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4980 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4981 fprintf(f, "\r\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4982 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4983
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4984 // Header fields of interest.
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4985 if (r->regstart != NUL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4986 fprintf(f, "start `%s' 0x%x; ", r->regstart < 256
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4987 ? (char *)transchar(r->regstart)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4988 : "multibyte", r->regstart);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4989 if (r->reganch)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4990 fprintf(f, "anchored; ");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4991 if (r->regmust != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4992 fprintf(f, "must have \"%s\"", r->regmust);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4993 fprintf(f, "\r\n");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4994
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4995 #ifdef BT_REGEXP_LOG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4996 fclose(f);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4997 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4998 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4999 #endif // BT_REGEXP_DUMP
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5000
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5001 #ifdef DEBUG
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5002 /*
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5003 * regprop - printable representation of opcode
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5004 */
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5005 static char_u *
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5006 regprop(char_u *op)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5007 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5008 char *p;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5009 static char buf[50];
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5010
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5011 STRCPY(buf, ":");
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5012
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5013 switch ((int) OP(op))
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5014 {
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5015 case BOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5016 p = "BOL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5017 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5018 case EOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5019 p = "EOL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5020 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5021 case RE_BOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5022 p = "BOF";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5023 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5024 case RE_EOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5025 p = "EOF";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5026 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5027 case CURSOR:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5028 p = "CURSOR";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5029 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5030 case RE_VISUAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5031 p = "RE_VISUAL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5032 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5033 case RE_LNUM:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5034 p = "RE_LNUM";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5035 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5036 case RE_MARK:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5037 p = "RE_MARK";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5038 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5039 case RE_COL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5040 p = "RE_COL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5041 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5042 case RE_VCOL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5043 p = "RE_VCOL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5044 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5045 case BOW:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5046 p = "BOW";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5047 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5048 case EOW:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5049 p = "EOW";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5050 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5051 case ANY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5052 p = "ANY";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5053 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5054 case ANY + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5055 p = "ANY+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5056 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5057 case ANYOF:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5058 p = "ANYOF";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5059 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5060 case ANYOF + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5061 p = "ANYOF+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5062 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5063 case ANYBUT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5064 p = "ANYBUT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5065 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5066 case ANYBUT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5067 p = "ANYBUT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5068 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5069 case IDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5070 p = "IDENT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5071 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5072 case IDENT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5073 p = "IDENT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5074 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5075 case SIDENT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5076 p = "SIDENT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5077 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5078 case SIDENT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5079 p = "SIDENT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5080 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5081 case KWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5082 p = "KWORD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5083 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5084 case KWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5085 p = "KWORD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5086 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5087 case SKWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5088 p = "SKWORD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5089 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5090 case SKWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5091 p = "SKWORD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5092 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5093 case FNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5094 p = "FNAME";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5095 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5096 case FNAME + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5097 p = "FNAME+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5098 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5099 case SFNAME:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5100 p = "SFNAME";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5101 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5102 case SFNAME + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5103 p = "SFNAME+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5104 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5105 case PRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5106 p = "PRINT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5107 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5108 case PRINT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5109 p = "PRINT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5110 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5111 case SPRINT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5112 p = "SPRINT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5113 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5114 case SPRINT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5115 p = "SPRINT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5116 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5117 case WHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5118 p = "WHITE";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5119 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5120 case WHITE + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5121 p = "WHITE+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5122 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5123 case NWHITE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5124 p = "NWHITE";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5125 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5126 case NWHITE + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5127 p = "NWHITE+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5128 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5129 case DIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5130 p = "DIGIT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5131 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5132 case DIGIT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5133 p = "DIGIT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5134 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5135 case NDIGIT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5136 p = "NDIGIT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5137 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5138 case NDIGIT + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5139 p = "NDIGIT+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5140 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5141 case HEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5142 p = "HEX";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5143 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5144 case HEX + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5145 p = "HEX+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5146 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5147 case NHEX:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5148 p = "NHEX";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5149 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5150 case NHEX + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5151 p = "NHEX+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5152 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5153 case OCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5154 p = "OCTAL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5155 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5156 case OCTAL + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5157 p = "OCTAL+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5158 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5159 case NOCTAL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5160 p = "NOCTAL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5161 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5162 case NOCTAL + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5163 p = "NOCTAL+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5164 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5165 case WORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5166 p = "WORD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5167 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5168 case WORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5169 p = "WORD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5170 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5171 case NWORD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5172 p = "NWORD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5173 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5174 case NWORD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5175 p = "NWORD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5176 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5177 case HEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5178 p = "HEAD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5179 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5180 case HEAD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5181 p = "HEAD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5182 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5183 case NHEAD:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5184 p = "NHEAD";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5185 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5186 case NHEAD + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5187 p = "NHEAD+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5188 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5189 case ALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5190 p = "ALPHA";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5191 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5192 case ALPHA + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5193 p = "ALPHA+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5194 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5195 case NALPHA:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5196 p = "NALPHA";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5197 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5198 case NALPHA + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5199 p = "NALPHA+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5200 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5201 case LOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5202 p = "LOWER";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5203 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5204 case LOWER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5205 p = "LOWER+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5206 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5207 case NLOWER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5208 p = "NLOWER";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5209 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5210 case NLOWER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5211 p = "NLOWER+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5212 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5213 case UPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5214 p = "UPPER";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5215 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5216 case UPPER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5217 p = "UPPER+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5218 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5219 case NUPPER:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5220 p = "NUPPER";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5221 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5222 case NUPPER + ADD_NL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5223 p = "NUPPER+NL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5224 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5225 case BRANCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5226 p = "BRANCH";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5227 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5228 case EXACTLY:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5229 p = "EXACTLY";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5230 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5231 case NOTHING:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5232 p = "NOTHING";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5233 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5234 case BACK:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5235 p = "BACK";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5236 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5237 case END:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5238 p = "END";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5239 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5240 case MOPEN + 0:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5241 p = "MATCH START";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5242 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5243 case MOPEN + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5244 case MOPEN + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5245 case MOPEN + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5246 case MOPEN + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5247 case MOPEN + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5248 case MOPEN + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5249 case MOPEN + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5250 case MOPEN + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5251 case MOPEN + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5252 sprintf(buf + STRLEN(buf), "MOPEN%d", OP(op) - MOPEN);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5253 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5254 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5255 case MCLOSE + 0:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5256 p = "MATCH END";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5257 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5258 case MCLOSE + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5259 case MCLOSE + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5260 case MCLOSE + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5261 case MCLOSE + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5262 case MCLOSE + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5263 case MCLOSE + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5264 case MCLOSE + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5265 case MCLOSE + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5266 case MCLOSE + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5267 sprintf(buf + STRLEN(buf), "MCLOSE%d", OP(op) - MCLOSE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5268 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5269 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5270 case BACKREF + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5271 case BACKREF + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5272 case BACKREF + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5273 case BACKREF + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5274 case BACKREF + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5275 case BACKREF + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5276 case BACKREF + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5277 case BACKREF + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5278 case BACKREF + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5279 sprintf(buf + STRLEN(buf), "BACKREF%d", OP(op) - BACKREF);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5280 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5281 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5282 case NOPEN:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5283 p = "NOPEN";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5284 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5285 case NCLOSE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5286 p = "NCLOSE";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5287 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5288 #ifdef FEAT_SYN_HL
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5289 case ZOPEN + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5290 case ZOPEN + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5291 case ZOPEN + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5292 case ZOPEN + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5293 case ZOPEN + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5294 case ZOPEN + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5295 case ZOPEN + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5296 case ZOPEN + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5297 case ZOPEN + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5298 sprintf(buf + STRLEN(buf), "ZOPEN%d", OP(op) - ZOPEN);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5299 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5300 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5301 case ZCLOSE + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5302 case ZCLOSE + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5303 case ZCLOSE + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5304 case ZCLOSE + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5305 case ZCLOSE + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5306 case ZCLOSE + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5307 case ZCLOSE + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5308 case ZCLOSE + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5309 case ZCLOSE + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5310 sprintf(buf + STRLEN(buf), "ZCLOSE%d", OP(op) - ZCLOSE);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5311 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5312 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5313 case ZREF + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5314 case ZREF + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5315 case ZREF + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5316 case ZREF + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5317 case ZREF + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5318 case ZREF + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5319 case ZREF + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5320 case ZREF + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5321 case ZREF + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5322 sprintf(buf + STRLEN(buf), "ZREF%d", OP(op) - ZREF);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5323 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5324 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5325 #endif
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5326 case STAR:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5327 p = "STAR";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5328 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5329 case PLUS:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5330 p = "PLUS";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5331 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5332 case NOMATCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5333 p = "NOMATCH";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5334 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5335 case MATCH:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5336 p = "MATCH";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5337 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5338 case BEHIND:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5339 p = "BEHIND";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5340 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5341 case NOBEHIND:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5342 p = "NOBEHIND";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5343 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5344 case SUBPAT:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5345 p = "SUBPAT";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5346 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5347 case BRACE_LIMITS:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5348 p = "BRACE_LIMITS";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5349 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5350 case BRACE_SIMPLE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5351 p = "BRACE_SIMPLE";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5352 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5353 case BRACE_COMPLEX + 0:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5354 case BRACE_COMPLEX + 1:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5355 case BRACE_COMPLEX + 2:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5356 case BRACE_COMPLEX + 3:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5357 case BRACE_COMPLEX + 4:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5358 case BRACE_COMPLEX + 5:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5359 case BRACE_COMPLEX + 6:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5360 case BRACE_COMPLEX + 7:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5361 case BRACE_COMPLEX + 8:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5362 case BRACE_COMPLEX + 9:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5363 sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5364 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5365 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5366 case MULTIBYTECODE:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5367 p = "MULTIBYTECODE";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5368 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5369 case NEWL:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5370 p = "NEWL";
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5371 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5372 default:
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5373 sprintf(buf + STRLEN(buf), "corrupt %d", OP(op));
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5374 p = NULL;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5375 break;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5376 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5377 if (p != NULL)
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5378 STRCAT(buf, p);
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5379 return (char_u *)buf;
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5380 }
68fd5296bf73 patch 8.1.2005: the regexp.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5381 #endif // DEBUG